「NGINX-INGRESS-CONTROLLER」- 通过 HELM 部署

  CREATED BY JENKINSBOT

问题描述

为了能够很好的进行配置管理,我们现在已经开始使用 HELM 来完成应用的部署。这里我们将使用 HELM 来部署 Ingress Nginx Controller 组件。

该笔记将记录:在 Kubernetes Cluster 中,通过 HELM 部署 Ingress Nginx Controller 的方法,以及相关问题的解决办法。

解决方案

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

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

但是存在如下问题:

仓库无法访问

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

# 在 Harbor 中,crane 无法使用多级镜像路径,即 registry.example.com/a/b/c/ingress-nginx/controller:v1.2.1 将失败;

我们最终的部署方式

通过 官方 仓库

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

通过 bitnami 仓库

Ingress object is binding to wrong IP address · Issue #5562 · kubernetes/ingress-nginx · GitHub

# helm search repo bitnami/nginx-ingress-controller
NAME                                    CHART VERSION   APP VERSION     DESCRIPTION                                       
bitnami/nginx-ingress-controller        9.3.2           1.3.0           NGINX Ingress Controller is an Ingress controll...

# helm pull bitnami/nginx-ingress-controller                                    # nginx-ingress-controller-9.3.2.tgz

helm show values ./nginx-ingress-controller-9.3.2.tgz > nginx-ingress-controller-9.3.2.helm-values.yaml
...(1)publishService.enabled: true,以使 Ingress 显示正确地址;

helm --namespace ingress-nginx                                                 \
    install ingress-nginx ./nginx-ingress-controller-9.3.2.tgz                 \
    -f nginx-ingress-controller-9.3.2.helm-values.yaml                         \
    --create-namespace

helm --namespace ingress-nginx                                                 \
    upgrade ingress-nginx ./nginx-ingress-controller-9.3.2.tgz                 \
    -f nginx-ingress-controller-9.3.2.helm-values.yaml

参考文献

Installation Guide – NGINX Ingress Controller