--- vssueId: 170 # layout: StepLayout sharingTitle: CKA备考打卡 - 每日一题 - Day 6 description: CKA备考打卡 - 每日一题 - Day 6 meta: - name: keywords content: Kubernetes,K8S,CKA,Certified Kubernetes Administrator --- # CKA每日一题 --- Day 6 ::: tip 考题 通过命令行,创建1个deployment,副本数为3,镜像为 `nginx:latest`。然后滚动升 级到 `nginx:1.9.1`,再回滚到原来的版本 要求:Deployment的名称为cka-1125,贴出用到的相关命令。 最好附带创建的Deployment完整yaml,以及和升级回滚有关的命令。 ::: 答案及解析 ## 答案 先创建deployment,可以用命令创建: ``` kubectl run cka-1125 --image=nginx --replicas=3 ``` 也可以用以下yaml:cka-1125.yaml创建 ``` apiVersion: apps/v1 kind: Deployment metadata: labels: app: cka-1125 name: cka-1125 spec: replicas: 3 selector: matchLabels: app: cka-1125 template: metadata: labels: app: cka-1125 spec: containers: - image: nginx name: cka-1125 ``` 创建: ``` kubectl apply -f cka-1125.yaml ``` 升级: ``` kubectl set image deploy/cka-1125 cka-1125=nginx:1.9.1 --record deployment.extensions/cka-1125 image updated ``` 回滚: ``` # 回滚到上一个版本 kubectl rollout undo deploy/cka-1125 # 回滚到指定版本 kubectl rollout undo deploy/cka-1125 --to-revision=2 ``` ## 解析 **官方中set image命令:** [https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#set](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#set) ### set image命令 set image命令格式如下: ``` kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N [--record] ``` --record指定,在annotation中记录当前的kubectl命令。如果设置为false,则不记录命令。如果设置为true,则记录命令。默认为false。 ``` [root@liabio test]# kubectl set image deploy/cka-1125 cka-1125=nginx:1.9.1 --record deployment.extensions/cka-1125 image updated [root@liabio test]# [root@liabio test]# kubectl rollout history deploy/cka-1125 deployment.extensions/cka-1125 REVISION CHANGE-CAUSE 3 4 kubectl set image deploy/cka-1125 cka-1125=nginx:1.9.1 --record=true ``` 像上面这样,CHANGE-CAUSE中会有升级命令。 `set image`命令可以对:`pod (po), replicationcontroller (rc), deployment (deploy), daemonset (ds), replicaset (rs),statefulset(sts)`进行操作。 ### roll命令 **roll命令官方文档:** [https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#rollout](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#rollout) 可以管理`deployments、daemonsets、statefulsets`资源的回滚: 查询升级历史: ``` [root@liabio test]# kubectl rollout history deploy/cka-1125 deployment.extensions/cka-1125 REVISION CHANGE-CAUSE 1 2 ``` 查看指定版本的详细信息: ``` kubectl rollout history deploy/cka-1125 --revision=3 -o=yaml ``` 回滚到上一个版本: ``` [root@liabio test]# kubectl rollout undo deploy/cka-1125 deployment.extensions/cka-1125 rolled back ``` 或者回滚到指定版本: ``` [root@liabio test]# kubectl rollout undo deploy/cka-1125 --to-revision=3 deployment.extensions/cka-1125 rolled back ``` ### 其他roll子命令 restart:资源将重新启动; status:展示回滚状态; resume:恢复被暂停的资源。控制器不会控制被暂停的资源。通过恢复资源,可以让控制器再次控制。resume仅对deployment支持。 pause:控制器不会控制被暂停的资源。使用`kubectl rollout resume`来恢复暂停的资源。当前,只有deployment支持被暂停。 ### 滚动更新策略 **滚动更新文档:** [https://kubernetes.io/docs/concepts/workloads/controllers/deployment/](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) 中文文档: [滚动更新](/learning/k8s-intermediate/workload/wl-deployment/update.html) ``` minReadySeconds: 5 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 ``` **minReadySeconds** Kubernetes在等待设置的时间后才进行升级 如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了 如果没有设置该值,在某些极端情况下可能会造成服务服务正常运行 **maxSurge** 控制滚动更新过程中副本总数超过DESIRED的上限。maxSurge可以是具体的整数,也可以是百分比,向上取整。maxSurge默认值为25%。 例如DESIRED为10,那么副本总数的最大值为roundUp(10 + 10*25%)=13,所以CURRENT为13。 **maxUnavaible** 控制滚动更新过程中,不可用副本占DESIRED的最大比例。maxUnavailable可以是具体的整数,也可以是百分之百,向下取整。默认值为25%。 例如DESIRED为10,那么可用的副本数至少要为 `10-roundDown(10*25%)=8`所以AVAILABLE为8。 **maxSurge越大,初始创建的新副本数量就越多;maxUnavailable越大,初始销毁的旧副本数目就越多。** > CKA 考试每日一题系列,全部内容由 [我的小碗汤](https://mp.weixin.qq.com/s/5tYgb_eSzHz_TMsi0U32gw) 创作,本站仅做转载