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 负责服务发现
  • 整套组合 = 生产微服务网关标准
相关推荐
米高梅狮子17 小时前
06.Kubernetes Secret和Kubernetes Controllers
云原生·容器·kubernetes
雨奔18 小时前
Kubernetes 实操:创建 LimitRange 和 Pod 并管理内存资源
云原生·容器·kubernetes
lars_lhuan19 小时前
K8s跨命名空间SSL认证解决方案:Reflector工具实战
容器·kubernetes·ssl
郝开19 小时前
Docker Compose 本地环境搭建:redis
redis·docker·容器
爱莉希雅&&&20 小时前
Ansible+Docker案例(含ansible配置安装docker)
linux·运维·mysql·nginx·docker·容器·ansible
lulukanshijie20 小时前
Helm 入门:Kubernetes 包管理器介绍
其他·云原生·容器·kubernetes
王的宝库20 小时前
【K8s】集群安全机制(三):准入控制
网络·安全·kubernetes
七七powerful21 小时前
Kubernetes 弹性伸缩(HPA)设计思想深度解析
云原生·容器·kubernetes
雨奔21 小时前
Kubernetes Pod Preset 详解:自动注入 Pod 配置的高效方案
云原生·容器·kubernetes
爱编程的陶老师1 天前
K8s是什么?——第一集:从“搬箱子”到“自动化仓库”的革命
容器·kubernetes·自动化