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 负责服务发现
  • 整套组合 = 生产微服务网关标准
相关推荐
木雷坞几秒前
自托管 n8n:Docker Compose、Webhook 和升级备份排查
运维·容器
qq_4523962314 分钟前
第十八篇:《Docker 监控与性能优化》
docker·容器·性能优化
openFuyao42 分钟前
AI Native基础设施的目标形态和它存在的一些挑战有哪些?K8s驱动异构算力面临挑战,下一代的K8s是渐进式优化,还是革命式的驱动AI的发展
人工智能·容器·kubernetes
Albert Edison1 小时前
【Docker】镜像仓库(Registry)
运维·docker·容器
小猿姐1 小时前
MongoDB Kubernetes Operator 实测对比:Community、Percona 与 KubeBlocks,谁更适合团队落地?
数据库·mongodb·kubernetes
IT策士1 小时前
第 41 篇 k8s之监控:Metrics Server 与 Prometheus 快速上手
容器·kubernetes·prometheus
呆萌的代Ma1 小时前
解决docker网络问题,通过GitHub Actions打包dockerfile
docker·容器·github
qq_452396232 小时前
第十七篇:《Docker 日志管理:驱动配置与集中收集》
运维·docker·容器
张青贤2 小时前
centos7通过kubekey部署k8s集群
kubernetes·etcd·kubekey
SilentSamsara2 小时前
Python 服务的 K8s 部署:HPA/ConfigMap/Secret 完整配置
开发语言·python·青少年编程·容器·kubernetes