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 负责服务发现
  • 整套组合 = 生产微服务网关标准
相关推荐
Patrick_Wilson1 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生2 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭2 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美3 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵3 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
武子康6 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
2601_961875249 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj9 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
程序员老赵9 天前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops