deployment通过ReplicaSets(RS)创建Pod
Rs演示:(创建一个Rs)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: name: frontend spec: replicas: 3 selector: matchLabels: tier: frontend template: metadata: labels: tier: frontend spec: containers: - name: php-nginx image: hub.atshooter.com/k8s/nginx:v1.0 env: - name: GET_HOSTS_FROM value: dns ports: - containerPort: 80 |
1 |
kubectl create -f xxx.yaml |

验证理论:kubernetes 很多时候副本数都是通过标签来维护的
1 |
kubectl get pod --show-labels |

更改第一个容器的标签试试
1 2 |
语法:kubectl label pod [podName] [标签] kubectl label pod frontend-4hgj2 tier=frontend111 |

1 2 |
语法:kubectl label pod [podName] [标签] --overwrite=True kubectl label pod frontend-4hgj2 tier=frontend111 --overwrite=true |
查看

我们发现多出了一个frontend容器,加上刚才更改掉标签那个共计4个,这是因为ReplicaSets(RS)是通过标签来维护副本数的,当他发现副本数不足3个就会再启动一个frontend标签的容器。
验证完毕(kubernetes 很多时候副本数都是通过标签来维护的)
删除
如果现在我们删除掉这个rs 结果会如何呢,当然标签是frontend的都会被删掉,我们更改掉标签那个会留下来,不会被回收


deployment演示:
(创建一个deployment) deployment是一个声明式的方法,可以使用apply去创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx-shooter image: hub.atshooter.com/k8s/nginx:v1.0 ports: - containerPort: 80 |
1 2 |
kubectl apply -f xxx.yaml --record #--record参数可以记录命令,我们可以很方便的查看每次 revision 的变化 |
创建deployment同时deployment也会创建响应的RS(replicaSets),然后replicaSets再去创建相应的Pod
所以
1 2 3 |
deploymentName = nginx-deployment-shoote rsName = PodName + 随机串 = nginx-deployment-shooter-78bc9b8f69 PodName = rsName + 随机串 = nginx-deployment-shooter-78bc9b8f69-nfdbb |

deployment扩容
1 2 |
语法: kubectl scale deployment [deployment名称] --replicas [副本数] kubectl scale deployment nginx-deployment-shooter --replicas 10 |

我更新副本数,你可以查看他的rs名称是没有任何变化的,这就说明,他的模板不会被更新,也就不会出现回退这些现象
deployment更新镜像
1 2 3 |
语法:kubectl set image deployment/[deployment名称] [容器名称]=镜像地址 #这里的容器名称是指containers下的name kubectl set image deployment/nginx-deployment-shooter nginx=nginx:1.9.1 |
先登录当前容器查看当前nginx版本
1 2 3 |
kubectl exec -it nginx-deployment-shooter-78bc9b8f69-2v8jn sh # nginx -v nginx version: nginx/1.17.8 |
可以看到当前nginx容器版本是1.17.8 (这是当前最新版的nginx)

那就执行更新到 1.16.1 试试
1 |
kubectl set image deployment/nginx-deployment-shooter nginx=nginx:1.16.1 |

这个更新比较慢,可能跟我网速有关系,半天了只更新成功了一个

我们可以观察rs 列表的变化
上面我更新了2次,有没有发现rs多出2个旧版本Pod,每更新一次就会残留一个上个版本的ReplicaSet 的Pod,这个有什么用呢,当你回滚到上个版本的时候他就有用了。

已经全部更新成功

查看副本更新状态
1 |
kubectl rollout status deployments nginx-deployment-shooter |
deployment回滚镜像
1 2 3 |
#回滚到上一个版本 语法:kubectl rollout undo deployment/[deployment名称] kubectl rollout undo deployment/nginx-deployment-shooter |

验证


回滚后版本号为 1.17.8 无问题 是上一个版本
查看回滚历史
1 |
kubectl rollout history deployment/nginx-deployment-shooter |
1 2 3 4 5 6 7 8 |
[root@k8s-master ~]# kubectl rollout history deployment/nginx-deployment-shooter deployment.extensions/nginx-deployment-shooter REVISION CHANGE-CAUSE 2 kubectl apply --filename=dep-nginx.yaml --record=true 4 kubectl apply --filename=dep-nginx.yaml --record=true 5 kubectl apply --filename=dep-nginx.yaml --record=true #这里的revision是版本号,为后面指定回滚版本会用到 |
回滚到指定版本
1 2 |
(回滚的版本可以查看回滚历史获取) 需要使用 --revision参数指定 kubectl rollout undo deployment/nginx-deployment --to-revision=2 |
暂停deployment正在进行的更新
1 |
kubectl rollout pause deployment/nginx-deployment-shooter |
验证
例如我要回滚到版本 5
1 |
kubectl rollout undo deployment/nginx-deployment --to-revision=5 |


可以看到暂停后 有7个容器已经回滚到了 1.16.1 还有3个容器在上个版本没有
继续deployment刚在暂停的更新
1 |
kubectl rollout resume deployment/nginx-deployment-shooter |

自动继续回滚到指定版本,并且完成
deployment设置自动扩展
如果集群支持 horizontal pod autoscaling 的话,还可以为Deployment设置自动扩展
1 2 |
语法kubectl autoscale deployment [deployment名称] --min=[最小副本数] --max=[最大副本数] --cpu-percent=[cpu百分比] kubectl autoscale deployment nginx-deployment-shooter --min=10 --max=15 --cpu-percent=80 |
其他补充内容
deployment更新策略
1 2 3 |
deployment可以保证在升级时只有一定数量的Pod,是down的,如上面我们操作的,你发现更新镜像的过程中,每次只更新2个容器.他会确保至少有比期望的Pod数量少一个是update状态(最多一个不可用) deployment同时也可以保证,创建出超出期望数量一定量的pod,它会确保最多比期望的Pod数量多一个Pod 是update的(最多多一个) 未来的kubernetes版本中,将从1-1变成25%-25% |
查看deployment状态
1 |
kubectl describe deployments |
Rollover(多个rollout并行)
1 2 3 4 |
假如您创建了一个有5个 nginx:1.7.9 replicaSet的deployment 但是当还只有3个 nginx:1.7.9 的 replica 创建 出来的时候您就开始更新含有5个 nginx:1.9.1 replica 的 Deployment。在这种情况下,Deployment 会立即 杀掉已创建的3个 nginx:1.7.9 的 Pod,并开始创建 nginx:1.9.1 的 Pod。它不会等到所有的5个 nginx:1.7.9 的 Pod 都创建完成后才开始改变航道 |
回退 Deployment
您可以用 kubectl rollout status 命令查看 Deployment 是否完成。如果 rollout 成功完成, kubectl rollout status 将返回一个0值的 Exit Code
1 2 3 |
语法:kubectl rollout status deployment/[deployment名称] kubectl rollout status deployment/nginx-deployment-shooter |
1 2 3 4 5 |
[root@k8s-master ~]# kubectl rollout status deployment/nginx-deployment-shooter deployment "nginx-deployment-shooter" successfully rolled out [root@k8s-master ~]# echo $? 0 [root@k8s-master ~]# |
清理 Policy
1 |
您可以通过设置 .spec.revisonHistoryLimit 项来指定 deployment 最多保留多少 revision 历史记录。默认的会保留所有的 revision;如果将该项设置为0,Deployment 就不允许回退了 |
- 本文固定链接: https://www.yoyoask.com/?p=2116
- 转载请注明: shooter 于 SHOOTER 发表