Kubernetes 金丝雀发布实战详解
概述
通过 Kubernetes 的滚动更新策略实现金丝雀发布,逐步将应用从 v1.0 版本升级到 v2.0 版本。
环境准备
1. 创建 Service 资源
# 创建集群内部访问的 Service 资源
# 名称为 deployment-demo,端口映射:Service 80 → Pod 80
kubectl create service clusterip deployment-demo --tcp=80:80
2. 验证 Service 配置
# 获取 Kubernetes 中名为deployment-demo的 Deployment 资源的详细配置信息,并以 YAML 格式输出
kubectl get deployment deployment-demo -o yaml
部署初始版本
创建 Deployment 配置文件
创建 6.deployment.yaml 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deployment-demo
name: deployment-demo
spec:
replicas: 10
selector:
matchLabels:
app: deployment-demo
template:
metadata:
labels:
app: deployment-demo
spec:
containers:
- image: wangyanglinux/myapp:v1.0 # 实际为 nginx 服务
name: deployment-demo-container
部署应用
# 运行 deployment.yaml 文件
# 创建一个包含 10 个 Pod 副本的 Deployment
kubectl apply -f 6.deployment.yaml
配置滚动更新策略
设置更新参数
# 修改滚动更新策略
kubectl patch deployment deployment-demo -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
参数说明:
-
maxSurge: 1 - 集群中 Pod 的最大数量可以超出期望副本数(replicas)的上限为 1
-
maxUnavailable: 0 - 升级过程中,集群中不可用 Pod 的最大数量为 0(即不允许任何 Pod 不可用)
-
金丝雀发布实施
步骤 1:监控服务状态
在第一个终端窗口执行:
-
# 死循环监视 deployment-demo 这个 Service 的 IP
# 10.4.243.153 为 Service 的 IP 地址
while true;do curl 10.4.243.153;done -
步骤 2:执行金丝雀发布
在第二个终端窗口执行:
-
kubectl patch deployment deployment-demo --patch '{
"spec": {
"strategy": {
"rollingUpdate": {
"maxSurge": 1,
"maxUnavailable": 0
}
},
"template": {
"spec": {
"containers": [{
"name": "deployment-demo-container",
"image": "wangyanglinux/myapp:v2.0"
}]
}
}
}
}' && kubectl rollout pause deployment/deployment-demo
-
观察发布效果
动态查看金丝雀发布
在第三个终端窗口中,可以动态观察 Pod 的状态变化。
-
发布效果
通过此方法可以实现:
-
逐步将流量从 v1.0 版本切换到 v2.0 版本
-
此时v2.0 版本相当于金丝雀(少量更新)
-
确保在更新过程中服务始终可用
-
如果新版本有问题,可以快速回滚(kubectl rollout undo deployment/deployment-demo)
-
实现零停机部署
-
后续操作
根据测试结果决定是否继续发布或回滚:
-
# 如果测试通过,继续完成发布
kubectl rollout resume deploy/deployment-demo# 如果测试失败,回滚到上一版本
kubectl rollout undo deployment/deployment-demo -
这种金丝雀发布策略确保了应用更新的安全性和可靠性,是生产环境中推荐的部署方式。
更多推荐



所有评论(0)