第一部分: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 证书全自动续期。
定位: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(类型为 LoadBalancer
或 NodePort
)运行在集群内。
传统痛点:
若为每个服务创建 LoadBalancer
,会导致大量公网 IP 和端口,管理复杂且成本高。
核心价值:
统一入口:通过单一 IP + 端口(80/443)路由所有 HTTP/HTTPS 流量。
场景 | 配置示例 |
---|---|
多域名路由 | blog.example.com → 博客服务,api.example.com → API 服务(通过不同的域名访问到不同的pod) |
路径分流 | /static → 静态资源服务,/api → 后端服务 |
灰度发布 | 10% 流量导向新版本,通过 canary-weight 注解配置 |
SSL 终止 | 集中管理 HTTPS 证书,减少后端服务加解密负担 |
防御 DDoS | 全局速率限制(如 limit-rps: 100 ) |
# 通过 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
Let's Encrypt 证书有效期仅 90 天,手动更新易出错。
cert-manager 是 Kubernetes 生态的标准工具,支持自动签发、续期、存储证书。
# 使用 Helm 安装(需提前安装 Helm)
kubectl create namespace cert-manager
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--set installCRDs=true \
--version v1.13.1 # 确认使用最新稳定版本
创建 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
在 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
kubectl get certificate # 查看证书状态是否为 Ready kubectl describe secret myapp-tls-secret # 查看证书内容
yaml示例:
solvers:
- dns01:
cloudflare: # 以 Cloudflare 为例
apiTokenSecretRef:
name: cloudflare-api-token
key: token
yaml示例:
tls:
- hosts:
- example.com
- "*.example.com" # 支持通配符
secretName: wildcard-tls-secret
问题现象 | 检查点 |
---|---|
证书未签发 | 域名解析是否正确?Ingress 是否可访问 80 端口? |
自动续期失败 | 查看 cert-manager 日志:kubectl logs -n cert-manager deploy/cert-manager |
HTTPS 访问报错 | 检查 Secret 是否存在且证书内容完整 |
高可用部署:至少运行 2 个 Pod,跨节点分布。
安全加固:
限制 annotations
的修改权限
启用 modsecurity
模块防御 Web 攻击
性能调优:
# values.yaml(Helm 配置)
controller:
config:
worker-processes: "4"
keep-alive-requests: "10000"
测试环境:先用 Let's Encrypt Staging 环境(server: https://acme-staging-v02.api.letsencrypt.org/directory
)避免触发速率限制。
监控告警:通过 Prometheus 监控证书过期时间。
Ingress-Nginx 是 Kubernetes 流量管理的瑞士军刀,cert-manager 是证书自动化的终极方案。二者结合可实现:
✅ 零手动维护的 HTTPS 服务
✅ 灵活的路由策略
✅ 企业级的安全与稳定性