当前位置:网站首页 >  教程

高级运维生产级落地:Kubernetes Deployment蓝绿零停部署全流程

时间:2026年05月24日 11:30:22 来源:易频IT社区

前置准备

确保满足以下环境条件,否则无法完成后续操作

  • 已部署1.20及以上版本的单节点/多节点Kubernetes集群(推荐用1.25 LTS)
  • 本地已安装kubectl工具,且配置好访问集群的kubeconfig文件(~/.kube/config)
  • 本地已安装Docker或containerd,可拉取镜像(本文使用Nginx镜像)

快速验证前置条件

依次执行以下命令,无报错即通过

```bash 验证kubectl版本与集群版本兼容性 kubectl version --client --output=yaml kubectl version --server --output=yaml 验证集群节点状态 kubectl get nodes 验证本地镜像拉取能力 docker pull nginx:1.24.0 docker pull nginx:1.25.3 ```

编写蓝绿部署所需的基础Deployment资源

创建两个Deployment,分别对应蓝环境(nginx-blue,初始版本1.24.0)和绿环境(nginx-green,升级版本1.25.3),通过不同的标签区分

新建nginx-blue-deployment.yaml

以下为完整可复制内容

```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-blue namespace: default spec: replicas: 3 selector: matchLabels: app: nginx version: blue template: metadata: labels: app: nginx version: blue spec: containers: - name: nginx image: nginx:1.24.0 ports: - containerPort: 80 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi" ```

新建nginx-green-deployment.yaml

以下为完整可复制内容

```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-green namespace: default spec: replicas: 3 selector: matchLabels: app: nginx version: green template: metadata: labels: app: nginx version: green spec: containers: - name: nginx image: nginx:1.25.3 ports: - containerPort: 80 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi" ```

新建Service资源用于切换流量

新建nginx-service.yaml,初始selector指向蓝环境

```yaml apiVersion: v1 kind: Service metadata: name: nginx-service namespace: default spec: type: NodePort selector: app: nginx version: blue ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30080 ```

初始部署蓝环境并验证

部署所有资源

```bash kubectl apply -f nginx-blue-deployment.yaml kubectl apply -f nginx-green-deployment.yaml kubectl apply -f nginx-service.yaml ```

等待蓝绿环境Pod全部就绪

必须确保所有Pod状态为RunningREADY列显示3/3(对应每个Deployment的3副本)

```bash 实时查看Pod状态 kubectl get pods -w -l app=nginx ```

验证当前流量指向蓝环境

获取集群任意节点IP(以192.168.1.100为例),用curl或浏览器访问

```bash 替换为你的集群节点IP curl -H "Host: test.nginx.com" http://192.168.1.100:30080/ ```

正常返回Nginx 1.24.0默认页面或对应的响应头即可

切换流量至绿环境并验证

修改Service的selector

高级运维生产级落地:Kubernetes Deployment蓝绿零停部署全流程

执行以下命令快速替换,也可直接编辑nginx-service.yaml后apply

```bash kubectl patch service nginx-service -p '{"spec":{"selector":{"version":"green"}}}' ```

验证流量切换

```bash 连续执行10次,确保所有请求指向绿环境 for i in {1..10}; do curl -I -H "Host: test.nginx.com" http://192.168.1.100:30080/ | grep Server; sleep 0.5; done ```

正常情况下所有响应的Server字段应为nginx/1.25.3

蓝环境回滚流程

立即触发回滚

若绿环境出现问题,执行以下命令快速切回蓝环境

```bash kubectl patch service nginx-service -p '{"spec":{"selector":{"version":"blue"}}}' ```

回滚后验证

执行切换后的连续curl命令,确认所有请求返回nginx/1.24.0

生产优化建议

使用Ingress替代NodePort暴露服务

NodePort仅适用于测试,生产环境推荐安装Nginx Ingress Controller后使用Ingress规则切换流量,安装命令如下

```bash kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.4/deploy/static/provider/cloud/deploy.yaml ```

Ingress蓝绿切换规则

新建Ingress资源nginx-ingress.yaml,通过annotations和hostname区分初始流量,切换时修改path的backend

```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress namespace: default annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: test.nginx.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80 ```

使用金丝雀发布作为蓝绿的轻量替代

若不需要完全隔离的环境,可通过调整两个Deployment的副本数实现50%、10%等比例的流量切换

```bash 调整蓝环境副本为2,绿环境为1,实现1/3流量到绿环境 kubectl scale deployment nginx-blue --replicas=2 kubectl scale deployment nginx-green --replicas=1 ```

保留蓝绿环境至少1小时

生产环境切换后不要立即删除旧环境,观察应用日志、监控指标无异常后再操作

```bash 观察应用日志(绿环境) kubectl logs -f deployment/nginx-green 若部署了Prometheus+Grafana,可查看访问量、响应时间等指标 ```

删除旧环境命令

确认无误后执行

```bash kubectl delete deployment nginx-blue ```
标签 高级运维

相关推荐

最新

热门

推荐

精选

标签

易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。

Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图