1. 初识Kubernetes Ingress:为什么需要它?
想象一个场景:你的Kubernetes集群运行了10个微服务,每个服务都需要通过域名或路径对外暴露。如果直接使用NodePort
或LoadBalancer
,不仅端口管理混乱,SSL证书的更新更是噩梦。这时候Ingress应运而生——它像集群的"智能路由器",统一管理外部请求的路由规则、TLS终止、负载均衡。
举个例子,通过Ingress你可以轻松实现:
www.yourdomain.com/app1
转发到后端服务Aapi.yourdomain.com/v2
转发到服务B的v2版本- 自动为所有域名申请Let's Encrypt证书
2. 技术栈选择:为什么是Nginx Ingress?
在众多Ingress Controller中(如Traefik、HAProxy),Nginx Ingress Controller以性能稳定、功能丰富著称。其核心优势包括:
- 成熟生态:支持灰度发布、熔断、自定义注解
- 高性能:单实例可支持5万+ QPS
- 灵活配置:通过ConfigMap深度定制Nginx参数
kubectl get pods -n ingress-nginx
# 预期输出(部分):
# NAME READY STATUS RESTARTS
# ingress-nginx-controller-7658785c8b-tq5j2 1/1 Running 0
3. 部署Nginx Ingress Controller
3.1 基础安装(Helm方式)
# 添加Helm仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# 安装到ingress-nginx命名空间
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.service.type=LoadBalancer
3.2 验证安装
# 检查服务External-IP(AWS/GCP会显示负载均衡器地址)
kubectl get svc -n ingress-nginx
# 预期输出:
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
# ingress-nginx-controller LoadBalancer 10.96.32.117 35.189.76.102 80:32456/TCP,443:31902/TCP
4. 编写你的第一个Ingress规则
假设需要将请求按路径分发到不同服务:
/user
→ 用户服务(user-service:8080)/order
→ 订单服务(order-service:80)
# ingress-basic.yaml(技术栈:Nginx)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1 # 路径重写
spec:
rules:
- host: demo.yourdomain.com # 绑定的域名
http:
paths:
- path: /user/(.*) # 捕获路径参数
pathType: Prefix
backend:
service:
name: user-service
port:
number: 8080
- path: /order
pathType: Exact # 精确匹配路径
backend:
service:
name: order-service
port:
number: 80
5. HTTPS配置实战:自动证书管理
通过Cert-Manager实现Let's Encrypt证书自动申请:
# 安装Cert-Manager(需提前部署CRD)
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.1/cert-manager.yaml
# 创建ClusterIssuer(生产环境使用Let's Encrypt)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@yourdomain.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx # 指定使用的Ingress Controller
# 在Ingress中启用TLS
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-demo
spec:
tls:
- hosts:
- demo.yourdomain.com
secretName: demo-tls-secret # 证书存储的Secret名称
rules:
- host: demo.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
6. 高阶功能:熔断与超时控制
通过注解实现生产级保护策略:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: advanced-ingress
annotations:
nginx.ingress.kubernetes.io/proxy-connect-timeout: "15"
nginx.ingress.kubernetes.io/proxy-read-timeout: "20"
nginx.ingress.kubernetes.io/limit-rpm: "100" # 每分钟100请求
nginx.ingress.kubernetes.io/circuit-breaker: "5XX=10,10s" # 10秒内5XX错误触发熔断
spec:
rules:
- host: api.yourdomain.com
http:
paths:
- path: /v1
backend:
service:
name: api-v1
port: 8000
7. 应用场景与最佳实践
典型应用场景:
- 多域名/多路径托管:用单一入口管理数十个微服务
- 灰度发布:通过
canary
注解分流部分流量到新版本 - 跨命名空间路由:将
admin.yourdomain.com
路由到独立的运维命名空间
避坑指南:
- 路径冲突:避免同时使用
Prefix
和Exact
匹配同一路径 - 证书管理:提前设置证书自动续期监控
- 性能优化:配置HPA自动扩展Ingress Controller实例
8. 技术方案对比
方案 | 优点 | 缺点 |
---|---|---|
NodePort | 简单快速 | 端口冲突风险 |
LoadBalancer | 云厂商集成 | 成本高(每个服务独立LB) |
Ingress | 统一入口、成本最优 | 需维护路由规则 |
9. 总结
通过Nginx Ingress,我们实现了:
- 灵活的路由规则配置
- 零停机时间的证书轮换
- 生产级的流量管控能力
未来可探索的方向:
- 结合Service Mesh做更细粒度流量治理
- 通过OpenTelemetry实现链路监控
- 多集群Ingress联邦管理
评论