当前位置: 首页 > ops >正文

Kubernetes 从入门到精通-deployment控制器

一、Deployment 基础概念

1.Deployment 是什么

  • Kubernetes 中最常用的 无状态应用 部署方式。
  • 提供声明式的更新机制,管理 ReplicaSet 和 Pod。
  • 具有上线部署,副本设置,滚动升级,回滚等功能。

2.核心功能

  • Pod 副本管理:确保指定数量的 Pod 副本(Replicas)持续运行。
  • 滚动更新:逐步替换旧 Pod 为新版本,实现零停机发布。
  • 版本回滚:键回退到历史版本(基于 ReplicaSet 快照)。
  • 自动修复:节点故障时自动在新节点重建 Pod。
  • 扩缩容:通过 kubectl scale 或 HPA 动态调整 Pod 数量。
  • 暂停/恢复更新:控制更新流程,实现金丝雀发布。

3.核心特性对比

特性DeploymentStatefulSetDaemonSet
适合场景无状态应用有状态应用节点级部署
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

http://www.xdnf.cn/news/13719.html

相关文章:

  • 山东大学 2025 web数据管理期末复习总结
  • Python _Day52|神经网络调参指南
  • WLAN 技术指南:从入门到原理
  • git约定示提交
  • 005__C++类的基本语法
  • Ntfs!NtfsVolumeCheckpointDpc函数分析到调用Ntfs!NtfsCheckpointAllVolumes函数
  • 【AI论文】利用自注意力机制实现大型语言模型(LLMs)中依赖于输入的软提示
  • 数据结构学习20250612
  • 无人叉车 AGV 的智能物流枢纽逻辑:对接方式分类、技术原理与场景适配
  • 【android bluetooth 框架分析 04】【bt-framework 层详解 6】【Properties介绍】
  • FEC(Forward Error Correction)前向纠错快速了解
  • 【AS32系列MCU调试教程】硬件调试:JLink 驱动配置与调试技巧
  • 5 Android系统常用debug方法
  • [安卓按键精灵辅助工具]一些安卓端可以用的雷电模拟器adb命令
  • 行为模式-命令模式
  • Dagster 实现数据质量自动化:6大维度检查与最佳实践
  • 工厂模式demo
  • Peiiieee的Linux笔记(1)
  • 基于大模型预测的上睑下垂综合诊疗技术方案
  • 浅析4D-bev标注技术在自动驾驶领域的重要性
  • 数据库更新!万方
  • centos转移mysql的数据存储目录
  • 猎犬:快速 友好的桌面文本搜索软件 支持30+格式与高精度OCR
  • HTTP系列---有状态
  • 在MATLAB命令行执行ros2node 和 ros2subscriber后,执行ros2 topic list,MATLAB卡死
  • 云服务器如何搭建多站点?Nginx多域名部署方案详解 (2025)
  • 中国第七次人口普查100m网格化人口数据集(Tif/分省/分市)
  • 使用 VLC Media Player 轻松提取视频中的音频文件
  • 一分钟部署nginx-公网IP访问内网
  • RED DA认证-EN18031网络安全常见问题以及解答