使用新图像更新现有的Deployment 很容易,无需删除它。
假设我们有一个带有部署的 YAML file。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
要运行此部署,请运行以下命令:
$ kubectl create -f nginx-deployment.yaml --record
(--record - 将当前命令附加到已创建或更新资源的注释中。这对于将来的审查很有用,例如调查在每个部署修订中执行了哪些命令,以及进行回滚。)
要查看部署部署状态,请运行
$ kubectl rollout status deployment/nginx-deployment
要更新 nginx 镜像版本,只需运行以下命令:
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
或者您可以使用以下命令编辑现有部署:
$ kubectl edit deployment/nginx-deployment
要查看部署更新过程的状态,请运行以下命令:
$ kubectl rollout status deployment/nginx-deployment
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx-deployment" successfully rolled out
或
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 36s
每次更新 Deployment 时,它都会通过创建新的 ReplicaSet,将其扩展为 3 个副本,并将旧的 ReplicaSet 缩减为 0 来更新 Pod。如果在上一次更新过程中再次更新 Deployment,它会开始创建立即新建 ReplicaSet,无需等待上一次更新完成。
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-1180356465 3 3 3 4s
nginx-deployment-2538420311 0 0 0 56s
如果您在编辑 Deployment 时打错字(例如,nginx:1.91),您可以将其回滚到以前的好版本。
首先,检查此部署的修订:
$ kubectl rollout history deployment/nginx-deployment
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 kubectl create -f nginx-deployment.yaml --record
2 kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
3 kubectl set image deployment/nginx-deployment nginx=nginx:1.91
因为我们在使用 --record 创建此 Deployment 时记录了命令,所以我们可以很容易地看到我们在每个修订版中所做的更改。
要查看每个修订的详细信息,请运行:
$ kubectl rollout history deployment/nginx-deployment --revision=2
deployments "nginx-deployment" revision 2
Labels: app=nginx
pod-template-hash=1159050644
Annotations: kubernetes.io/change-cause=kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
Containers:
nginx:
Image: nginx:1.9.1
Port: 80/TCP
QoS Tier:
cpu: BestEffort
memory: BestEffort
Environment Variables: <none>
No volumes.
现在您可以使用命令回滚到以前的版本:
$ kubectl rollout undo deployment/nginx-deployment
deployment "nginx-deployment" rolled back
或者您可以回滚到特定版本:
$ kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment "nginx-deployment" rolled back
更多信息请阅读Kubernetes文档中与Deployment相关的部分