Kubernetes 从入门到精通-deployment控制器
一、Deployment 基础概念
1.Deployment 是什么
- Kubernetes 中最常用的 无状态应用 部署方式。
- 提供声明式的更新机制,管理 ReplicaSet 和 Pod。
- 具有上线部署,副本设置,滚动升级,回滚等功能。
2.核心功能
- Pod 副本管理:确保指定数量的 Pod 副本(Replicas)持续运行。
- 滚动更新:逐步替换旧 Pod 为新版本,实现零停机发布。
- 版本回滚:键回退到历史版本(基于 ReplicaSet 快照)。
- 自动修复:节点故障时自动在新节点重建 Pod。
- 扩缩容:通过 kubectl scale 或 HPA 动态调整 Pod 数量。
- 暂停/恢复更新:控制更新流程,实现金丝雀发布。
3.核心特性对比
特性 | Deployment | StatefulSet | DaemonSet |
适合场景 | 无状态应用 | 有状态应用 | 节点级部署 |
Pod命名 | 随机 | 有序 | 随机 |
存储卷 | 共享 | 专属 | 可选 |
滚动更新策略 | 支持 | 支持 | 支持 |
4.Deployment 工作流程
二、Deployment核心操作命令
1.基础命令
# 创建 Deployment
kubectl apply -f deploy.yaml# 查看 Deployment 状态
kubectl get deploy -o wide# 查看关联的 ReplicaSet
kubectl get rs -l app=nginx# 查看 Pod 分布
kubectl get pods -o wide -l app=nginx# 查看deploy详细信息
kubectl describe deployment nginx-deploy#删除deploy
kubectl delete deployment nginx-deploy
kubectl delete -f nginx-deploy.yaml
2.扩缩容
# 手动扩缩容
kubectl scale deployment nginx-deploy --replicas=5# 自动扩缩容(需提前安装 metrics-server)
kubectl autoscale deployment nginx-deploy --min=2 --max=10 --cpu-percent=80
#--min=2 最小Pod副本数下限 --max=10 最大Pod副本数上限
#当Pod的CPU平均利用率 > 80%持续一段时间 → 增加副本
#当CPU平均利用率 < 80%持续一段时间 → 减少副本
三、案例
1. Deployment 滚动更新
1.1 滚动更新示例
[root@master-1 yaml]# cat deploy-nginx-strategy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: deploy-nginx-strategy
spec:# 定义升级策略strategy:# 指定升级类型,有效值为Recreate和RollingUpdate.# Recreate:# 先删除所有旧的Pod,再创建新的Pod。# RollingUpdate:# 先删除部分旧的Pod,滚动更新旧的Pod,逐步使用新的Pod替代旧的Pod。# 默认就是基于滚动更新类型。# type: Recreatetype: RollingUpdate# 滚动更新rollingUpdate:# 在升级过程中,在原有旧的Pod基础之上启动的Pod数量。#更新期间允许超过 replicas 的最大 Pod 数maxSurge: 2# 在升级过程中,指定最大不可用的数量。# 更新期间允许不可用的 Pod 数maxUnavailable: 1#maxSurge: "20%"#maxUnavailable: "10%"minReadySeconds: 5 # Pod 就绪后等待时间(确保稳定性)revisionHistoryLimit: 1 # 保留的旧 ReplicaSet 数量(用于回滚)replicas: 5selector: # 选择器必须匹配 template 中的标签matchExpressions:- key: appsvalues: - "v1"- "v2"operator: Intemplate:metadata:labels:apps: v1school: liuxspec:containers:- name: v1# image: nginx:latestimage: nginx:1.22.1imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:name: deploy-strategy
spec:type: NodePortselector:apps: v1school: liuxports:- port: 8888targetPort: 80nodePort: 30000
如下图所示,已经成功部署了nginx服务
1.2 声明式滚动更新
现在我们将nginx版本升级为最新版本 修改image: nginx:latest
发现滚动更新过程中两个版本都有,直到替换完毕。
1.3 响应式滚动更新
# 触发滚动更新(修改镜像)
kubectl set image deployment.apps/deploy-nginx-strategy v1=nginx:1.22.1# 监控更新进度
kubectl rollout status deployment.apps/deploy-nginx-strategy
# 查看发布历史
kubectl rollout history deployment.apps/deploy-nginx-strategy # 回滚到上一版本
kubectl rollout undo deployment/nginx-deploy# 回滚到指定版本
kubectl rollout undo deployment.apps/deploy-nginx-strategy --to-revision=2
如下如所示,nginx已经回退到1.22.1版本
2.deployment蓝绿部署
2.1 简介
蓝绿部署(Blue/Green)部署简介:
蓝绿部署特点:
不需要停止老版本代码(不影响上一版本访问),而是在另外一套环境部署新版本然后进行测试。
测试通过后将用户流量切换到新版本,其特点为业务无中断,升级风险相对较小。优点:无需停机,风险较小
缺点:切换是全量的,如果新版本有问题,则对用户体验有直接影响,需要双倍机器资源
- 实现机制:
- 1.部署当前版本
- 2.部署service
- 3.部署新版本(使用新的deployment名称,新的label标签)
- 4.切换service标签到新的pod
2.2 案例
01 部署蓝环境
[root@master-1 blue-green]# cat 01-blue.yaml
kind: Deployment
apiVersion: apps/v1
metadata:name: liux-blue
spec:replicas: 3selector:matchLabels:app: bluetemplate:metadata:labels:app: bluespec:containers:- name: v1image: harbor.liux.com/liux-apps/apps:v1---kind: Service
apiVersion: v1
metadata:name: liux-app-svc
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 30080selector:app: blue
[root@master-1 blue-green]#
[root@master-1 blue-green]# kubectl apply -f 01-blue.yaml
deployment.apps/liux-blue created
service/liux-app-svc created#测试访问
[root@master-1 blue-green]# while true ; do sleep 0.5;curl 192.168.91.21:30080; done
02 部署绿环境
[root@master-1 blue-green]# cat 02-green.yaml
kind: Deployment
apiVersion: apps/v1
metadata:name: liux-green
spec:replicas: 3selector:matchLabels:app: greentemplate:metadata:labels:app: greenspec:containers:- name: mywebimage: harbor.liux.com/liux-apps/apps:v2
[root@master-1 blue-green]#
[root@master-1 blue-green]# kubectl apply -f 02-green.yaml
deployment.apps/liux-green created
[root@master-1 blue-green]#
03 部署切换服务的service
[root@master-1 blue-green]# cat 03-switch-svc-selector.yaml
kind: Service
apiVersion: v1
metadata:name: liux-app-svc
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 30080selector:# app: blueapp: green#切换为绿服务
[root@master-1 blue-green]# kubectl apply -f 03-switch-svc-selector.yaml
service/liux-app-svc configured
3.Deployment灰度发布(金丝雀发布)
3.1 简介
金丝雀发布也叫灰度发布,是指在黑与白之间,能够平滑度过的一种发布方式,灰度发布是增量发布的一种类型,灰度发布是在原有版本可用的情况下,同时部署一个新版本应用作为"金丝雀"(小白鼠),测试新版本的性能和表现,以保障整个体系稳定的情况下,尽早发现,调整问题。
灰度发布:旧版本和新版本共存
将新版本部署到一部分生产环境,让一部分用户先试用,如果没有问题,再逐步扩大范围,把全部服务都切换到新环境。
优点:用户体验影响小,灰度发布过程出现问题只影响部分用户
- 实现机制:
- 1.部署当前版本,使用多副本;(最开始是3个副本)
- 2.部署service,匹配一个label标签;
- 3.部署新版本(使用deployment名称,但是label标签和之前保持一致),新版本runing之后service会自动匹配label并将pod添加service的endpoints接收客户端请求;(最开始)
- 4.灰度版本测试没有问题,将灰度版本的pod副本数逐渐增加为生产数量;
- 5.将旧版本pod逐渐调低至为0,此时数流量将全部转发至新版本;
3.2 案例
01 部署旧版本
先将副本数设置为3,随着新版本的创建,将副本逐渐调低到0
[root@master-1 canary-huidu]# cat 01-old.yaml
kind: Deployment
apiVersion: apps/v1
metadata:name: liux-old
spec:replicas: 3selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:containers:- name: mywebimage: harbor.liux.com/liux-apps/apps:v1
---
kind: Service
apiVersion: v1
metadata:name: liux-web-svc
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 30080selector:app: web
[root@master-1 canary-huidu]#
[root@master-1 canary-huidu]# kubectl apply -f 01-old.yaml
deployment.apps/liux-old created
service/liux-web-svc created
02 部署新版本
先将副本数设置为1,随着新版本的稳定,将副本逐渐调高到3
[root@master-1 canary-huidu]# cat 02-new.yaml
kind: Deployment
apiVersion: apps/v1
metadata:name: liux-new
spec:replicas: 1selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:containers:- name: mywebimage: harbor.liux.com/liux-apps/apps:v2
[root@master-1 canary-huidu]#
[root@master-1 canary-huidu]#
[root@master-1 canary-huidu]# kubectl apply -f 02-new.yaml
deployment.apps/liux-new created
03 修改副本数量
将旧的副本数量手动修改从3-0,与此同时,将新的副本数量从1-3
[root@master-1 canary-huidu]# kubectl edit deploy liux-old
deployment.apps/liux-old edited
[root@master-1 canary-huidu]# kubectl edit deploy liux-new
deployment.apps/liux-new edited
04 测试访问
[root@master-1 canary-huidu]# while true ; do sleep 0.5;curl 192.168.91.22:30080; done
四、常见问题及故障排查
1. 常见问题
问题现象 | 可能原因 | 解决方案 |
pod始终处于pending | 资源不足/节点选择器不匹配 | 检查资源请求/节点标签 |
更新卡在Progressing | 就绪探针失败/新版本启动失败 | 检查 Pod 日志和探针配置 |
旧 ReplicaSet 未被删除 | revisionHistoryLimit 设置过大 | 清理历史版本 |
HPA 不生效 | metrics-server 未安装/资源指标不足 | 安装 metrics-server 并验证指标 |
2.故障排查
#查看deploy详细信息
kubectl describe deployment deploy-nginx-strategy#查看pod日志
kubectl logs -f deploy-nginx-strategy-578fdcfc5-tr2p5