Kubernetes 实战:用 Ingress-Nginx 管理流量与自动续期 HTTPS 证书

第一部分:Ingress-Nginx —— 流量管理的核心网关

1. 什么是 Ingress-Nginx?

2. 为什么需要 Ingress-Nginx?

3. 典型应用场景

4. 快速部署 Ingress-Nginx

第二部分:全自动 HTTPS 证书管理(Let's Encrypt)

1. 为什么需要自动证书续期?

2. 四步实现全自动 HTTPS

步骤 1:安装 cert-manager

步骤 2:配置 Let's Encrypt 颁发者

步骤 3:为 Ingress 启用自动 TLS

步骤 4:验证证书状态

3. 高级配置技巧

场景 1:通配符证书(需 DNS-01 挑战)

场景 2:多域名证书

4. 故障排查指南

第三部分:最佳实践与总结

1. Ingress-Nginx 运维建议

2. 证书管理注意事项

结论


在 Kubernetes 集群中,如何高效管理外部流量?如何为所有服务自动维护 HTTPS 证书?本文以运维视角,详解 Ingress-Nginx 的核心作用,并手把手教你通过 cert-manager 实现 Let's Encrypt 证书全自动续期。

第一部分:Ingress-Nginx —— 流量管理的核心网关

1. 什么是 Ingress-Nginx?

  • 定位:Kubernetes 官方推荐的 Ingress Controller,基于 Nginx 实现,充当集群流量的智能路由。

  • 组成

    • Ingress 资源:定义路由规则(YAML 配置文件)。

    示例yml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80

Ingress Controller:实时监听规则并更新 Nginx 配置。 

  • 实际执行路由规则的组件,本质是一个反向代理(基于 Nginx)。

  • 监听 Kubernetes API,动态更新 Nginx 配置以匹配 Ingress 资源定义的规则。

  • 部署方式:通常以 Deployment + Service(类型为 LoadBalancerNodePort)运行在集群内。

2. 为什么需要 Ingress-Nginx?

  • 传统痛点
    若为每个服务创建 LoadBalancer,会导致大量公网 IP 和端口,管理复杂且成本高。

  • 核心价值
    统一入口:通过单一 IP + 端口(80/443)路由所有 HTTP/HTTPS 流量。

3. 典型应用场景

场景 配置示例
多域名路由 blog.example.com → 博客服务,api.example.com → API 服务(通过不同的域名访问到不同的pod)
路径分流 /static → 静态资源服务,/api → 后端服务
灰度发布 10% 流量导向新版本,通过 canary-weight 注解配置
SSL 终止 集中管理 HTTPS 证书,减少后端服务加解密负担
防御 DDoS 全局速率限制(如 limit-rps: 100

4. 快速部署 Ingress-Nginx

# 通过 Helm 一键安装
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.service.type=LoadBalancer

验证安装

kubectl get svc -n ingress-nginx  # 查看 EXTERNAL-IP

第二部分:全自动 HTTPS 证书管理(Let's Encrypt)

1. 为什么需要自动证书续期?

  • Let's Encrypt 证书有效期仅 90 天,手动更新易出错。

  • cert-manager 是 Kubernetes 生态的标准工具,支持自动签发、续期、存储证书。

2. 四步实现全自动 HTTPS

步骤 1:安装 cert-manager
# 使用 Helm 安装(需提前安装 Helm)
kubectl create namespace cert-manager
helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --set installCRDs=true \
  --version v1.13.1  # 确认使用最新稳定版本
步骤 2:配置 Let's Encrypt 颁发者

创建 ClusterIssuer 资源(生产环境):yaml示例

# letsencrypt-prod.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]  # 替换为你的邮箱
    privateKeySecretRef:
      name: letsencrypt-prod-account-key
    solvers:
    - http01:
        ingress:
          class: nginx  # 必须与 Ingress-Nginx 的 class 匹配
#创建
kubectl apply -f letsencrypt-prod.yaml
步骤 3:为 Ingress 启用自动 TLS

在 Ingress 配置中添加 TLS 声明:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod  # 关键注解
spec:
  tls:
  - hosts:
    - myapp.example.com  # 你的域名
    secretName: myapp-tls-secret  # 证书存储的 Secret 名称
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80
步骤 4:验证证书状态
kubectl get certificate  # 查看证书状态是否为 Ready
kubectl describe secret myapp-tls-secret  # 查看证书内容

3. 高级配置技巧

场景 1:通配符证书(需 DNS-01 挑战)

yaml示例:

solvers:
- dns01:
    cloudflare:  # 以 Cloudflare 为例
      apiTokenSecretRef:
        name: cloudflare-api-token
        key: token
场景 2:多域名证书

yaml示例:

tls:
- hosts:
  - example.com
  - "*.example.com"  # 支持通配符
  secretName: wildcard-tls-secret

4. 故障排查指南

问题现象 检查点
证书未签发 域名解析是否正确?Ingress 是否可访问 80 端口?
自动续期失败 查看 cert-manager 日志:kubectl logs -n cert-manager deploy/cert-manager
HTTPS 访问报错 检查 Secret 是否存在且证书内容完整

第三部分:最佳实践与总结

1. Ingress-Nginx 运维建议

  • 高可用部署:至少运行 2 个 Pod,跨节点分布。

  • 安全加固

    • 限制 annotations 的修改权限

    • 启用 modsecurity 模块防御 Web 攻击

  • 性能调优

  • # values.yaml(Helm 配置)
controller:
  config:
    worker-processes: "4"
    keep-alive-requests: "10000"

2. 证书管理注意事项

  • 测试环境:先用 Let's Encrypt Staging 环境(server: https://acme-staging-v02.api.letsencrypt.org/directory)避免触发速率限制。

  • 监控告警:通过 Prometheus 监控证书过期时间。

结论

Ingress-Nginx 是 Kubernetes 流量管理的瑞士军刀,cert-manager 是证书自动化的终极方案。二者结合可实现:
✅ 零手动维护的 HTTPS 服务
✅ 灵活的路由策略
✅ 企业级的安全与稳定性 

你可能感兴趣的:(云计算,K8S,nginx专栏,kubernetes,nginx,运维,云原生,容器)