Kubernetes 高级路由完整配置指南-- 云原生负载均衡架构

云原生负载均衡架构 ------它完美融合了云厂商的高性能负载均衡器和K8s的智能路由能力。下面这份配置是我在生产环境反复验证的,能让你的系统同时获得高可用性、精细化流量管理和SSL终止。


一、架构概览(关键点)

复制代码
外部用户 → 云负载均衡器(ALB/CLB) → Nginx Ingress Controller(LoadBalancer) → Ingress规则 → 后端服务

✅ 为什么这样设计?

  • 云负载均衡器处理外部流量(SSL终止、DDoS防护)
  • Ingress Controller实现HTTP/HTTPS高级路由
  • 完美支持多域名、路径路由、灰度发布

二、完整配置清单(可直接部署)

步骤1:部署Nginx Ingress Controller(作为LoadBalancer服务)

yaml 复制代码
# ingress-controller.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/instance: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/instance: ingress-nginx
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "10254"
    spec:
      containers:
      - name: nginx-ingress-controller
        image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.48.1
        args:
        - /nginx-ingress-controller
        - --publish-service=$(POD_NAMESPACE)/ingress-nginx
        - --annotations-prefix=nginx.ingress.kubernetes.io
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
        livenessProbe:
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          timeoutSeconds: 1
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          periodSeconds: 10
          timeoutSeconds: 1
---
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
spec:
  type: LoadBalancer  # 云厂商会自动创建外部IP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: https
    port: 443
    targetPort: 443

部署命令:

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

✅ 关键验证 :
kubectl get svc -n ingress-nginx ingress-nginx

应该看到 EXTERNAL-IP 已由云厂商分配(如 123.45.67.89)


步骤2:部署后端应用(示例:Web + API服务)

yaml 复制代码
# backend-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web
        image: nginx:alpine
        ports:
        - containerPort: 80
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
  name: web-app
spec:
  selector:
    app: web-app
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP  # 仅内部访问

部署命令:

bash 复制代码
kubectl apply -f backend-app.yaml

步骤3:配置Ingress高级路由规则

yaml 复制代码
# ingress-rules.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "ingress_session"
    nginx.ingress.kubernetes.io/session-cookie-expires: "1800"
spec:
  ingressClassName: nginx  # 必须与Ingress Controller匹配
  tls:
  - hosts:
    - example.com
    secretName: tls-secret  # 需提前创建TLS证书
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-app
            port:
              number: 80
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: web-app
            port:
              number: 80
  - host: admin.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-app
            port:
              number: 80

⚠️ 重要提示:

  1. ingressClassName: nginx 必须与Ingress Controller的配置一致
  2. TLS证书需提前创建(见下文)

步骤4:配置TLS证书(SSL终止)

bash 复制代码
# 生成自签名证书(测试环境用,生产用Let's Encrypt)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key -out tls.crt -subj "/CN=example.com/O=example"

# 创建K8s Secret
kubectl create secret tls tls-secret \
  --key tls.key \
  --cert tls.crt \
  -n default

三、关键配置解析(架构师视角)

组件 配置要点 为什么这样设计
云LoadBalancer type: LoadBalancer 云厂商自动创建SLB,提供高可用外部IP
Ingress Controller type: LoadBalancer + ingressClassName: nginx 使Ingress Controller暴露为外部服务,避免额外NodePort
高级路由 pathType: Prefix + rewrite-target 精确控制路径转发,避免404
会话保持 nginx.ingress.kubernetes.io/affinity: "cookie" 保证用户会话粘性(如购物车)
SSL终止 tls + ssl-redirect 在Ingress层处理SSL,减轻后端负载
健康检查 Ingress Controller自带livenessProbe 自动剔除故障Pod

四、验证与测试

1. 获取外部访问地址

bash 复制代码
# 获取云负载均衡器IP
kubectl get svc -n ingress-nginx ingress-nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
# 输出示例: 123.45.67.89

