Kubernetes入门指南
让我们开始使用 K8s
以下命令很有用,但您应该小心不要删除任何重要内容
结论
在我的文章“Docker for Dummies”收到大量积极反馈后,我想写一篇关于 Docker 中经常被搭配使用的技术 Kubernetes 的文章。如果您还没有读过《Docker for Dummies》,请点击此处阅读;如果您已经熟悉 Kubernetes,可以考虑阅读我关于OpenShift 的文章。理解像 Docker 这样的容器服务是掌握 Kubernetes 的基础。事实上,Kubernetes 能够管理其他容器运行时,本文不会涉及这些内容。在这篇文章中,我将解释什么是 Kubernetes,它用容器解决了哪些问题,以及如何立即开始使用它。
Kubernetes 简介
Kubernetes 源于希腊语 κυβερνήτης (kubernḗtēs),意为“领航员”或“舵手”。Kubernetes 的标志形似船舵,进一步强化了“驾驶”或“管理”的概念,而这正是 Kubernetes 对 Docker 容器的用途。Kubernetes 以多种方式管理 Docker 容器,因此无需手动操作。为了方便起见,Kubernetes 通常简称为 K8s,因为“K”和“s”之间有 8 个字母。从现在开始,我将 Kubernetes 简称为 K8s。
使用 K8s 进一步将机器、存储和网络从其物理实现中抽象出来。正如上一篇文章所述,手动管理大量容器可能会产生与管理虚拟机类似的问题。然而,管理容器尤为重要,因为云公司会向您收取计算时间和存储等费用。您肯定不希望许多正在运行的容器因此而无所事事。此外,您也不希望某个容器承担其自身无法处理的网络负载。K8s 的设计初衷就是解决这些问题。
K8s提供什么服务?
- 服务发现和负载平衡: K8s 可以使用 DNS 名称或 IP 地址定位容器,并可以将网络流量分发到其他容器以稳定部署。
- 存储编排:您可以自动安装您选择的存储系统,无论是本地存储系统、AWS 或 GCP 等云提供商存储系统,还是 NFS iSCSI、Gluster、Ceph、Cinder 或 Flocker 等网络存储系统。
- 自动发布和回滚:您可以定义已部署容器的期望状态,并以可控的速率更改状态。例如,您可以自动化 Kubernetes 为您的部署创建新容器、移除现有容器并将其所有资源迁移到新容器。
- 自动装箱:您可以为 K8s 提供一个节点集群来运行容器化任务,并指定每个容器所需的 CPU 和内存容量。Kubernetes 可以自动将容器部署到节点上,以充分利用资源。
- 自我修复: K8s 重新启动发生故障的容器、替换容器、杀死不响应用户定义的健康检查的容器,并且在它们准备好提供服务之前不会将它们公布给客户端。
- 机密和配置管理: K8s 允许您存储敏感信息,例如 SSH 密钥、OAuth 令牌和密码。您可以更新这些机密和应用配置,而无需重建容器镜像,也不会在堆栈配置中暴露机密。
在这篇文章中,我们只会对这些功能进行简单的介绍。
一些定义
理解这些基本的 K8s 概念非常重要。同样,在继续之前,你也应该熟悉Docker等容器服务。
Pod是由一个或多个容器组成的组。Pod 拥有共享的存储和网络资源,这些资源定义了容器的运行方式。它们是您可以使用 Kubernetes 创建和管理的最小可部署计算单元。Pod作为逻辑单元在节点上共同运行,因此它们共享相同的 IP 地址,但可以通过 localhost 相互访问。Pod 还可以共享存储,但不必在同一台机器上运行,因为容器可以跨多台机器。
节点是指非由 K8s 创建的物理机或虚拟机。通常,集群中会有多个节点,但在学习或资源有限的环境中可能只有一个节点。节点可以手动创建,也可以使用 AWS EC2 或 OpenStack 等公有云服务创建,因此在使用 K8s 部署应用程序之前,您需要搭建基本的基础设施。在此基础上,您可以定义虚拟网络、存储等。一个节点可以运行多个 Pod。
Deployment是一组 Pod。Deployment 确保同时运行足够数量的 Pod 来为应用提供服务。Deployment 还可以通过查看 CPU 利用率等指标来关闭不需要的 Pod。
让我们开始使用 K8s
要在本地运行 K8s,我将使用 Minikube 和 Kubectl。您可以在https://minikube.sigs.k8s.io/docs/start/安装最新版本的 Minikube,并在https://kubernetes.io/docs/tasks/tools/安装 Kubectl。
请注意,您还必须安装 Docker 才能继续本教程。
1)安装先决条件
使用docker --version
和minikube version
并且kubectl version
不要担心指出与 localhost:8080 的连接被拒绝的消息,我们稍后会解决这个问题。
2)使用 Minikube 创建节点
要创建节点,请启动 Minikube。例如,启动包含 2 个节点的 Minikube:minikube start --nodes=2
第一次运行会比较慢,所以请耐心等待。我第一次运行的时候,大概花了5-10分钟就完成了。
我们可以使用以下方法检查节点的状态minikube status
第一个节点是主节点。您可以看到它已配置控制平面、运行主机、kubelet、API 和 kubeconfig。第二个节点是工作节点。
我们可以看到,如果我们运行,我们有 2 个容器正在运行: 此图显示主节点为 ce3359246578,工作节点为 44697ff120e4,并包含两个节点的相关信息。docker ps
我们可以使用以下方法查看我们的节点:kubectl get nodes
通过运行kubectl get pods -A
,我们可以检索所有命名空间中的所有 Pod。 所有这些 Pod 构成了控制平面。例如,kube-apiserver-minikube 是用于外部和内部通信的 API。因此,当我们输入 kubectl 时,这就是处理该请求的 API 服务器。
3)创建部署
我们可以通过输入来检查 Pod kubectl get pod
。此时,你应该没有任何 Pod,并且它会显示“在默认命名空间中未找到资源”。
Pod 是 K8s 集群的最小单元,但实际上,您创建的不是 Pod,而是部署。要创建 Kubernetes 部署,用法如下kubectl create deployment <NAME> --image=<image>
。对于此特定部署,我们将创建一个 nginx 部署:kubectl create deployment nginx-depl --image=nginx
对于那些不知道的人来说,NGINX 是一个用于开发服务器端应用程序的开源网络服务器。
现在我们运行时kubectl get deployment
会kubectl get pod
得到以下输出。
我们采用kubectl create deployment <NAME> --image=<image>
最简化的方式来创建 Deployment。其余部分使用默认配置。在 Deployment 和 Pod 之间还有一层,由 K8s Deployment 自动管理,称为ReplicaSet。
ReplicaSet 指定了如何识别其可获取的 Pod、指示其应维护的 Pod 数量的副本数,以及一个 Pod 模板,该模板指定了为满足副本数标准而应创建的新 Pod 的数据。ReplicaSet 随后会根据需要创建和删除 Pod,以达到所需的数量,从而实现其目标。当 ReplicaSet 需要创建新的 Pod 时,它会使用其 Pod 模板。
我们可以使用以下命令查看 ReplicaSet。 我们可以看到 ReplicaSet 的 ID 附加在部署名称后面:5c8bf76b5b。您可能会注意到,ReplicaSet ID 包含在 Pod 的 ID 中;如前所述,ReplicaSet 是位于 Deployment 和 Pod 之间的一层。kubectl get replicaset
总而言之,这就是抽象层的工作方式。Deployment 管理 ReplicaSet,ReplicaSet 管理 Pod 的所有副本,而 Pod 是容器的抽象。
4)编辑部署
使用以下命令编辑您的部署:kubectl edit deployment nginx-depl
这将显示自动生成的配置文件。不用担心,您现在不需要了解配置文件中的所有内容。为了方便本教程,我们将仅编辑位于文件中间某处的镜像版本。 完成编辑后,输入 :wq 进行写入并退出。这将终止旧镜像并创建新镜像。 调用 后,我们可以看到旧镜像中没有任何 Pod,并且还创建了一个新镜像。kubectl get replicaset
5)调试 Pod
另一个有用的命令是kubectl logs <Pod Name>
。
如果你在 nginx 上运行这个命令,你将什么也得不到,因为 nginx 没有记录任何内容。为了演示日志,我们可以使用 MongoDB,它是一个文档数据库。
kubectl create deployment mongo-depl --image=mongo
执行kubectl logs mongo-depl-5fd6b7d4b4-vbf2t
将产生简洁的日志并kubectl describe pod mongo-depl-5fd6b7d4b4-vbf2t
产生更详细的输出。
如果出现问题,日志记录将有助于调试,而描述会产生更易于理解的内容。
另一个可以查看 Pod 内部情况的有用命令是kubectl exec -it <Pod Name> -- bin/bash
. (-它代表交互式终端)
假设我们想用这个命令进入我们的 MongoDB Pod:,kubectl exec -it mongo-depl-5fd6b7d4b4-vbf2t --bin/bash
输入 ,ls
我们就可以看到我们的目录。要退出,只需输入exit
。
6)删除部署
删除 Deployment 将会删除其内部的所有 Pod。例如,要删除 MongoDB Deployment,请输入:kubectl delete deployment mongo-depl
以下命令很有用,但您应该小心不要删除任何重要内容
您可以使用以下命令删除单个命名空间中的所有 pod:
kubectl delete --all pods --namespace=foo
您还可以删除命名空间中的所有部署,这将删除与命名空间对应的部署关联的所有 pod
kubectl delete --all deployments --namespace=foo
您可以使用以下命令删除所有命名空间和每个命名空间中的每个对象(但不是非命名空间的对象,如节点和某些事件):
kubectl delete --all namespaces
但是,后一个命令可能不是您想要执行的,因为它将删除 kube-system 命名空间中的内容,这将使您的集群无法使用。
此命令将删除除 kube-system 之外的所有命名空间,这可能会有用:
for each in $(kubectl get ns -o jsonpath="{.items[*].metadata.name}" | grep -v kube-system);
do
kubectl delete ns $each
done
7)应用配置文件
要应用配置文件,我们必须先创建一个。在您可以参考的目录中,为 nginx 部署创建一个配置文件。
touch nginx-deployment.yaml
接下来,将此配置复制并粘贴到文件中:
apiVersion:apps/v1
kind:Deployment
metadata:
name:myapp
标签:
app:nginx
spec:
replicas:1
selector:
matchLabels:
app:nginx
template:
metadata:
labels:
app:nginx
spec:
containers:
-name:nginx
image:nginx:1.16
ports:
-containerPort:80
template 下的所有内容都是 Pod 的蓝图。第一个 spec 标签是 Deployment 的规范,第二个 spec 标签是 Pod 的规范。
这个配置文件基本上表明我们希望 pod 内有一个带有 NGINX 镜像的容器,并且我们将把它绑定在端口 80 上。
当我们使用时kubectl apply -f nginx-deployment.yaml
,它会使用配置创建一个部署。假设我们在配置文件中将部署更改为创建 4 个副本而不是 1 个。
输入后kubectl get pod
我们kubectl get deployment
得到以下输出:
如您所见,K8s 知道何时创建或更新部署。
结论
通过阅读本文,您应该能够很好地理解 Kubernetes 的基础知识。总而言之,我们了解了 Kubernetes 是什么以及它在高层次上可以做什么。我们了解了 K8s 提供的服务以及一些重要的定义。然后,我们使用 Docker、Minikube 和 Kubectl 探索了 Deployment 的 CRUD 命令。最后,我们学习了如何调试 Pod 以及如何使用 Deployment 的配置文件。值得一提的是,您还可以使用 kubectl 来管理服务、卷以及任何其他 K8s 组件。
最后的想法
希望你喜欢接下来的内容,也希望你有所收获!Kubernetes 是一款非常实用的容器管理工具,很高兴你读到这里。你也可以在https://kubernetes.io/docs/home/找到更详尽的文档。
如果您希望我以后进一步完善这节课,或者您有任何疑问,或者我遗漏了什么,请告诉我。我非常重视您的反馈,所以请给我留言!
附言:
我目前正在寻找 DevOps 方面的工作!如果您认识招聘入门级 DevOps 工程师的人,请将我的简历发给他们,我的简历可以在https://smcgown.com和https://www.linkedin.com/in/steven-mcgown/找到。
谢谢你!
文章来源:https://dev.to/stevenmcgown/kubernetes-for-dummies-5hmh