K8s Ingress 七层网关 + 灰度发布 + HTTPS 实战

一、先搞懂:为什么要用 Ingress?

  • Service 只能做 4 层负载均衡(TCP)
  • Ingress 是 7 层网关(HTTP/HTTPS),可以:
    • 按域名/路径路由
    • HTTPS 证书配置
    • 重写 URL、限流、跨域
    • 灰度发布、黑白名单
    • 统一入口、减少端口暴露

最常用实现:Ingress-NGINX


二、整体架构

复制代码
用户请求 → 云厂商 SLB(LoadBalancer) → Ingress-NGINX → 微服务Service → Pod

三、第一步:安装 Ingress-NGINX

bash 复制代码
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

查看:

bash 复制代码
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx

得到 EXTERNAL-IP,就是网关入口 IP。


四、实战1:多域名路由(最常用)

1)部署两个服务(api、admin)

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
spec:
  replicas: 2
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - name: api
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: api-svc
spec:
  selector:
    app: api
  ports:
  - port: 80
---
# admin 同理,省略

2)创建 Ingress 路由规则

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: api.xxx.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-svc
            port:
              number: 80

  - host: admin.xxx.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: admin-svc
            port:
              number: 80

应用:

bash 复制代码
kubectl apply -f ingress.yaml

效果:

  • api.xxx.com → api 服务
  • admin.xxx.com → admin 服务

五、实战2:HTTPS 证书配置(免费 SSL)

1)生成证书(或用 cert-manager 自动签发)

bash 复制代码
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt

2)创建 Secret

bash 复制代码
kubectl create secret tls tls-secret --cert=tls.crt --key=tls.key

3)Ingress 开启 HTTPS

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: https-ingress
spec:
  tls:
  - hosts:
    - api.xxx.com
    secretName: tls-secret
  rules:
  - host: api.xxx.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-svc
            port:
              number: 80

访问 https://api.xxx.com 生效。


六、实战3:URL 重写、路径转发

annotation 开启重写:

yaml 复制代码
annotations:
  nginx.ingress.kubernetes.io/rewrite-target: /$1
  nginx.ingress.kubernetes.io/use-regex: "true"

示例:
api.xxx.com/user/1 → 转发到服务 /1

yaml 复制代码
paths:
- path: /user/(.*)
  pathType: Prefix
  backend:
    service:
      name: user-svc
      port:
        number: 80

七、实战4:灰度发布(按流量比例分流)

核心思路:

  • 两个 Deployment(v1、v2)
  • 同一个 Service
  • Ingress 按权重分流

1)Service 不变,匹配公共 label

yaml 复制代码
selector:
  app: demo

2)v1、v2 Deployment 都带 app: demo

3)Ingress 配置权重

yaml 复制代码
annotations:
  nginx.ingress.kubernetes.io/canary: "true"
  nginx.ingress.kubernetes.io/canary-weight: "30"  # 30% 流量到 v2

90% → v1

10% → v2

逐步切量,安全上线。


八、实战5:蓝绿发布

  • 先部署新版本 v2
  • 测试没问题
  • 修改 Service selector 指向 v2
  • 瞬间全量切换,回滚方便

九、生产常用高级注解

yaml 复制代码
annotations:
  # 限流
  nginx.ingress.kubernetes.io/limit-rps: "10"
  # 大小限制
  nginx.ingress.kubernetes.io/proxy-body-size: "100m"
  # 跨域
  nginx.ingress.kubernetes.io/enable-cors: "true"
  # 超时
  nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"
  # 灰度
  nginx.ingress.kubernetes.io/canary: "true"
  nginx.ingress.kubernetes.io/canary-weight: "20"

十、企业生产标准架构

复制代码
公网 → Cloud SLB → Ingress-NGINX
       → 网关限流、WAF
       → 域名路由
       → HTTPS
       → 灰度发布
       → 微服务 Service
       → Pod 负载均衡

十一、一句话总结

  • Ingress 是 K8s 7层统一网关
  • 负责域名、HTTPS、路由、灰度、安全
  • Service 负责内部4层负载均衡
  • CoreDNS 负责服务发现
  • 整套组合 = 生产微服务网关标准
相关推荐
不是书本的小明2 小时前
ACK+ESS实现K8s节点自动扩缩容
容器·kubernetes
恼书:-(空寄3 小时前
Docker Swarm + K8s 集群部署完整指南
docker·容器·kubernetes
石像鬼₧魂石3 小时前
ARL(资产灯塔)从 Docker 安装到部署启动 完整详细流程(复习专用)
运维·docker·容器
小江的记录本4 小时前
【Docker】Docker系统性知识体系与命令大全(镜像、容器、数据卷、网络、仓库)
java·网络·spring boot·spring·docker·容器·eureka
wuxingge4 小时前
docker部署私人影音库Plex
docker·容器
yuanlaile4 小时前
Linux Docker、Swarm、K8s分布式部署全集解析
linux·docker·kubernetes·k8s实战
小江的记录本5 小时前
【Docker】 Docker 全平台部署(Linux / Windows / MacOS)与 前后端分离项目 容器化方案
java·linux·windows·http·macos·docker·容器
小江的记录本6 小时前
【Docker】《 Docker 高频常用命令速查表 》
java·前端·后端·http·docker·容器·eureka
观测云6 小时前
Python 应用实现 APM 自动注入(Kubernetes 篇)
开发语言·python·kubernetes