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

在 Kubernetes 集群中运行并发布应用程序

一、背景与应用场景

一、核心层级关系:Deployment → ReplicaSet → Pod

Deployment 不直接创建 Pod,而是通过控制 ReplicaSet 的生命周期,间接管理 Pod 副本。这种 “中间层” 设计是 Deployment 实现滚动更新、版本回滚的关键。

  • Pod:最底层的工作单元,运行容器化应用。
  • ReplicaSet:确保集群中始终运行指定数量的 Pod 副本(通过标签选择器匹配 Pod)。
  • Deployment:管理 ReplicaSet 的 “上层控制器”,负责 ReplicaSet 的创建、更新、回滚,并通过 ReplicaSet 间接控制 Pod。

二、核心功能解析

1. 副本管理与 “自愈” 机制

Deployment 的核心目标是:让集群中始终运行 spec.replicas 定义的期望 Pod 数量

  • 创建阶段:用户创建 Deployment 时,需指定 replicas(如 replicas: 3)。Deployment 会生成一个 ReplicaSet,由该 ReplicaSet 自动创建 3 个 Pod。
  • 自愈阶段:若某个 Pod 因 “节点故障”“容器崩溃” 等原因终止,ReplicaSet 会检测到 “实际 Pod 数量 < 期望数量”,立即创建新 Pod 补充,确保最终 Pod 数量始终匹配 replicas
2. 滚动更新(Rolling Update):无中断升级

当需要更新应用版本(如 Nginx 镜像从 1.18 升级到 1.20),Deployment 会通过 **“逐步替换 Pod”的方式实现无中断更新 **,避免服务完全不可用。

  • 过程

    1. 用户更新 Deployment(如 kubectl set image deployment/nginx-deployment nginx=nginx:1.20)。
    2. Deployment 会新建一个 ReplicaSet(记为 “新 ReplicaSet”),并为其指定新的镜像版本。
    3. 新 ReplicaSet 逐步增加新 Pod 数量,同时旧 ReplicaSet 逐步减少旧 Pod 数量,直到所有 Pod 都属于 “新 ReplicaSet”。(示例:若 replicas=3,可能先启动 1 个新 Pod → 终止 1 个旧 Pod → 再启动 1 个新 Pod → 终止 1 个旧 Pod → 最后启动 1 个新 Pod → 终止最后 1 个旧 Pod)。
  • 精细控制:可通过 maxSurge(升级时允许超出的最大 Pod 数,如 maxSurge: 25% 表示最多比 replicas 多 25% 的 Pod)和 maxUnavailable(升级时允许不可用的最大 Pod 数,如 maxUnavailable: 25% 表示最多有 25% 的 Pod 临时不可用),调整滚动更新的 “激进程度”。

3. 版本回滚(Rollback):快速恢复故障版本

若滚动更新后,新 Pod 出现 Bug(如镜像兼容问题),Deployment 支持回滚到历史稳定版本—— 因为每次更新都会保留旧 ReplicaSet(默认保留最近几个版本,可通过 revisionHistoryLimit 配置保留数量)。

  • 操作:执行 kubectl rollout undo deployment/<deployment-name>,Deployment 会重新激活旧 ReplicaSet,并逐步减少 “新 ReplicaSet” 的 Pod 数量,最终回到旧版本的 Pod 副本状态。

三、声明式控制:“期望状态” 驱动

Kubernetes 采用声明式 API,Deployment 的 spec 部分定义了 “期望的集群状态”(如要运行 3 个 nginx:1.20 的 Pod)。

Kubernetes 的 “控制器” 会持续监控集群的实际状态,并自动调整(如创建 / 删除 Pod、切换 ReplicaSet),使 “实际状态” 向 “期望状态” 靠拢。

例如:若手动删除了一个由 Deployment 管理的 Pod,ReplicaSet 会立即检测到 “Pod 数量不足”,并创建新 Pod 补充,最终让 Pod 数量回到 replicas 定义的期望数值。

总结:Deployment 的核心价值

通过 “Deployment → ReplicaSet → Pod” 的层级设计,Deployment 实现了三大核心能力:

  • 无中断滚动更新:保障应用升级时服务不中断;
  • 故障自愈:Pod 异常终止时自动重建,提升可用性;
  • 版本回滚:快速回退到历史版本,降低变更风险。

这使得 Deployment 成为 Kubernetes 中管理 “长期运行、需高可用性和版本管控的应用” 的核心资源对象

背景与应用场景(为什么用 K8s 部署 Nginx?适合哪些场景?)

要理解为何用 Kubernetes(K8s)部署 Nginx,以及其适用场景,需从「K8s 核心能力」与「Nginx 角色(反向代理、网关、负载均衡)」的结合点分析:

一、为什么用 Kubernetes 部署 Nginx?

K8s 为 Nginx 这类服务提供了自动化管理、高可用、弹性伸缩、服务治理等能力,解决了传统部署的诸多痛点:

1. 自动化部署与配置一致性

传统痛点:手动在多台服务器安装 Nginx、配置 nginx.conf(反向代理规则、静态资源路径等),易出现 **“配置漂移”(不同服务器配置不一致)。K8s 优势:通过 Deployment + ConfigMap 声明 Nginx 的 “期望状态”(镜像版本、副本数、配置文件),一次定义即可在集群中自动、一致地部署多份 Nginx 实例 **,避免人工操作误差。

2. 高可用与 “自愈” 能力

传统痛点:Nginx 进程崩溃或服务器故障时,需人工检测、重启服务,期间服务可能中断。K8s 优势:Deployment 会持续监控 Nginx Pod 的运行状态,若 Pod 因 “容器退出”“节点故障” 等原因终止,K8s 会自动在健康节点重建 Pod,保障服务持续可用。

3. 弹性伸缩(应对流量波动)

传统痛点:流量高峰时,需人工登录服务器增加 Nginx 实例、调整负载均衡,操作滞后且繁琐;低峰时又会浪费资源。K8s 优势:通过 HPA(Horizontal Pod Autoscaler),可基于 “CPU 使用率”“QPS” 等指标,自动增加 / 减少 Nginx Pod 数量,灵活应对突发流量(如电商大促、直播峰值)或低峰期资源节省。

4. 服务发现与集群内动态路由

K8s 集群内通常运行大量微服务(如后端 Java 服务、数据库服务),Nginx 需动态发现这些服务的地址。K8s 优势:通过 Service + 集群 DNS 机制,Nginx 可直接通过 “服务名”(如 backend-service.default.svc.cluster.local)解析集群内服务的 IP,无需硬编码后端地址,完美适配微服务的动态扩缩容。

5. 滚动更新与版本回滚

传统痛点:升级 Nginx 版本(或修改配置)时,需 “停旧服务 → 部署新服务”,导致短暂服务中断;若新版本有 Bug,回滚流程繁琐。K8s 优势:支持 滚动更新(逐步替换旧 Nginx Pod 为新版本,全程不中断服务);若新版本故障,可通过 kubectl rollout undo 一键回滚到历史稳定版本。

二、适合的场景

结合 K8s 的能力,Nginx 在以下场景中特别适合通过 K8s 部署:

1. 大规模微服务集群的 “统一入口层”

当集群内有数十、上百个微服务时,Nginx 可作为反向代理网关

  • 对外暴露统一域名(如 api.example.com),通过 location 配置将请求路由到不同微服务;
  • 集中处理 TLS 加密(HTTPS)、请求限流、日志收集、跨域处理等 “边缘能力”,减少每个微服务的重复开发。
2. 高并发 + 弹性伸缩的场景

如电商网站、直播平台、在线教育系统:

  • 流量低峰时,K8s 自动缩减 Nginx Pod 数量,节省集群资源;
  • 流量高峰(如秒杀活动、直播开播)时,HPA 自动扩容 Nginx 实例,承载更大并发请求。
