Ingress 控制器
学习目标
- 理解 Ingress Controller 的作用和工作原理
- 掌握常见 Ingress Controller 的特点和选择
- 了解如何部署和配置 Ingress Controller
核心概念
一句话解释
Ingress Controller 是实际执行 Ingress 规则的组件,它监听 Ingress 资源变化并配置负载均衡器来处理流量转发。
Ingress Controller 工作原理
Ingress Controller 工作流程:
┌─────────────────────────────────────────────────────┐
│ Kubernetes │
│ ┌─────────────────────────────────────────────────┐│
│ │ Ingress Controller (Pod) ││
│ │ │ ││
│ │ │ 1. 监听 Ingress 资源变化 ││
│ │ ↓ ││
│ │ ┌─────────────────────────────────────────────┐││
│ │ │ 解析 Ingress 规则 │││
│ │ │ - 域名: app.example.com │││
│ │ │ - 路径: /api → Service B │││
│ │ └─────────────────────────────────────────────┘││
│ │ │ ││
│ │ │ 2. 配置负载均衡器 ││
│ │ ↓ ││
│ │ ┌─────────────────────────────────────────────┐││
│ │ │ Nginx / HAProxy / Envoy │││
│ │ │ - 更新配置文件 │││
│ │ │ - 热重载配置 │││
│ │ └─────────────────────────────────────────────┘││
│ └─────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────┘
↑
│ 3. 流量转发
↓
┌─────────────────────────────────────────────────────┐
│ Service → Pod │
└─────────────────────────────────────────────────────┘
常见 Ingress Controller
| Controller | 特点 | 适用场景 |
|---|---|---|
| Nginx Ingress | 稳定、社区活跃、配置灵活 | 通用场景 |
| Traefik | 自动发现、配置简单 | 动态环境 |
| HAProxy | 高性能、企业级 | 大规模部署 |
| Istio Gateway | 服务网格集成 | 微服务架构 |
| AWS ALB | 与 AWS 深度集成 | AWS 环境 |
Nginx Ingress Controller
Nginx Ingress Controller 架构:
┌─────────────────────────────────────────────────────┐
│ Nginx Ingress Controller │
│ ┌─────────────────────────────────────────────────┐│
│ │ Controller (Go) ││
│ │ - 监听 Kubernetes API ││
│ │ - 转换 Ingress 规则到 Nginx 配置 ││
│ └─────────────────────────────────────────────────┘│
│ ↓ │
│ ┌─────────────────────────────────────────────────┐│
│ │ Nginx ││
│ │ - 处理实际流量 ││
│ │ - SSL 终止 ││
│ │ - 负载均衡 ││
│ └─────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────┘
部署 Nginx Ingress Controller
# 使用 Helm 部署
# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# helm repo update
# helm install ingress-nginx ingress-nginx/ingress-nginx
# 或者使用 YAML 部署
# 下载官方配置
# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml
# 查看 Ingress Controller 状态
kubectl get pods -n ingress-nginx
kubectl get services -n ingress-nginx
# 查看 Ingress Controller 日志
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
Ingress Controller 配置
# ConfigMap 配置
apiVersion: v1
kind: ConfigMap
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
data:
# 启用 gzip 压缩
use-gzip: "true"
# 设置最大 body 大小
proxy-body-size: "10m"
# 自定义超时
proxy-connect-timeout: "10"
proxy-read-timeout: "120"
proxy-send-timeout: "120"
# 通过 Annotation 配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
IngressClass
# 定义 IngressClass
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx
---
# 使用 IngressClass
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
ingressClassName: nginx # 指定使用哪个 Controller
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
实践练习
练习 1:部署 Nginx Ingress Controller
# 使用 Helm 部署
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace
# 查看部署状态
kubectl get pods -n ingress-nginx
kubectl get services -n ingress-nginx
# 获取 Ingress Controller 的 External IP
kubectl get svc -n ingress-nginx ingress-nginx-controller
练习 2:创建 Ingress 并测试
# 部署应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo-server
spec:
replicas: 2
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- name: echo
image: ealen/echo-server
ports:
- containerPort: 80
---
# 创建 Service
apiVersion: v1
kind: Service
metadata:
name: echo-service
spec:
selector:
app: echo
ports:
- port: 80
targetPort: 80
---
# 创建 Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: echo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: echo-service
port:
number: 80
# 应用配置
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
# 查看 Ingress
kubectl get ingress echo-ingress
# 测试访问(需要配置 DNS 或 hosts 文件)
curl http://echo.example.com
练习 3:查看 Ingress Controller 日志
# 查看 Ingress Controller Pod
kubectl get pods -n ingress-nginx
# 查看日志
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx -f
# 访问应用,观察日志输出
curl http://echo.example.com
常见误解
1. Ingress Controller 是 Kubernetes 内置的
错误理解:Kubernetes 自带 Ingress Controller
正确理解:需要单独部署
Kubernetes 只提供 Ingress API
需要自己部署 Ingress Controller(如 Nginx、Traefik)
2. 所有 Ingress Controller 都一样
错误理解:不同的 Ingress Controller 可以互换
正确理解:不同 Controller 功能和配置不同
- Annotation 不通用
- 功能支持程度不同
- 性能特点不同
小结
| 要点 | 说明 |
|---|---|
| Ingress Controller | 执行 Ingress 规则的组件 |
| 工作原理 | 监听 Ingress 资源,配置负载均衡器 |
| 常见选择 | Nginx、Traefik、HAProxy、Istio |
| 配置方式 | ConfigMap、Annotation、IngressClass |
| 部署方式 | 需要单独部署,不是内置组件 |
练习编辑器
bash
Loading...