k8s运行容器之deployment(三)

网友投稿 697 2023-03-07

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

k8s运行容器之deployment(三)

deployment

我们已经知道k8s是通过各种controller来管理pod的生命周期。为了满足不同业务场景,k8s开发了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等多种 Controller。我们首先学习最常用的 Deployment。

运行一个deployment

下面详细分析 Kubernetes 都做了些什么工作。

接下来我们用 kubectl describe deployment 了解更详细的信息。

两个副本已经就绪,用 kubectl describe replicaset 查看详细信息:

两个副本 Pod 都处于 Running 状态,用 kubectl describe pod 查看更详细的信息:

总结一下这个过程:

用户通过 kubectl 创建 Deployment。

Deployment 创建 ReplicaSet。

ReplicaSet 创建 Pod

也可以看出,对象的命名方式是:子对象的名字 = 父对象名字 + 随机字符串或数字。

命令vs配置文件

k8s支持两种创建资源的方式:

1.用 kubectl 命令直接创建,比如:

kubectl run nginx-deployment –image=nginx:1.7.9 –replicas=2

在命令行中通过参数指定资源的属性。

2. 通过配置文件和 kubectl apply 创建,要完成前面同样的工作,可执行命令:

kubectl apply -f nginx.yml

nginx.yml 的内容为:

资源的属性写在配置文件中,文件格式为 YAML。

下面对这两种方式进行比较。

基于命令的方式:

简单直观快捷,上手快。

适合临时测试或实验。

基于配置文件的方式:

配置文件描述了 What,即应用最终要达到的状态。

配置文件提供了创建资源的模板,能够重复部署。

可以像管理代码一样管理部署。

适合正式的、跨环境的、规模化部署。

这种方式要求熟悉配置文件的语法,有一定难度。

后面我们都将采用配置文件的方式,大家需要尽快熟悉和掌握。

kubectl apply 不但能够创建 Kubernetes 资源,也能对资源进行更新,非常方便。不过 Kubernets 还提供了几个类似的命令,例如 kubectl create、kubectl replace、kubectl edit 和 kubectl patch。

为避免造成不必要的困扰,我们会尽量只使用 kubectl apply,

此命令已经能够应对超过 90% 的场景,事半功倍。

deployment yaml

既然要用 YAML 配置文件部署应用,现在就很有必要了解一下 Deployment 的配置格式,其他 Controller(比如 DaemonSet)非常类似。

① apiVersion 是当前配置格式的版本。

先执行kubectl api-resources找到所有的资源

在执行命令 kubectl explain deploy即可获取到版本和类型信息

② kind 是要创建的资源类型,这里是 Deployment。

③ metadata 是该资源的元数据,name 是必需的元数据项。

④ spec 部分是该 Deployment 的规格说明。

⑤ replicas 指明副本数量,默认为 1。

⑥ template 定义 Pod 的模板,这是配置文件的重要部分。

⑦ metadata 定义 Pod 的元数据,至少要定义一个 label。label 的 key 和 value 可以任意指定。

⑧ spec 描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name 和 image 是必需的。

注意:最后name前面加个横线是因为container后面是一个列表

此 nginx.yml 是一个最简单的 Deployment 配置文件,后面我们学习 Kubernetes 各项功能时会逐步丰富这个文件。

执行 kubectl apply -f nginx.yml:

[root@ken ~]# kubectl apply -f nginx.ymldeployment.extensions/nginx-deployment created

[root@ken ~]# kubectl apply -f nginx.ymldeployment.extensions/nginx-deployment created

查看nginx-deployment各种资源

Deployment、ReplicaSet、Pod 都已经就绪。如果要删除这些资源,执行 kubectl delete deployment nginx-deployment 或者 kubectl delete -f nginx.yml (编写的nginx.yml文件不会被删除)。

[root@ken ~]# kubectl delete -f nginx.ymldeployment.extensions "nginx-deployment" deleted

[root@ken ~]# kubectl delete -f nginx.ymldeployment.extensions "nginx-deployment" deleted

Scale Up/Down

伸缩(Scale Up/Down)是指在线增加或减少 Pod 的副本数。

Deployment nginx-deployment 初始是两个副本。

[root@ken ~]# kubectl apply -f nginx.yml[root@ken ~]# kubectl get pod -o wideNAME                                READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATESnginx-deployment-65998d8886-5b5rc   1/1     Running   0          84s   10.244.1.5   host1   <none>           <none>nginx-deployment-65998d8886-tnpcx   1/1     Running   0          84s   10.244.2.5   host2   <none>           <none>