3. 多环境(开发 / 测试 / 生产)一致性要求高的场景

企业内有 “开发、测试、预发、生产” 等多个环境时,通过 K8s 的 YAML 配置 + GitOps 流程,可确保 “开发环境的 Nginx 配置,一键同步到生产环境”,避免环境差异导致的故障。

4. 高可用优先的关键业务

若 Nginx 是业务的 “流量入口”(如核心 API 网关),K8s 的 “多节点部署 + 自愈能力” 可保障:即使部分节点故障,Nginx Pod 会在其他健康节点自动重建,服务不中断。

5. 与 K8s 生态深度集成的场景
  • 作为 Ingress Controller:用 Nginx 实现 K8s 的 Ingress(如 nginx-ingress-controller),统一管理集群内外的 HTTP/HTTPS 路由;
  • 与服务网格(Service Mesh)协同:Nginx 作为 “边缘代理”,与网格内的 Sidecar(如 Envoy)配合,实现灰度发布、熔断、限流等高级流量治理能力。

总结

只要场景需要自动化运维、高可用、弹性伸缩、服务治理中的任意一项,用 K8s 部署 Nginx 都能带来明显优势;尤其是微服务集群、高并发系统、多环境协同的场景,收益更为突出。

        已成功创建 Kubernetes 集群(如通过 kind 或云厂商集群),且 kubectl 工具可正常连接集群。

二、步骤 1:创建 Nginx Deployment(使用国内镜像)

        Deployment 用于管理 “多副本 Nginx Pod”,确保应用高可用。

        1.编写 Deployment 配置文件

[root@host2 ~]# vi nginx-deploy.yaml
[root@host2 ~]# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploylabels:app: nginx-deploy
spec:replicas: 2selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: registry.cn-hangzhou.aliyuncs.com/library/nginx:1.14.2ports:- name: nginx-portcontainerPort: 80

        2.应用 Deployment 配置

        执行命令创建 Deployment:

[root@host2 ~]# kubectl apply -f nginx-deploy.yaml
deployment.apps/nginx-deploy created

        3.验证 Deployment 和 Pod

[root@host2 ~]# kubectl get pod nginx-5f8f49fff4-sxzf9 -o jsonpath='{.spec.containers[0].image}{"\n"}'
nginx:alpine
[root@host2 ~]# vi nginx-deploy.yaml
[root@host2 ~]# vi nginx-deploy.yaml
[root@host2 ~]# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploylabels:app: nginx-deploy
spec:replicas: 2selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:alpineports:- name: nginx-portcontainerPort: 80
[root@host2 ~]# kubectl apply -f nginx-deploy.yaml
deployment.apps/nginx-deploy configured
[root@host2 ~]# kubectl delete pods -l app=nginx-pod
pod "nginx-deploy-59d796c49f-8r27s" deleted from default namespace
pod "nginx-deploy-59d796c49f-9qvmc" deleted from default namespace
[root@host2 ~]# kubectl get pods -w
NAME                            READY   STATUS    RESTARTS       AGE
nginx-5f8f49fff4-sxzf9          1/1     Running   15 (26m ago)   123m
nginx-deploy-59d796c49f-6cpws   1/1     Running   1 (7s ago)     8s
nginx-deploy-59d796c49f-hxw6h   1/1     Running   1 (7s ago)     8s
^Z
[1]+  已停止               kubectl get pods -w
[root@host2 ~]# kubectl get deployment nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   2/2     2            2           24m

三、步骤 2:创建 Nginx Service(NodePort 类型,对外暴露)

        Service 用于将 Nginx Pod 暴露给外部访问(通过 “节点 IP + 端口” 访问)。

        1.编写 Service 配置文件

[root@host2 ~]# vi nginx-service.yaml
[root@host2 ~]# cat nginx-service.yaml
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:type: NodePortselector:app: nginx-podports:- port: 8080targetPort: 80nodePort: 30008

        2.应用 Service 配置

