Kubernetes helm chart 安装 ingress-nginx 一篇足以

背景

本文主要讲解kubernetes 如何使用helm chart安装 ingress-nginx

kubernetes 使用helm chart安装 ingress-nginx

1. ingres nginx controller 和 k8s版本 兼容性要求

https://github.com/kubernetes/ingress-nginx/blob/main/README.md#supported-versions-table
Supported Ingress-NGINX version k8s supported version Alpine Version Nginx Version Helm Chart Version
🔄 v1.11.2 1.30, 1.29, 1.28, 1.27, 1.26 3.20.0 1.25.5 4.11.2
🔄 v1.11.1 1.30, 1.29, 1.28, 1.27, 1.26 3.20.0 1.25.5 4.11.1
🔄 v1.11.0 1.30, 1.29, 1.28, 1.27, 1.26 3.20.0 1.25.5 4.11.0
🔄 v1.10.4 1.30, 1.29, 1.28, 1.27, 1.26 3.20.0 1.25.5 4.10.4
🔄 v1.10.3 1.30, 1.29, 1.28, 1.27, 1.26 3.20.0 1.25.5 4.10.3

2.安装环境

注: linux amd64 替换相关镜像版本 & helm3安装包即可-安装流程同理

linux arm64: 内核版本 4.18.0-348.20.1.el7.aarch64 #1 SMP Wed Apr 13 20:57:50 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
Kubernetes: v1.28.0
Docker: 26.1.4
ingress-nginx: 4.11.2

3.安装离线镜像准备

# 下载 ingress-controller依赖镜像(国内机器有墙无法拉取)
docker pull registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3
docker pull registry.k8s.io/ingress-nginx/controller:v1.11.2
# 导出为离线镜像
docker save -o kube-webhook-certgen-v1.4.3.tar registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3
docker save -o controller-v1.11.2.tar registry.k8s.io/ingress-nginx/controller:v1.11.2
# 安装k8s所有机器节点导入离线镜像
docker load -i controller-v1.11.2.tar
docker load -i kube-webhook-certgen-v1.4.3.tar

# docker images|grep ingress
registry.k8s.io/ingress-nginx/controller             v1.11.2   289a818c8d9c   2 weeks ago     294MB
registry.k8s.io/ingress-nginx/kube-webhook-certgen   v1.4.3    420193b27261   3 weeks ago     53.3MB


# 镜像打tag & push到本地仓库[可选]
#docker tag registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3 sealos.hub:5000/ingress-nginx/kube-webhook-certgen:v1.4.3
#docker push sealos.hub:5000/ingress-nginx/kube-webhook-certgen:v1.4.3
#docker tag registry.k8s.io/ingress-nginx/controller:v1.11.2 sealos.hub:5000/ingress-nginx/controller:v1.11.2
#docker push sealos.hub:5000/ingress-nginx/controller:v1.11.2

4.linux(amd64)安装 helm3

参考 https://helm.sh/zh/docs/intro/install/
https://github.com/helm/helm/releases

wget https://get.helm.sh/helm-v3.15.4-linux-amd64.tar.gz
tar -xvf helm-v3.15.4-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm version

5.创建k8s拉取镜像-镜像仓库验证鉴权信息

# 创建镜像仓库验证鉴权信息: k8s拉取验证 结合 imagePullSecrets: imagePullSecrets: - name: scr 引用使用
kubectl create secret docker-registry scr \
  -n ingress-nginx \
  --docker-server=http://sealos.hub:5000 \
  --docker-username=admin \
  --docker-password=123456 \
  --docker-email=jinze@ali.com
# 删除镜像仓库验证鉴权信息
kubectl delete secret -n ingress-nginx scr

# 查看解密secret内容
kubectl get secret  -n ingress-nginx scr --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode  

4.解压安装ingress-nginx

# helmchart 安装 ingrss nginx
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# helm列出所有版本:
helm search repo ingress-nginx/ingress-nginx -l
NAME                            CHART VERSION   APP VERSION     DESCRIPTION                                       
ingress-nginx/ingress-nginx     4.11.2          1.11.2          Ingress controller for Kubernetes using NGINX a...
ingress-nginx/ingress-nginx     4.11.1          1.11.1          Ingress controller for Kubernetes using NGINX a...
ingress-nginx/ingress-nginx     4.11.0          1.11.0          Ingress controller for Kubernetes using NGINX a...
ingress-nginx/ingress-nginx     4.10.4          1.10.4          Ingress controller for Kubernetes using NGINX a...
ingress-nginx/ingress-nginx     4.10.3          1.10.3          Ingress controller for Kubernetes using NGINX a...
ingress-nginx/ingress-nginx     4.10.2          1.10.2          Ingress controller for Kubernetes using NGINX a...
ingress-nginx/ingress-nginx     4.10.1          1.10.1          Ingress controller for Kubernetes using NGINX a...
ingress-nginx/ingress-nginx     4.10.0          1.10.0          Ingress controller for Kubernetes using NGINX a...