[root@ken ~]# kubectl apply -f nginx.yml[root@ken ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-65998d8886-5b5rc 1/1 Running 0 84s 10.244.1.5 host1 nginx-deployment-65998d8886-tnpcx 1/1 Running 0 84s 10.244.2.5 host2

k8s-node1 和 k8s-node2 上各跑了一个副本。现在修改 nginx.yml,将副本改成 5 个。

再次执行kubectl apply

[root@ken ~]# kubectl apply -f nginx.ymldeployment.extensions/nginx-deployment configured

[root@ken ~]# kubectl apply -f nginx.ymldeployment.extensions/nginx-deployment configured

查看pod

[root@ken ~]# kubectl get pod -o wideNAME                                READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATESnginx-deployment-65998d8886-4hfgp   1/1     Running   0          3m      10.244.1.7   host1   <none>           <none>nginx-deployment-65998d8886-5b5rc   1/1     Running   0          5m48s   10.244.1.5   host1   <none>           <none>nginx-deployment-65998d8886-btrsq   1/1     Running   0          3m      10.244.2.6   host2   <none>           <none>nginx-deployment-65998d8886-tnpcx   1/1     Running   0          5m48s   10.244.2.5   host2   <none>           <none>nginx-deployment-65998d8886-x4pbd   1/1     Running   0          3m      10.244.1.6   host1   <none>           <none>

