能否通过Nginx Ingress在两个AKS集群间实现蓝绿部署?求实现方案
当然可以借助Nginx Ingress在两个AKS集群间实现蓝绿部署,核心是通过全局流量入口的Ingress Controller统一路由流量到蓝、绿环境,或者结合DNS完成平滑切换。以下是具体实现建议:
前提准备
- 蓝(现有AKS)、绿(新AKS)集群的应用服务已正常运行,且网络互通(如同一VPC、VPC对等连接打通)
- 拥有一个全局对外域名(如
app.example.com) - 蓝绿环境的应用接口规范一致,确保切换时用户无感知
方案一:独立全局Nginx Ingress Controller(推荐)
将Ingress Controller部署在独立集群或云负载均衡后,作为统一流量入口,直接路由到两个AKS集群的后端服务:
部署全局Ingress Controller
在独立K8s集群(或云托管的轻量K8s环境)部署Nginx Ingress Controller,绑定云厂商公网负载均衡(LB)并关联全局域名。确保该Controller能访问蓝、绿集群的后端服务。配置蓝绿服务的Endpoint映射
在Ingress Controller所在集群中,为蓝、绿环境的应用创建Service+Endpoint,指向对应AKS集群的服务地址:# 蓝色环境Service与Endpoint示例 apiVersion: v1 kind: Service metadata: name: app-blue spec: type: ClusterIP ports: - port: 80 targetPort: 8080 --- apiVersion: v1 kind: Endpoints metadata: name: app-blue subsets: - addresses: - ip: <蓝色AKS应用的Pod IP/NodePort地址> ports: - port: 8080同理创建
app-green的Service与Endpoint。通过Ingress规则切换流量
- 初始状态:Ingress仅路由到蓝色环境
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-blue-green annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: ingressClassName: nginx rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: app-blue port: number: 80 - 全量切换:修改Ingress的后端服务为
app-green即可完成流量切换 - 灰度验证:借助Canary注解拆分流量,逐步验证绿色环境
验证无误后,删除Canary Ingress并将主Ingress切换到绿色环境。# 新增绿色环境的Canary Ingress apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-green-canary annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "20" # 20%流量导向绿色环境 spec: ingressClassName: nginx rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: app-green port: number: 80
- 初始状态:Ingress仅路由到蓝色环境
方案二:DNS配合集群内Ingress切换
无需独立Ingress Controller,通过DNS解析切换流量:
为集群Ingress配置子域名
蓝色集群Ingress绑定blue.app.example.com,绿色集群Ingress绑定green.app.example.com,确保两个Ingress的公网LB可正常访问。初始流量指向蓝色环境
将全局域名app.example.com的DNS解析指向蓝色集群Ingress的LB地址。切换流量到绿色环境
验证绿色环境正常后,修改DNS解析,将app.example.com指向绿色集群Ingress的LB地址。若需灰度,可配置DNS权重解析,逐步提升绿色环境的流量占比。
关键注意事项
- 网络连通性:必须保证Ingress Controller能访问到两个AKS集群的后端服务,否则流量无法路由
- 会话保持:若应用需要会话持久化,需在Ingress中添加注解
nginx.ingress.kubernetes.io/affinity: "cookie",避免切换时用户会话中断 - 回滚机制:切换过程中实时监控应用状态,出现问题立即将Ingress规则或DNS切回蓝色环境
- 资源清理:迁移完成后,逐步下线蓝色环境的应用及相关资源
内容的提问来源于stack exchange,提问作者Rollson

