K8S脉络整理(007)-Deployment伸缩、Failover、label控制运行位置

Deployment

伸缩:Scale Up/Down 在线增加或减少 Pod 的副本数

Failover:关闭节点,模拟故障

pod运行位置控制:Kubernetes 是通过 label 来实现将 Pod 部署到指定的 Node。label 是 key-value 对,各种资源都可以设置 label,灵活添加各种自定义属性


 

伸缩(Scale Up/Down)是指在线增加或减少 Pod 的副本数。
Deployment nginx-deployment 初始是两个副本。

daweij@master:~/stady01/nginx$ kubectl apply -f nginx.yml 
deployment "nginx-deployment" created
daweij@master:~/stady01/nginx$ kubectl get pod -o wide
NAME                                   READY     STATUS              RESTARTS   AGE       IP             NODE
nginx-deployment-5cff94d9b-874bn       0/1       ContainerCreating   0          8s        <none>         node3
nginx-deployment-5cff94d9b-87rnd       1/1       Running             0          8s        10.233.74.78   node4

node3 和node4上各跑了一个副本。现在修改 nginx.yml,将副本改成 5 个。

再次执行 kubectl apply

daweij@master:~/stady01/nginx$ kubectl apply -f nginx.yml 
deployment "nginx-deployment" configured
daweij@master:~/stady01/nginx$ kubectl get pod -o wide
NAME                                   READY     STATUS              RESTARTS   AGE       IP               NODE
nginx-deployment-5cff94d9b-4dwqn       0/1       ContainerCreating   0          3s        <none>           node2
nginx-deployment-5cff94d9b-874bn       0/1       ContainerCreating   0          1m        <none>           node3
nginx-deployment-5cff94d9b-87rnd       1/1       Running             0          1m        10.233.74.78     node4
nginx-deployment-5cff94d9b-b6dsr       1/1       Running             0          3s        10.233.102.136   node1
nginx-deployment-5cff94d9b-jpfft       0/1       ContainerCreating   0          3s        <none>           node3

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

出于安全考虑,默认配置下 Kubernetes 不会将 Pod 调度到 Master 节点。

如果希望将 k8s-master 也当作 Node 使用,可以执行如下命令:

kubectl taint node master node-role.kubernetes.io/master-

如果要恢复 Master Only 状态,执行如下命令:

kubectl taint node master node-role.kubernetes.io/master="":NoSchedule
daweij@master:~/stady01/nginx$ kubectl taint node master node-role.kubernetes.io/master-
node "master" untainted
daweij@master:~/stady01/nginx$ kubectl taint node master node-role.kubernetes.io/master="":NoSchedule
node "master" tainted

  

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

aweij@master:~/stady01/nginx$ kubectl apply -f nginx.yml 
deployment "nginx-deployment" configured
daweij@master:~/stady01/nginx$ kubectl get pod -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP               NODE
nginx-deployment-5cff94d9b-874bn       1/1       Running   0          4m        10.233.71.11     node3
nginx-deployment-5cff94d9b-87rnd       1/1       Running   0          4m        10.233.74.78     node4
nginx-deployment-5cff94d9b-b6dsr       1/1       Running   0          2m        10.233.102.136   node1

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


 

 

 Deployment 的 Failover。

q前面 3 个 nginx 副本分别运行在 node1  node3 node4 上。现在模拟node1故障,关闭该节点。

等待一段时间,Kubernetes 会检查到node1 不可用,将 node1上的 Pod 标记为 Unknown 状态,并在 其他节点上新创建1个 Pod,维持总副本数为 3。

当node1恢复后,Unknown 的 Pod 会被删除,不过已经运行的 Pod 不会重新调度回node1。

删除 nginx-deployment

daweij@master:~/stady01/nginx$ kubectl delete -f nginx.yml 
deployment "nginx-deployment" deleted

 


 

如何控制 Pod 运行的位置

 

默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node。

不过有些情况我们希望将 Pod 部署到指定的 Node:

  比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;

  或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。

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

label 是 key-value 对,各种资源都可以设置 label,灵活添加各种自定义属性。

比如执行如下命令标注 node1 是配置了 SSD 的节点。

kubectl label node node1 disktype=ssd

然后通过 kubectl get node --show-labels 查看节点的 label。

daweij@master:~/stady01/nginx$ kubectl label node node1 disktype=ssd
node "node1" labeled
daweij@master:~/stady01/nginx$ kubectl get node --show-labels 
NAME      STATUS    ROLES         AGE       VERSION           LABELS
master    Ready     master        33d       v1.9.0+coreos.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master,node-role.kubernetes.io/master=true
node1     Ready     node          33d       v1.9.0+coreos.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=node1,node-role.kubernetes.io/node=true
node2     Ready     node          33d       v1.9.0+coreos.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node2,node-role.kubernetes.io/node=true
node3     Ready     node          33d       v1.9.0+coreos.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node3,node-role.kubernetes.io/node=true
node4     Ready     master,node   33d       v1.9.0+coreos.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node4,node-role.kubernetes.io/master=true,node-role.kubernetes.io/node=true

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

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

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

部署 Deployment 并查看 Pod 的运行节点: 

daweij@master:~/stady01/nginx$ kubectl apply -f nginx.yml 
deployment "nginx-deployment" created
daweij@master:~/stady01/nginx$ kubectl get pod -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP               NODE
nginx-deployment-7f768f85d6-mk9jw      1/1       Running   0          16s       10.233.102.138   node1
nginx-deployment-7f768f85d6-nn4h2      1/1       Running   0          16s       10.233.102.137   node1
nginx-deployment-7f768f85d6-ww9kt      1/1       Running   0          16s       10.233.102.139   node1

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

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

kubectl label node node1 disktype-

 - 即删除。

daweij@master:~/stady01/nginx$ kubectl label node node1 disktype-
node "node1" labeled
daweij@master:~/stady01/nginx$ kubectl get node --show-labels 
NAME      STATUS    ROLES         AGE       VERSION           LABELS
master    Ready     master        33d       v1.9.0+coreos.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master,node-role.kubernetes.io/master=true
node1     Ready     node          33d       v1.9.0+coreos.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node1,node-role.kubernetes.io/node=true
node2     Ready     node          33d       v1.9.0+coreos.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node2,node-role.kubernetes.io/node=true
node3     Ready     node          33d       v1.9.0+coreos.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node3,node-role.kubernetes.io/node=true
node4     Ready     master,node   33d       v1.9.0+coreos.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node4,node-role.kubernetes.io/master=true,node-role.kubernetes.io/node=true

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

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

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

 

posted @ 2018-03-07 16:06  Cslc-DaweiJ  阅读(425)  评论(0编辑  收藏  举报