[root@host2 ~]# kubectl apply -f nginx-service.yaml
service/nginx-svc created

        3.验证 Service

[root@host2 ~]# kubectl get service nginx-svc
NAME        TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
nginx-svc   NodePort   10.96.96.20   <none>        8080:30008/TCP   19s

四、步骤 3:测试访问(集群内 + 集群外)

        1.集群内访问(通过 Service ClusterIP)

/ # curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
/ # exit

        2.集群外访问(通过 “节点 IP + NodePort”)

[root@host2 ~]# curl 192.168.197.10:30008
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

五、步骤 4:清理资源(可选)

        测试完成后,删除 Deployment 和 Service:

[root@host2 ~]# kubectl delete -f nginx-service.yaml
service "nginx-svc" deleted from default namespace
[root@host2 ~]# kubectl delete -f nginx-deploy.yaml
deployment.apps "nginx-deploy" deleted from default namespace

关键说明

  • 国内镜像加速:使用 registry.cn-hangzhou.aliyuncs.com/library/nginx 替代外网 docker.io/nginx,避免海外拉取镜像的网络问题,提升速度。
  • NodePort 范围nodePort 需在 30000-32767 之间,且确保节点端口未被其他服务占用。
  • 标签匹配:Service 的 selector 必须与 Deployment 中 Pod 的 labels 完全一致,否则 Service 无法找到对应的 Pod。

        可参考:基于 kind 部署 Kubernetes 集群-CSDN博客

**“Deployment 工作原理解析”**

一、核心层级关系:Deployment → ReplicaSet → Pod

Deployment 不直接创建 Pod,而是通过控制 ReplicaSet 的生命周期,间接管理 Pod 副本。这种 “中间层” 设计是 Deployment 实现滚动更新、版本回滚的关键。

  • Pod:最底层的工作单元,运行容器化应用。
  • ReplicaSet:确保集群中始终运行指定数量的 Pod 副本(通过标签选择器匹配 Pod)。
  • Deployment:管理 ReplicaSet 的 “上层控制器”,负责 ReplicaSet 的创建、更新、回滚,并通过 ReplicaSet 间接控制 Pod。

二、核心功能解析

1. 副本管理与 “自愈” 机制

Deployment 的核心目标是:让集群中始终运行 spec.replicas 定义的期望 Pod 数量

  • 创建阶段:用户创建 Deployment 时,需指定 replicas(如 replicas: 3)。Deployment 会生成一个 ReplicaSet,由该 ReplicaSet 自动创建 3 个 Pod。
  • 自愈阶段:若某个 Pod 因 “节点故障”“容器崩溃” 等原因终止,ReplicaSet 会检测到 “实际 Pod 数量 < 期望数量”,立即创建新 Pod 补充,确保最终 Pod 数量始终匹配 replicas
2. 滚动更新(Rolling Update):无中断升级

当需要更新应用版本(如 Nginx 镜像从 1.18 升级到 1.20),Deployment 会通过 **“逐步替换 Pod”的方式实现无中断更新 **,避免服务完全不可用。

  • 过程

    1. 用户更新 Deployment(如 kubectl set image deployment/nginx-deployment nginx=nginx:1.20)。
    2. Deployment 会新建一个 ReplicaSet(记为 “新 ReplicaSet”),并为其指定新的镜像版本。
    3. 新 ReplicaSet 逐步增加新 Pod 数量,同时旧 ReplicaSet 逐步减少旧 Pod 数量,直到所有 Pod 都属于 “新 ReplicaSet”。(示例:若 replicas=3,可能先启动 1 个新 Pod → 终止 1 个旧 Pod → 再启动 1 个新 Pod → 终止 1 个旧 Pod → 最后启动 1 个新 Pod → 终止最后 1 个旧 Pod)。
  • 精细控制:可通过 maxSurge(升级时允许超出的最大 Pod 数,如 maxSurge: 25% 表示最多比 replicas 多 25% 的 Pod)和 maxUnavailable(升级时允许不可用的最大 Pod 数,如 maxUnavailable: 25% 表示最多有 25% 的 Pod 临时不可用),调整滚动更新的 “激进程度”。