# helm 下载指定版本:4.11.2 
helm fetch ingress-nginx/ingress-nginx --version 4.11.2 

# 解压ingress-nginx4.11.2 版本安装包
tar -xvf ingress-nginx-4.11.2.tgz
# 编辑 ingress-nginx 配置 values.yaml
vi ingress-nginx/values.yaml 

# 配置controller镜像
controller:
  image:
    chroot: false
    registry: registry.k8s.io
    image: ingress-nginx/controller
    tag: "v1.11.2"
    #digest: sha256:d5f8217feeac4887cb1ed21f27c2674e58be06bd8f5184cacea2a69abaf78dce
    # digest 需配置为空才能拉取 registry.k8s.io/ingress-nginx/controller:v1.11.2 镜像
    digest:

# 配置admissionWebhooks镜像
controller:
  admissionWebhooks:
    patch:
      image:
        digest: sha256:a320a50cc91bd15fd2d6fa6de58bd98c1bd64b9a6f926ce23a600d87043455a3
        # digest 需配置为空才能拉取 registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3 镜像
        digest:

# ingress 暴露为NodePort
controller:
  service:
    #type: LoadBalancer
    type: NodePort
# k8s 拉取镜像仓库验证secret
#imagePullSecrets: []
imagePullSecrets: 
- name: scr
# helm chart 安装(存在就更新) ingress-nginx  
cd /root/ingress-nginx && helm upgrade --install ingress-nginx .  --namespace ingress-nginx --create-namespace 

# 卸载 ingress-nginx 
helm uninstall ingress-nginx -n ingress-nginx
# 查看安装 ingress 
helm list -A|grep ingress
# 验证ingress 组件状态,是否正常拉起
kubectl get svc -A |grep ingress
kubectl get pod -A |grep ingress
kubectl get deploy -n ingress-nginx               ingress-nginx-controller   -oyaml

# ingress-nginx 成功安装效果
[root@bj-arm-master ingress-nginx]# helm upgrade --install ingress-nginx .  --namespace ingress-nginx --create-namespace 
Release "ingress-nginx" has been upgraded. Happy Helming!
NAME: ingress-nginx
LAST DEPLOYED: Fri Sep  6 11:20:42 2024
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
Get the application URL by running these commands:
  export HTTP_NODE_PORT=$(kubectl get service --namespace ingress-nginx ingress-nginx-controller --output jsonpath="{.spec.ports[0].nodePort}")
  export HTTPS_NODE_PORT=$(kubectl get service --namespace ingress-nginx ingress-nginx-controller --output jsonpath="{.spec.ports[1].nodePort}")
  export NODE_IP="$(kubectl get nodes --output jsonpath="{.items[0].status.addresses[1].address}")"

  echo "Visit http://${NODE_IP}:${HTTP_NODE_PORT} to access your application via HTTP."
  echo "Visit https://${NODE_IP}:${HTTPS_NODE_PORT} to access your application via HTTPS."

An example Ingress that makes use of the controller:
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: example
    namespace: foo
  spec:
    ingressClassName: nginx
    rules:
      - host: www.example.com
        http:
          paths:
            - pathType: Prefix
              backend:
                service:
                  name: exampleService
                  port:
                    number: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
      - hosts:
        - www.example.com
        secretName: example-tls

If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls

6.配置 ingress 转发规则:

-- ingress配置demo1: 访问 路径/ 转发到后端 namespace为default的 bte-service的8080端口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: bte
 namespace: default
 #annotations:
   # 无论客户端请求的是哪个路径,Ingress 控制器都会将目标请求路径重写为根路径 /
   # 当用户访问 http://example.com/foo 时,NGINX Ingress Controller 会将请求重写为 http://my-service:80/。也就是说,任何通过 /foo 访问的请求都会转发到 my-service 服务,并且请求路径会被重写为根路径 /
   #nginx.ingress.kubernetes.io/rewrite-target: /
spec:
 # 指定 Ingress Controller 的类型 为 nginx 类型:告诉 Kubernetes,这个 Ingress 由 NGINX Ingress Controller 处理
 ingressClassName: nginx
 rules:
 #- host: "*"
 - http:
     paths:
     - path: /
       pathType: Prefix
       backend:
         service:
           name: bte-service
           port:
             number: 8080