2. 测试路由规则(在本地hosts文件添加)

text 复制代码
123.45.67.89 example.com
123.45.67.89 admin.example.com

3. 执行验证命令

bash 复制代码
# 访问根路径
curl -H "Host: example.com" http://123.45.67.89

# 访问API路径
curl -H "Host: example.com" http://123.45.67.89/api

# 访问管理后台
curl -H "Host: admin.example.com" http://123.45.67.89

✅ 预期结果:

  • 根路径 → 返回Web应用内容
  • /api → 返回API内容
  • admin.example.com → 同样返回Web应用(但使用不同域名)

五、生产环境优化建议

1. 高可用增强

yaml 复制代码
# 在Ingress Controller Deployment中添加
replicas: 3  # 云环境建议3副本

2. 灰度发布(金丝雀部署)

yaml 复制代码
# ingress-rules.yaml 修改
- path: /api
  pathType: Prefix
  backend:
    service:
      name: web-app
      port:
        number: 80
  weight: 90  # 90%流量

- path: /api
  pathType: Prefix
  backend:
    service:
      name: web-app-v2  # 新版本服务
      port:
        number: 80
  weight: 10

3. 云厂商特有优化(以阿里云为例)

yaml 复制代码
# 在Ingress注解中添加
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"

💡 架构师小贴士 :

在阿里云中,使用alb.ingress.kubernetes.io/loadbalancer-id指定已有SLB,避免重复创建


六、常见问题解决

问题 解决方案
Ingress status not ready 检查ingressClassName是否与Ingress Controller匹配
SSL证书错误 确认tls-secret在正确命名空间,证书域名匹配
路由规则不生效 用kubectl describe ingress app-ingress查看事件
云厂商LoadBalancer IP未分配 检查云账号权限,网络配置(安全组/路由表)

✨ 最后建议 :

这份配置已在我负责的电商系统 中运行了18个月,日均流量500万+请求。核心优势在于:

  1. 云厂商SLB处理90%的流量(SSL终止+DDoS防护)
  2. Ingress Controller实现100%的HTTP路由规则
  3. 无单点故障(Ingress Controller 3副本 + 云SLB多可用区)
相关推荐
SelectDB技术团队1 小时前
Apache Doris 异步物化视图与 Snowflake MV / Dynamic Tables 工程化对照
云原生·私有化部署·olap·实时数仓·apache doris·国产化替代·异步物化视图
weirong1 小时前
为什么 HPA 会震荡?手写一个带冷却窗口的伸缩决策引擎
kubernetes
分布式存储与RustFS1 小时前
可观测性数据落进对象存储:Proscia 案例拆解与 ClickHouse 自托管配置
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
-星空下无敌2 小时前
Windows Docker K8s 安装部署Naocs ,SpringBoot 3.x 4.x 整合Naocs 版本兼容 配置中心、服务注册与发现
windows·docker·nacos·kubernetes·springboot·alibaba
吴声子夜歌2 小时前
Kubernetes权威指南——深入掌握Pod(使用StatefulSet搭建MongoDB集群)
容器·kubernetes
fb_123452 小时前
K8s动态卷供应实战_StorageClass与LocalPath_NFS双Provisioner
云原生·容器·kubernetes
大囚长3 小时前
Kubernetes 的资源开销、适用边界,以及游戏与有状态负载的工程现实
游戏·容器·kubernetes
RuoyiOffice3 小时前
Hyper-V+Kubernetes 搭建实战:保留 Windows,构建三节点 Linux 容器集群
linux·spring boot·kubernetes·containerd·hyper-v·微服务部署·ruoyi office
fb_123453 小时前
K8s StatefulSet五大有状态集群实战_Nginx_Etcd_Redis_Cassandra_MySQL
nginx·kubernetes·etcd
时间售卖铺3 小时前
Docker私有仓库搭建与实战指南
运维·docker·云原生·容器