更新pod鏡像兩種方式:
方式一:kubectl set image deployment/${deployment name} ${container name}=${image} 例: kubectl set image deployment/nginx-deployment nginx=nginx:1.13 --record
方式二: kubectl edit 修改deployment配置, 將spec.template.spec,containers[0].image 從nginx:1.12 修改成nginx:1.13
查看deployment更新過程:
kubectl rollout status deployment/nginx-deployment
可以通過deployment狀態來判斷pod更新是否完成, kubectl rollout status deployment nginx-deployment --watch=false | grep -ic waiting1 如果更新成功, 返回值為0
deployment更新策略: Recreate(重建)殺掉所有的pod, 然后創建新的pod 和 RollingUpdate(滾動更新) 通過參數maxUnavailable與maxSurge來控制滾動更新過程
滾動更新策略:
deployment.spec.strategy.rollingUpdate.maxUnavailable:不可用狀態的pod數量,該值可以是絕對值, 也可以是pod期望的副本數的百分比
deployment.spec.strategy.rollingUpdate.maxSurge: 超過pod期望副本數的最大值
當maxSurge設置為30% 和 maxUnavailable設置為30% : 生成一個新的ReplicaSet立即進行副本數擴容, 擴容的數量為不超過期望副本數的130%即可, 舊的ReplicaSet立即縮容到所需副本數的70%
pod回滾: 建議deployment滾動更新的時候加上--record參數, 這樣在change-cause看個每個版本使用的命令
kubectl rollout history deployment/nginx-deployment 檢查deployment升級的歷史記錄
kubectl rollout history deployment/nginx-deployment --revision=2 查看單個revision 的詳細信息
kubectl rollout undo deployment/nginx-deployment 回退到上一個版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2 根據--revision參數指定某個歷史版本
spec.revisonHistoryLimit項來指定 deployment 最多保留多少 revision 歷史記錄
注意: deployment的pod模板被更改時才會創建新的修訂版本,例如更新模板標簽或者容器鏡像可以觸發滾動更新, 其它操作例如擴展副本數將不會觸發deployment的更新操作
暫停和恢復deployment: 對於一次復雜的deployment更新操作,為了避免頻繁觸發deployment的更新操作,可以先暫停deployment的更新操作, 然后進行配置修改,在恢復deployment,一次性觸發完整的更新操作
kubectl rollout pause deployment/nginx-deployment #暫停deployment , 不影響pod正常運行, 可以修改的deployment資源, 不會觸發滾動更新
kubectl set image deploy/nginx nginx=nginx:1.9.1
kubectl set resources deployment nginx -c=nginx --limits=cpu=200m,memory=512Mi
kubectl rollout resume deployment/nginx-deployment #恢復deployment, 如果有變動, 馬上進行滾動更新
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 10
strategy:
rollingUpdate:
maxSurge: 30%
maxUnavailable: 30%
template:
metadata:
labels:
app: nginx
spec:
initContainers:
- name: install
image: busybox
imagePullPolicy: IfNotPresent
command:
- wget
- "-O"
- "/work-dir/index.html"
- http://kubernetes.io
volumeMounts:
- name: workdir
mountPath: "/work-dir"
containers:
- name: nginx
image: nginx:1.12
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: "/usr/share/nginx/html"
volumes:
- name: workdir
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
labels:
app: nginx
spec:
type: NodePort
selector:
app: nginx
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80