「INGRESS-NGINX-CONTROLLER」- Helm Chart | 官方

该笔记将记录:在 Kubernetes Cluster 中,通过 HELM 部署 Ingress Nginx Controller 的方法,以及相关问题的解决办法。该部分我们将使用 Helm Chart 来部署 Ingress Nginx Controller 组件。

认识

官网:https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx
文档:https://github.com/kubernetes/ingress-nginx/blob/main/charts/ingress-nginx/README.md
仓库:https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx

性质

部署多个实例

若要部署多个 Nginx Ingress Controller 实例,需要修改:

controller.ingressClassResource.name: nginx-backend

controller.ingressClassResource.controllerValue: k8s.io/ingress-nginx-backend

controller.ingressClass:

选择负载均衡

controller.service.annotations:

日志等级

controller.extraArgs.v: 5 | https://github.com/kubernetes/ingress-nginx/issues/1832

自定义配置

https://github.com/kubernetes/ingress-nginx/issues/12618

controller.allowSnippetAnnotations: true
controller.config.annotations-risk-level: Critical

构建

版本选择

Kubernetes 1.30

  • Ingress-NGINX version: v1.10.1 – v1.13.1
  • Helm Chart Version: 4.10.1 – 4.13.1

仓库无法访问

https://kubernetes.github.io/ingress-nginx

所以我们需要手动下载 Chart 并在本地进行安装,而无法在线安装;

镜像无法拉取

镜像默认为 registry.k8s.io 仓库,而我们的环境是无法访问的。

所以,我们预先将镜像提交到自建的镜像仓库,以使 Kubernetes 环境能够拉取镜像。

镜像摘要变化

Where can I find the sha256 code of a docker image? – Stack Overflow
go-containerregistry/crane.md at main · google/go-containerregistry · GitHub

当我们使用自建镜像仓库时,我们又遇到另外的问题:
1)当 docker tag 后,不同仓库地址的 Digest 不同。通过 docker inspect --format='{{index .RepoDigests 0}}' $IMAGE 会发现多个摘要;
2)当推送镜像后,将仅保留当前仓库的 Digest 信息;
3)而在 NGINX Ingress Controller 的 Chart 中,默认使用原始仓库的 Digest 来拉取镜像,进而导致镜像拉取失败;

通过 crane cp 命令,能够解决该问题:

./crane cp \
    registry.k8s.io/ingress-nginx/controller:v1.2.1  \
    registry.example.com/ingress-nginx/controller:v1.2.1

Kubernetes 1.30 / Ingress-NGINX v1.12.1 / Helm Chart 4.12.1 / without Load Balancer

# 04/10/2025

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx/
helm repo update ingress-nginx

helm search repo --versions ingress-nginx/ | grep 1.12.1
helm pull ingress-nginx/ingress-nginx --version 4.12.1

helm show values ./ingress-nginx-x.x.x.tgz > ingress-nginx-x.x.x.helm-values.yaml
vim ingress-nginx-x.x.x.helm-values.yaml
... Image Repository and Image Tag
... controller.service.enable: false
... controller.service.externalTrafficPolicy: "Local"
... controller.hostPort.enabled: true

helm upgrade --install --namespace ingress-nginx --create-namespace            \
    ingress-nginx ./ingress-nginx-x.x.x.tgz -f ingress-nginx.helm-values.yaml

helm upgrade --install --namespace ingress-nginx --create-namespace            \
    nginx ./ingress-nginx-x.x.x.tgz -f ingress-nginx.helm-values.yaml

注 1,环境复杂多变,如上配置仅适用于我们的环境。如若应用到其他环境中,可能需要按需调整其他配置。

Kubernetes 1.28 / Ingress-NGINX v1.11.1 / Helm Chart 4.11.1 / with Load Balancer

1)拉取镜像并上传自建镜像仓库;
2)通过 helm template 命令,生成 YAML 文件,并修改其中的镜像地址;
3)通过 kubectl 命令,完成 NGINX Ingress Controller 的部署;

Kubernetes 1.28 → Ingress-NGINX v1.11.1 / Helm Chart 4.11.1 # 08/09/2024

按照官方文档(Installation Guide)说明,通过如下命令来部署即可:

# --------------------------------------------------------- // 官方提供的安装过程

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace

# --------------------------------------------------------- // 我们使用的安装过程

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

helm search repo --versions ingress-nginx/
helm pull ingress-nginx/ingress-nginx --version 4.3.0
helm show values ./ingress-nginx-4.3.0.tgz > ingress-nginx.helm-values.yaml

helm upgrade --install --create-namespace                  \
    --namespace ingress-nginx                              \
    ingress-nginx ./ingress-nginx-4.3.0.tgz -f ingress-nginx.helm-values.yaml