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 负责服务发现
  • 整套组合 = 生产微服务网关标准
相关推荐
9命怪猫9 小时前
[K8S小白问题集] - Calico好在哪里?
网络·云原生·容器·kubernetes
齐潇宇9 小时前
k8s-Helm管理器
linux·运维·云原生·容器·kubernetes
叶~小兮9 小时前
K8S进阶核心综合学习笔记(持久化存储+特殊容器+调度管理)
笔记·学习·kubernetes
Zhu75810 小时前
[软件部署]在k8s环境部署alist
云原生·容器·kubernetes
2401_8401922711 小时前
k8s的crd、operator、cr分别是什么?
运维·分布式·kubernetes·prometheus
Cat_Rocky12 小时前
K8S-Helm简单学习分享
学习·容器·kubernetes
ziqi52214 小时前
Docker compose 和共享数据
运维·docker·容器
您^_^14 小时前
专家(一):Claude Code 微服务实战——6 个服务从拆分到 K8s 部署,$0.45 全套 YAML 照抄
人工智能·windows·微服务·架构·kubernetes·个人开发·claude code
Zhu75815 小时前
[配置管理]k8s集群中airflow的端口转发
云原生·容器·kubernetes