[root@ken ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-65998d8886-4hfgp 1/1 Running 0 3m 10.244.1.7 host1 nginx-deployment-65998d8886-5b5rc 1/1 Running 0 5m48s 10.244.1.5 host1 nginx-deployment-65998d8886-btrsq 1/1 Running 0 3m 10.244.2.6 host2 nginx-deployment-65998d8886-tnpcx 1/1 Running 0 5m48s 10.244.2.5 host2 nginx-deployment-65998d8886-x4pbd 1/1 Running 0 3m 10.244.1.6 host1

三个新副本被创建并调度到 k8s-node1 和 k8s-node2 上。

接下来修改配置文件,将副本数减少为 3 个,重新执行 kubectl apply:

[root@ken ~]# kubectl apply -f nginx.ymldeployment.extensions/nginx-deployment configured[root@ken ~]# kubectl get pod -o wideNAME                                READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATESnginx-deployment-65998d8886-5b5rc   1/1     Running   0          7m6s    10.244.1.5   host1   <none>           <none>nginx-deployment-65998d8886-btrsq   1/1     Running   0          4m18s   10.244.2.6   host2   <none>           <none>nginx-deployment-65998d8886-tnpcx   1/1     Running   0          7m6s    10.244.2.5   host2   <none>           <none>

[root@ken ~]# kubectl apply -f nginx.ymldeployment.extensions/nginx-deployment configured[root@ken ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-65998d8886-5b5rc 1/1 Running 0 7m6s 10.244.1.5 host1 nginx-deployment-65998d8886-btrsq 1/1 Running 0 4m18s 10.244.2.6 host2 nginx-deployment-65998d8886-tnpcx 1/1 Running 0 7m6s 10.244.2.5 host2

可以看到两个副本被删除,最终保留了 3 个副本。

模拟故障

上面我们有 3 个 nginx 副本分别运行在 k8s-node1 和 k8s-node2 上。现在模拟 k8s-node2 故障,关闭该节点(poweroff)。

首先查看节点

[root@ken ~]# kubectl get nodeNAME    STATUS     ROLES    AGE     VERSIONhost1   Ready      <none>   5h25m   v1.13.2host2   NotReady   <none>   5h43m   v1.13.2ken     Ready      master   6h18m   v1.13.2

[root@ken ~]# kubectl get nodeNAME STATUS ROLES AGE VERSIONhost1 Ready 5h25m v1.13.2host2 NotReady 5h43m v1.13.2ken Ready master 6h18m v1.13.2

发现host2状态为NotReady

等待一段时间,Kubernetes 会检查到 k8s-node2 不可用,将 k8s-node2 上的 Pod 标记为  Terminating状态,并在 k8s-node1 上新创建两个 Pod,维持总副本数为 3。

[root@ken ~]# kubectl get pod -o wideNAME                                READY   STATUS        RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATESnginx-deployment-65998d8886-5b5rc   1/1     Running       0          16m   10.244.1.5   host1   <none>           <none>nginx-deployment-65998d8886-8647d   1/1     Running       0          79s   10.244.1.8   host1   <none>           <none>nginx-deployment-65998d8886-btrsq   1/1     Terminating   0          13m   10.244.2.6   host2   <none>           <none>nginx-deployment-65998d8886-qp6jj   1/1     Running       0          79s   10.244.1.9   host1   <none>           <none>nginx-deployment-65998d8886-tnpcx   1/1     Terminating   0          16m   10.244.2.5   host2   <none>           <none>

[root@ken ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-65998d8886-5b5rc 1/1 Running 0 16m 10.244.1.5 host1 nginx-deployment-65998d8886-8647d 1/1 Running 0 79s 10.244.1.8 host1 nginx-deployment-65998d8886-btrsq 1/1 Terminating 0 13m 10.244.2.6 host2 nginx-deployment-65998d8886-qp6jj 1/1 Running 0 79s 10.244.1.9 host1 nginx-deployment-65998d8886-tnpcx 1/1 Terminating 0 16m 10.244.2.5 host2

当 k8s-node2 恢复后, Terminating的 Pod 会被删除,不过已经运行的 Pod 不会重新调度回 k8s-node2。

[root@ken ~]# kubectl get nodeNAME    STATUS   ROLES    AGE     VERSIONhost1   Ready    <none>   5h33m   v1.13.2host2   Ready    <none>   5h51m   v1.13.2ken     Ready    master   6h26m   v1.13.2[root@ken ~]# kubectl get pod -o wideNAME                                READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATESnginx-deployment-65998d8886-5b5rc   1/1     Running   0          19m     10.244.1.5   host1   <none>           <none>nginx-deployment-65998d8886-8647d   1/1     Running   0          4m33s   10.244.1.8   host1   <none>           <none>nginx-deployment-65998d8886-qp6jj   1/1     Running   0          4m33s   10.244.1.9   host1   <none>           <none>

[root@ken ~]# kubectl get nodeNAME STATUS ROLES AGE VERSIONhost1 Ready 5h33m v1.13.2host2 Ready 5h51m v1.13.2ken Ready master 6h26m v1.13.2[root@ken ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-65998d8886-5b5rc 1/1 Running 0 19m 10.244.1.5 host1 nginx-deployment-65998d8886-8647d 1/1 Running 0 4m33s 10.244.1.8 host1 nginx-deployment-65998d8886-qp6jj 1/1 Running 0 4m33s 10.244.1.9 host1

删除 nginx-deployment:

[root@ken ~]# kubectl delete -f nginx.ymldeployment.extensions "nginx-deployment" deleted

[root@ken ~]# kubectl delete -f nginx.ymldeployment.extensions "nginx-deployment" deleted

label 控制 Pod 的位置

默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node。不过有些情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。

Kubernetes 是通过 label 来实现这个功能的。

label 是 key-value 对,各种资源都可以设置 label,灵活添加各种自定义属性。比如执行如下命令标注 k8s-node1 是配置了 SSD 的节点。

第一步:定义标签

disk为自定义字符串

[root@ken ~]# kubectl label node host1 disk=ssd

[root@ken ~]# kubectl label node host1 disk=ssd

第二步:查看标签

[root@ken ~]# kubectl get node --show-labelsNAME    STATUS   ROLES    AGE   VERSION   LABELShost1   Ready    <none>   8h    v1.13.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,kubernetes.io/hostname=host1host2   Ready    <none>   8h    v1.13.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host2ken     Ready    master   8h    v1.13.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=ken,node-role.kubernetes.io/master=

[root@ken ~]# kubectl get node --show-labelsNAME STATUS ROLES AGE VERSION LABELShost1 Ready 8h v1.13.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,kubernetes.io/hostname=host1host2 Ready 8h v1.13.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host2ken Ready master 8h v1.13.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=ken,node-role.kubernetes.io/master=

disk=ssd 已经成功添加到 host1,除了 disk,Node 还有几个 Kubernetes 自己维护的 label。

第三步:配置nginx.yml

有了 disk 这个自定义 label,接下来就可以指定将 Pod 部署到 host1。编辑 nginx.yml:

在 Pod 模板的 spec 里通过 nodeSelector 指定将此 Pod 部署到具有 label disktype=ssd 的 Node 上。

注意:1. nodeSelector需要与containers位置保持一致

2. S必须大写

第四步:部署

部署 Deployment

[root@ken ~]# kubectl apply -f nginx.ymldeployment.extensions/nginx-deployment created

[root@ken ~]# kubectl apply -f nginx.ymldeployment.extensions/nginx-deployment created

第五步:查看 Pod 的运行节点

[root@ken ~]# kubectl get pod -o wideNAME                                READY   STATUS              RESTARTS   AGE    IP       NODE    NOMINATED NODE   READINESS GATESnginx-deployment-5d8db4598d-2gdmz   0/1     ContainerCreating   0          102s   <none>   host1   <none>           <none>nginx-deployment-5d8db4598d-cq55q   0/1     ContainerCreating   0          102s   <none>   host1   <none>           <none>nginx-deployment-5d8db4598d-qjh4x   0/1     ContainerCreating   0          102s   <none>   host1   <none>           <none>

[root@ken ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-5d8db4598d-2gdmz 0/1 ContainerCreating 0 102s host1 nginx-deployment-5d8db4598d-cq55q 0/1 ContainerCreating 0 102s host1 nginx-deployment-5d8db4598d-qjh4x 0/1 ContainerCreating 0 102s host1

全部 3个副本都运行在 host1 上,符合我们的预期。

要删除 label disktype,执行如下命令:

kubectl label node k8s-node1 disktype-

– 即删除。

[root@ken ~]# kubectl label node host1 disk-node/host1 labeled[root@ken ~]# kubectl get node --show-labelsNAME    STATUS     ROLES    AGE   VERSION   LABELShost1   NotReady   <none>   8h    v1.13.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host1host2   Ready      <none>   8h    v1.13.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host2ken     Ready      master   9h    v1.13.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=ken,node-role.kubernetes.io/master=

[root@ken ~]# kubectl label node host1 disk-node/host1 labeled[root@ken ~]# kubectl get node --show-labelsNAME STATUS ROLES AGE VERSION LABELShost1 NotReady 8h v1.13.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host1host2 Ready 8h v1.13.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host2ken Ready master 9h v1.13.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=ken,node-role.kubernetes.io/master=

不过此时 Pod 并不会重新部署,依然在 host1 上运行。

[root@ken ~]# kubectl get pod -o wideNAME                                READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATESnginx-deployment-5d8db4598d-2dbw9   1/1     Running   0          39s   10.244.1.12   host1   <none>           <none>nginx-deployment-5d8db4598d-4brh5   1/1     Running   0          39s   10.244.1.11   host1   <none>           <none>nginx-deployment-5d8db4598d-p87mj   1/1     Running   0          39s   10.244.1.13   host1   <none>           <none>

[root@ken ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-5d8db4598d-2dbw9 1/1 Running 0 39s 10.244.1.12 host1 nginx-deployment-5d8db4598d-4brh5 1/1 Running 0 39s 10.244.1.11 host1 nginx-deployment-5d8db4598d-p87mj 1/1 Running 0 39s 10.244.1.13 host1

除非在 nginx.yml 中删除 nodeSelector 设置,然后通过 kubectl apply 重新部署。

不需要删除之前的deployment,直接部署即可

Kubernetes 自己会删除之前的 Pod 并调度和运行新的 Pod。

[root@ken ~]# kubectl apply -f nginx.yml[root@ken ~]# kubectl get pod -o wideNAME                                READY   STATUS        RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATESnginx-deployment-5d8db4598d-p87mj   0/1     Terminating   0          2m    10.244.1.13   host1   <none>           <none>nginx-deployment-65998d8886-t5nmv   1/1     Running       0          7s    10.244.2.9    host2   <none>           <none>nginx-deployment-65998d8886-wz7c2   1/1     Running       0          4s    10.244.2.10   host2   <none>           <none>nginx-deployment-65998d8886-xdlz4   1/1     Running       0          6s    10.244.1.14   host1   <none>           <none>

[root@ken ~]# kubectl apply -f nginx.yml[root@ken ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-5d8db4598d-p87mj 0/1 Terminating 0 2m 10.244.1.13 host1 nginx-deployment-65998d8886-t5nmv 1/1 Running 0 7s 10.244.2.9 host2 nginx-deployment-65998d8886-wz7c2 1/1 Running 0 4s 10.244.2.10 host2 nginx-deployment-65998d8886-xdlz4 1/1 Running 0 6s 10.244.1.14 host1

上一篇:k8s通过service访问pod(五)
下一篇:Linux性能调优,从优化思路说起
相关文章

 发表评论

暂时没有评论,来抢沙发吧~