本文作者:丁辉
Deployment的使用
命令部署一个应用
1 | kubectl create deployment nginx --image=nginx:alpine |
Yaml 部署一个 Deployment 应用
部署应用(最小化 Yaml)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23cat <<EOF | kubectl apply -f -
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:alpine
ports:
- containerPort: 80
EOF验证
1
kubectl get deployments
更新和回滚
Deployment 支持两种更新策略:滚动更新(RollingUpdate,默认)和删除式更新(Recreate,又称单批次更新)。
ReCreate
删除式更新(Recreate):更新时先删除所有运行中的 Pod,待其彻底终止后创建新 ReplicaSet 及对应 Pod,更新期间服务暂不可用。
1
2
3spec:
strategy:
type: RecreateRollingUpdate
滚动更新(RollingUpdate):分批更新 Pod,待一批更新后的 Pod 就绪后再更新下一批,实现服务不中断;更新过程中会存在新老版本应用共存的情况,不同客户端可能获取不同版本响应。
1
2
3spec:
strategy:
type: RollingUpdate
更新
更新镜像
在这里,
deployment/nginx-deployment表明 Deployment 的名称,nginx表明需要进行更新的容器, 而nginx:latest则表示镜像的新版本以及它的标签。1
kubectl set image deployment/nginx-deployment nginx=nginx:latest
查看进度
1
kubectl rollout status deployment/nginx-deployment
查看状态
1
kubectl get rs
回滚
查看 Deployment 修订历史
1
kubectl rollout history deployment/nginx-deployment
设置
CHANGE-CAUSE消息1
kubectl annotate deployment/nginx-deployment kubernetes.io/change-cause="image updated to latest"
查看修订历史的详细信息
1
kubectl rollout history deployment/nginx-deployment --revision=2
回滚
1
kubectl rollout undo deployment/nginx-deployment
或回滚到特定版本
1
kubectl rollout undo deployment/nginx-deployment --to-revision=2
重启
1 | kubectl rollout restart deployment deployment/nginx-deployment |
副本数调整
1 | kubectl scale deployment/nginx-deployment --replicas=3 |
暂停、恢复 Deployment 的上线过程
暂停上线
1
kubectl rollout pause deployment/nginx-deployment
更新 Deployment 镜像
1
kubectl set image deployment/nginx-deployment nginx=nginx:latest
你可以根据需要执行很多更新操作,例如,可以要使用的资源
1
kubectl set resources deployment/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi
最终,恢复 Deployment 上线并观察新的 ReplicaSet 的创建过程,其中包含了所应用的所有更新
1
kubectl rollout resume deployment/nginx-deployment
监视上线的状态,直到完成
1
watch kubectl get rs
更新失败标记为 “Failed” 状态
1 | kubectl patch deployment/nginx-deployment -p '{"spec":{"progressDeadlineSeconds":600}}' |
progressDeadlineSeconds
- 作用: 定义 Deployment 滚动更新(Rolling Update)的最大允许时间
- 值 600: 表示 600 秒(1 分钟)
- 默认值: 通常为 600 秒,但显式设置可确保明确性
- 工作逻辑:
- 当 Deployment 开始更新(如镜像版本升级)时启动计时
- 如果更新过程超过 600 秒仍未完成
- Kubernetes 会将 Deployment 标记为 “Failed” 状态
- 并自动回滚到之前的稳定版本(如果配置了回滚策略)
配置 ReplicaSet 清理策略
你可以在 Deployment 中设置 .spec.revisionHistoryLimit 字段以指定保留此 Deployment 的多少个旧有 ReplicaSet。其余的 ReplicaSet 将在后台被垃圾回收。 默认情况下,此值为 10。
1 | kubectl patch deployment/nginx-deployment -p '{"spec":{"revisionHistoryLimit":10}}' |
金丝雀部署
通过副本数控制
操作步骤:
先部署稳定版本(v1,9个副本)
部署金丝雀版本(v2,1个副本)
Service会自动将约9%的流量(1/10)导向v2
观察监控,如果v2正常,逐步增加v2副本数,减少v1副本数
部署 Pod-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-1
labels:
app: nginx
spec:
replicas: 9
strategy:
type: RollingUpdate
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
version: v1
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/offends/demo:nginx-alpine-v1
ports:
- containerPort: 80
EOF部署 Pod-2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-2
labels:
app: nginx
spec:
replicas: 1
strategy:
type: RollingUpdate
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
version: v2
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/offends/demo:nginx-alpine-v2
ports:
- containerPort: 80
EOF部署 Service(同时选择v1和v2的Pod)
1
2
3
4
5
6
7
8
9
10
11
12cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment-service
spec:
selector:
app: nginx # 同时选择两个版本的Pod
ports:
- port: 80
targetPort: 80
EOF修改权重将流量导向 v2
增加 v2
1
kubectl scale deployment/nginx-deployment-2 --replicas=10
降低 v1
1
kubectl scale deployment/nginx-deployment-1 --replicas=0
通过 Ingress 实现基于权重的金丝雀
方法类似于前者,只是对象从副本数变换为 Ingress控制
创建两个 Service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment-service-1
spec:
selector:
app: nginx
version: v1
ports:
- port: 80
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment-service-2
spec:
selector:
app: nginx
version: v2
ports:
- port: 80
targetPort: 80
EOF创建 Ingress 资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40cat <<EOF | kubectl apply -f -
# 金丝雀 Ingress 对象为 v1 版本
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress-1
spec:
rules:
- host: demo.offends.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-deployment-service-1
port:
number: 80
# 金丝雀 Ingress 对象为 v2 版本
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress-2
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "10" # 10%流量到金丝雀
spec:
rules:
- host: demo.offends.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-deployment-service-2
port:
number: 80
EOF慢慢调整 nginx-ingress-2 流量到 100%,即完成更新
要是这篇文章为您解了惑、带来了帮助,不妨用小小的打赏来支持下我的创作吧,您的鼓励就是我持续分享的最大动力哦,感谢您啦!
- 本文链接: https://blog.offends.cn/Kubernetes/使用文档/Deployment的使用.html
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。