前言
本文主要记录 Kubernetes Deployment 资源的相关操作,包括 Deployment 的创建、更新、回滚、扩缩容、状态查看、上线暂停与恢复,以及金丝雀部署方式。
创建Deployment
创建Deployment资源并上线ReplicaSet
Deployment资源提供了对Pod和ReplicaSet的更新定义
创建Deployment
1.编辑示例Deployment资源描述文件
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.14.2
ports:
- containerPort: 80
2.执行命令创建Deployment
指定--record,记录Deployment修改历史,用于查看历史记录或回滚等操作
kubectl apply -f nginx-deployment.yaml --record
查看Deployemnt状态
执行命令kubectl get deployments,查看deployment状态
kubectl get deployments
### 输出
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 46s
查看Deployment上线状态
查看Deployment上线状态
命令形如:kubectl rollout status deployment/<.metadata.name>
kubectl rollout status deployment/nginx-deployment
### 输出
deployment "nginx-deployment" successfully rolled out
查看 Deployment 创建的 ReplicaSet
执行命令kubectl get rs,查看 Deployment 创建的 ReplicaSet
kubectl get rs
### 输出
NAME DESIRED CURRENT READY AGE
nginx-deployment-66b6c48dd5 3 3 3 8m29s
查看Pod及标签
查看每个 Pod 自动生成的标签
kubectl get pods --show-labels
### 输出
NAME READY STATUS RESTARTS AGE LABELS
nginx-deployment-66b6c48dd5-8rmj2 1/1 Running 0 10m app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-9x8gg 1/1 Running 0 10m app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-dxwwg 1/1 Running 0 10m app=nginx,pod-template-hash=66b6c48dd5
更新Deployment
仅当 Deployment Pod 模板(即 .spec.template)发生改变时,例如模板的标签或容器镜像被更新, 才会触发 Deployment 上线。 其他更新(如对 Deployment 执行扩缩容的操作)不会触发上线动作
更新镜像
更新nginx使用镜像从nginx:1.14.2到nginx:1.16.1
命令形如:
kubectl --record deployment.apps/<.metadata.name> set image deployment.v1.apps/<.metadata.name> <.spec.containers[0].name>=<.spec.containers[0].image>
<.metadata.name>
<.metadata.name>,.metadata.name,deployment资源的唯一名称
<.spec.containers[0].name>,.spec.template.spec.containers[0].name,容器名
<.spec.containers[0].image>,.spec.template.spec.containers[0].image,容器镜像
kubectl --record deployment.apps/nginx-deployment set image \
deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1
或者使用以下命令:
kubectl --record set image deployment/<.metadata.name> <.spec.containers[0].name>=<.spec.containers[0].image>
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record
查看ReplicaSet
Deployment 通过创建新的 ReplicaSet 并将其扩容到 3 个副本
旧 ReplicaSet 缩容到 0 个副本完成了 Pod 的更新操作
kubectl get rs
### 输出
NAME DESIRED CURRENT READY AGE
nginx-deployment-559d658b74 3 3 3 6m32s
nginx-deployment-66b6c48dd5 0 0 0 32m
查看Pod
通过NAME字段可以看到新的Pod
kubectl get pods
### 输出
NAME READY STATUS RESTARTS AGE
nginx-deployment-559d658b74-9n6mz 1/1 Running 0 8m22s
nginx-deployment-559d658b74-cww5k 1/1 Running 0 7m58s
nginx-deployment-559d658b74-f4gmg 1/1 Running 0 8m45s
回滚Deployment版本
回滚到先前版本的Deployment
仅当 Deployment 的 Pod 模板(.spec.template)发生更改时,才会创建新修订版本;因此回滚到较早的修订版本时,只有 Deployment 的 Pod 模板部分会被回滚
查看Deployment上线历史
查看Deployment上线历史 命令形如:kubectl rollout history deployment.v1.apps/<.metadata.name>
kubectl rollout history deployment.v1.apps/nginx-deployment
### 输出
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=nginx-deployment.yaml --record=true
2 kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true
查看REVISION详情
查看修订历史的详细信息 命令形如:kubectl rollout history deployment.v1.apps/<.metadata.name> --revision=
kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2
回滚到上个版本
1.撤消当前上线版本并回滚到上个修订版本
命令形如:kubectl rollout undo deployment.v1.apps/<.metadata.name>
kubectl rollout undo deployment.v1.apps/nginx-deployment
2.回滚到指定版本
命令形如:kubectl rollout undo deployment.v1.apps/<.metadata.name> --to-revision=
kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=1
扩缩Deployment
扩容Deployment以实现更多服务负载
按数量扩缩
按数量副本扩缩
命令形如:kubectl scale deployment.v1.apps/<.metadata.name> --replicas=
kubectl scale deployment.v1.apps/nginx-deployment --replicas=10
按比例扩缩
按比例扩缩是Deployment滚动更新的一种策略
Deployment在扩缩过程中可能会同时存在新旧版本
通过指定maxUnavailable(最大不可用)和maxSurge(最大峰值)来控制副本数量变化幅度
- maxUnavailable:
.spec.strategy.rollingUpdate.maxUnavailable,指定更新过程中不可用的 Pod 的个数上限;正整数,或期望Pod数量的百分比(向下取整),默认值25% - maxSurge:
.spec.strategy.rollingUpdate.maxSurge,指定可以创建的超出期望 Pod 个数的 Pod 数量上限;正整数,或期望Pod数量的百分比(向上取整),默认值25%
暂停、恢复Deployment
暂停与恢复Deployment上线
暂停Deployment
暂停Deployment,Deployment的上线操作将会不可用,包括回滚操作
命令形如:kubectl rollout pause deployment.v1.apps/<.metadata.name>
kubectl rollout pause deployment.v1.apps/nginx-deployment
恢复Deployment
命令形如:kubectl rollout resume deployment.v1.apps/<.metadata.name>
kubectl rollout resume deployment.v1.apps/nginx-deployment
清理策略
清理旧ReplicaSets
设置.spec.revisionHistoryLimit指定此 Deployment 保留的旧有 ReplicaSet 个数
其余的 ReplicaSet 将在后台被垃圾回收,显示指定值为0即可清空,默认值为10
金丝雀部署
金丝雀部署在保持旧版本Pod运行同时,上线新版本Pod
当新版本Pod应用验证之后,将旧版本替换为新版本
在Kubernetes中通常以标签release=stable或release=canary来标记版本
稳定版本
.metadata.name=nginx-deployment,当前版本的Deployment资源名称
.spec.replicas=3,旧版本的上线数量
.spec.template.metadata.labels.release=stable,当前版本的Pod标签
.spec.template.spec.containers[0].image=nginx:1.14.2,当前版本容器镜像
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
release: stable
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
金丝雀版本
.metadata.name=nginx-canary-deployment,新版本的Deployment资源名称
.spec.replicas=1,新版本的上线数量
.spec.template.metadata.labels.release=canary,新版本的Pod标签
.spec.template.spec.containers[0].image=nginx:1.16.1,新版本容器镜像
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-canary
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
release: canary
spec:
containers:
- name: nginx
image: nginx:1.16.1
ports:
- containerPort: 80
服务资源
.spec.selector.app=nginx,以新旧版本Pod的共有标签匹配,这样服务请求都可达到新旧版本
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
protocol: TCP
targetPort: 80
nodePort: 32000
当金丝雀版本验证符合预期后,更改旧版本的镜像并更新上线,随后可将金丝雀版本下线
参考
[1] Kubernetes Deployments
[2] 金丝雀部署