3. Ingress Controller 部署:Nginx Ingress Controller 的安装方式与架构

Nginx Ingress Controller 是 Kubernetes 生态中最广泛使用的 Ingress 实现之一。它作为反向代理和流量入口,负责将集群外部的 HTTP/HTTPS 请求路由到内部 Service。本章将深入讲解其核心部署架构,并对比 Helm 与 YAML 两种安装方式,帮助你在生产环境中做出正确选择。

3.1 部署架构图:Nginx Ingress Controller 在集群中的位置

下图展示了 Nginx Ingress Controller 在 Kubernetes 集群中的典型部署架构。它通常以 Deployment 形式运行,并通过 Service(类型为 LoadBalancer 或 NodePort)对外暴露。

Nginx Ingress Controller 部署架构图 Nginx Ingress Controller 部署架构图 外部用户 / 客户端 Ingress Service 类型: LoadBalancer / NodePort Nginx Ingress Controller (Deployment) Pod 1 nginx-ingress Pod 2 nginx-ingress Pod 3 nginx-ingress Ingress 资源 (YAML) 定义路由规则 / TLS / 注解 后端 Service (ClusterIP) 路由到应用 Pod
架构要点:Ingress Controller 并非 Kubernetes 内置组件,而是需要手动部署的第三方实现。它通过 watch 机制监听集群中的 Ingress 资源,动态更新 Nginx 配置,实现流量路由。

3.2 安装方式对比:Helm vs YAML

Nginx Ingress Controller 官方提供两种主流安装方式:Helm Chart 和 裸 YAML 清单。下表从多个维度对比两者的差异,帮助你根据团队和场景选择。

对比维度 Helm 安装 YAML 安装
安装复杂度 低,一条命令即可完成 中,需手动编辑多个 YAML 文件
配置灵活性 高,通过 values.yaml 覆盖默认参数 高,直接修改 YAML 清单
版本管理 支持版本回滚和升级 需手动管理版本,回滚较麻烦
参数覆盖 支持 --set 和 values 文件 需直接编辑 YAML 字段
生产推荐度 强烈推荐(标准化部署) 适合测试或定制化场景
依赖管理 自动处理依赖资源 需手动确保资源创建顺序

3.3 方式一:使用 Helm 安装 Nginx Ingress Controller

Helm 是 Kubernetes 的包管理工具,使用官方 Chart 可以快速部署并灵活配置。以下是标准安装步骤。

3.3.1 添加 Helm 仓库并更新

# 添加官方 Helm 仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

# 更新本地仓库索引
helm repo update

3.3.2 安装 Ingress Controller

# 创建命名空间
kubectl create namespace ingress-nginx

# 使用 Helm 安装(推荐生产级配置)
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.replicaCount=3 \
  --set controller.service.type=LoadBalancer \
  --set controller.service.externalTrafficPolicy=Local \
  --set controller.config.use-forwarded-headers="true"
关键参数说明:
  • controller.replicaCount:设置 Pod 副本数,生产环境建议 2-3 个。
  • controller.service.type:对外暴露方式,云环境用 LoadBalancer,本地测试可用 NodePort。
  • externalTrafficPolicy=Local:保留客户端真实 IP,避免 SNAT 问题。

3.3.3 验证部署状态

# 查看 Pod 运行状态
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

# 查看 Service 分配的 External IP
kubectl get svc -n ingress-nginx ingress-nginx-controller

3.4 方式二:使用 YAML 清单安装 Nginx Ingress Controller

对于无法使用 Helm 的环境,或需要深度定制 YAML 清单的场景,可以直接使用官方提供的部署 YAML 文件。

3.4.1 下载官方 YAML 清单

# 下载适用于 Kubernetes 1.25+ 的部署清单
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.0/deploy/static/provider/cloud/deploy.yaml

3.4.2 修改并应用 YAML 清单

下载后,建议根据生产需求修改以下关键字段:

  • Deployment 副本数:修改 spec.replicas 为 2 或 3。
  • Service 类型:将 type: LoadBalancer 改为 type: NodePort(如需要)。
  • 资源限制:添加 resources.requests 和 resources.limits。
# 应用修改后的 YAML 清单
kubectl apply -f deploy.yaml
注意:直接使用官方 YAML 清单时,请务必检查镜像版本与你的 Kubernetes 集群版本是否兼容。不兼容的版本可能导致 Controller 无法正常工作。

3.5 部署架构对比:Helm 与 YAML 的资源关系

无论使用哪种安装方式,最终部署的资源对象是相同的。下图展示了 Helm 与 YAML 两种方式在资源创建流程上的差异。

Helm 与 YAML 部署流程对比图 Helm 与 YAML 部署流程对比 Helm 安装流程 1. helm repo add / update 2. helm install (values.yaml) 3. 自动创建所有资源对象 4. 验证:kubectl get pods YAML 安装流程 1. 下载 / 编写 YAML 清单 2. 手动修改配置参数 3. kubectl apply -f deploy.yaml 4. 验证:kubectl get pods

3.6 生产环境部署建议

生产环境 Checklist:
  • 高可用部署:至少 2 个副本,并配置 Pod 反亲和性,避免单点故障。
  • 资源限制:为 Controller 容器设置 CPU/Memory 的 requests 和 limits,防止资源争抢。
  • 监控与日志:集成 Prometheus 指标采集,并配置访问日志持久化。
  • 安全加固:启用 HTTPS、配置 RBAC 权限、限制 Ingress 资源的访问范围。
  • 优雅升级:使用 Helm 的 helm upgrade 进行滚动更新,避免流量中断。
推荐做法:对于大多数生产集群,建议使用 Helm 方式部署,并将 values.yaml 纳入 GitOps 版本管理。这样既能保证部署的一致性,又能方便地追踪配置变更历史。