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