-- ingress配置demo2:  访问 路径/layout 转发到后端 namespace为default的 layout-service的8080端口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: layout
 namespace: default
 annotations:
   # 无论客户端请求的是哪个路径,Ingress 控制器都会将目标请求路径重写为根路径 /
   # 当用户访问 http://example.com/foo 时,NGINX Ingress Controller 会将请求重写为 http://my-service:80/。也就是说,任何通过 /foo 访问的请求都会转发到 my-service 服务,并且请求路径会被重写为根路径 /
   nginx.ingress.kubernetes.io/rewrite-target: /
spec:
 # k8s 1.18版本后 指定 Ingress Controller 的类型 为 nginx 类型配置:告诉 Kubernetes,这个 Ingress 由 NGINX Ingress Controller 处理; 
 ingressClassName: nginx  
 rules:
 #- host: "*"
 - http:
     paths:
     - path: /layout
       pathType: Prefix
       backend:
         service:
           name: layout-service
           port:
             number: 8080

3.安装过程遇到安装失败问题处理

安装遇到问题: 无法正常拉取镜像ImagePullBackOff
# kubectl get pod -A |grep ingress
ingress-nginx      ingress-nginx-admission-create-nz6hv       0/1     ImagePullBackOff   0          64s
# kubectl describe pod -n ingress-nginx      ingress-nginx-admission-create-nz6hv 
问题1: 报错: 无法正常拉取镜像 registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3@sha256:a320a50cc91bd15fd2d6fa6de58bd98c1bd64b9a6f926ce23a600d87043455a3
image.png

image.png

此镜像版本比我们离线导入的image tag 多了 @sha256:a320a50cc91bd15fd2d6fa6de58bd98c1bd64b9a6f926ce23a600d87043455a3 信息

image.png
查看helm chart 源码分析问题原因

无法正常拉取镜像 registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3@sha256:a320a50cc91bd15fd2d6fa6de58bd98c1bd64b9a6f926ce23a600d87043455a3
vi /root/ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml & job-patchWebhook.yaml
digest: sha256:a320a50cc91bd15fd2d6fa6de58bd98c1bd64b9a6f926ce23a600d87043455a3

image.png

image.png

** fix: digest 设置为空即可 **


image.png
重启 ingress-nginx

helm upgrade --install ingress-nginx . --namespace ingress-nginx --create-namespace

问题2: 无法正常拉取镜像 registry.k8s.io/ingress-nginx/controller:v1.11.2@sha256:d5f8217feeac4887cb1ed21f27c2674e58be06bd8f5184cacea2a69abaf78dce
# kubectl get pod -A |grep ingress
ingress-nginx      ingress-nginx-controller-5bddfb7dbf-gzjsx   0/1     ImagePullBackOff   0          49s     100.78.46.152    bj-arm-node1    <none>           <none>
# kubectl describe pod -n ingress-nginx      ingress-nginx-controller-5bddfb7dbf-gzjsx
  Failed to pull image "registry.k8s.io/ingress-nginx/controller:v1.11.2@sha256:d5f8217feeac4887cb1ed21f27c2674e58be06bd8f5184cacea2a69abaf78dce": Error response from daemon: Get "https://registry.k8s.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
此镜像版本比我们离线导入的image tag 多了 @sha256:d5f8217feeac4887cb1ed21f27c2674e58be06bd8f5184cacea2a69abaf78dce 信息
查看helm chart 源码分析问题原因
cat /root/ingress-nginx/templates/controller-deployment.yaml
image.png
###### 检查当前目录下所有yaml文件中包含 字符串 ingress-nginx.imageDigest
grep -o "ingress-nginx.imageDigest"  ./*.*
# 输出 
/root/ingress-nginx/templates/_helpers.tpl 
image.png
image.png

image.png

fix: digest 设置为空即可

image.png

重启 ingress-nginx
helm upgrade --install ingress-nginx .  --namespace ingress-nginx --create-namespace 
ingress-nginx pod正常拉起,问题fix
# kubectl get pod -A |grep ingress
ingress-nginx      ingress-nginx-controller-785fcc99b-2zdhx   1/1     Running   0          22s
image.png

image.png

-- 问题fix!

参考文档

https://kubernetes.io/docs/concepts/services-networking/ingress/ ingress文档
https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/ Ingress Controllers 文档
-- ingress-nginx相关文档
https://github.com/kubernetes/ingress-nginx/blob/main/README.md#readme ingres nginx controller github文档
https://github.com/kubernetes/ingress-nginx Ingress-nginx 文档(支持 helm chart部署) use
https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx ingress-nginx helm chart文档
https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx#values ingress-nginx helm chart values.yaml 配置说明
https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/index.md
https://kubernetes.github.io/ingress-nginx/user-guide/tls/ ngress-nginx 配置文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容