3. 版本回滚(Rollback):快速恢复故障版本

若滚动更新后,新 Pod 出现 Bug(如镜像兼容问题),Deployment 支持回滚到历史稳定版本—— 因为每次更新都会保留旧 ReplicaSet(默认保留最近几个版本,可通过 revisionHistoryLimit 配置保留数量)。

  • 操作:执行 kubectl rollout undo deployment/<deployment-name>,Deployment 会重新激活旧 ReplicaSet,并逐步减少 “新 ReplicaSet” 的 Pod 数量,最终回到旧版本的 Pod 副本状态。

三、声明式控制:“期望状态” 驱动

Kubernetes 采用声明式 API,Deployment 的 spec 部分定义了 “期望的集群状态”(如要运行 3 个 nginx:1.20 的 Pod)。

Kubernetes 的 “控制器” 会持续监控集群的实际状态,并自动调整(如创建 / 删除 Pod、切换 ReplicaSet),使 “实际状态” 向 “期望状态” 靠拢。

例如:若手动删除了一个由 Deployment 管理的 Pod,ReplicaSet 会立即检测到 “Pod 数量不足”,并创建新 Pod 补充,最终让 Pod 数量回到 replicas 定义的期望数值。

总结:Deployment 的核心价值

通过 “Deployment → ReplicaSet → Pod” 的层级设计,Deployment 实现了三大核心能力:

  • 无中断滚动更新:保障应用升级时服务不中断;
  • 故障自愈:Pod 异常终止时自动重建,提升可用性;
  • 版本回滚:快速回退到历史版本,降低变更风险。

这使得 Deployment 成为 Kubernetes 中管理 “长期运行、需高可用性和版本管控的应用” 的核心资源对象

http://www.dtcms.com/a/423881.html

相关文章:

  • Node.js面试题及详细答案120题(81-92) -- 框架与生态篇
  • 永久网站域名注册网页版传奇大全
  • 软考~系统规划与管理师考试—知识篇—第二版—1.2 信息技术及其发展
  • 常德网站开发服务抚顺网络推广
  • 建设网站的个人心得青冈网站建设
  • LeetCode 分类刷题:33. 搜索旋转排序数组
  • Pi Network创始人Dr. Chengdiao Fan将在TOKEN2049发表演讲,探讨加密货币现实应用
  • 网站建设工具哪家好邵阳网站建设制作
  • 【WSL2】win11访问ubuntu
  • 网站建设专家排名信誉好的龙岗网站设计
  • SpringWebFlux:响应式Web框架
  • 网站建设中的图片及视频要求青岛的互联网企业
  • CS231n 2025——作业参考与学习笔记导航页
  • 【Android之路】 Kotlin 的 data class、enum class、sealed interface
  • 公司网站注册要多少钱网页设计作业 介绍家乡
  • [特殊字符]函数指针:C语言的动态灵魂,嵌入式的超能力(202589)
  • 海口网站建设高端asp.net做电商网站
  • C++ 面向对象进阶:继承深化与多态详解
  • 达建网站长沙网站快速排名优化
  • 网站浏览器兼容性问题吗产品介绍网站源码
  • 20.Nginx 服务器
  • CTFshow萌新杂项详细解题攻略及学习笔记
  • jsp网站服务器如何做防护飘云网络科技有限公司
  • Effective Python 第34条: 避免使用 `send()` 给生成器注入数据
  • wordpress站内301上海对外经贸大学
  • 当AI助手“记忆混乱”:理解与应对Roo Code的上下文污染问题
  • Docker 网络详解:(二)虚拟网络环境搭建与测试
  • 【Docker】在项目中如何实现Dockerfile 文件编写
  • 专门做任务的网站吗wordpress数据库文件
  • AMD KFD的BO设计分析系列5-3:VM-amdgpu_bo_va_mapping