55·网络进阶

Ingress 控制器

kubernetesnetworkingingress

Ingress 控制器

学习目标

  1. 理解 Ingress Controller 的作用和工作原理
  2. 掌握常见 Ingress Controller 的特点和选择
  3. 了解如何部署和配置 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...

继续学习

完成本课后,建议继续学习下一课「Ingress 规则」 以巩固所学知识。