一、安装Ingress Nginx

通常有两种方式:

  1. 部署一个独立的 Ingress 控制器 Pod:可以通过将 Ingress 控制器部署为一个独立 的 Pod,使用 Kubernetes Service 对其进行负载均衡和暴露服务。
  2. 部署一个 DaemonSet 类型的 Ingress 控制器:使特定节点上都运行一个 Ingress 控制器 Pod,并通过 Kubernetes Service 对其进行负载均衡和暴露服务。

安装Ingress Nginx Controller 的方式有多种,以下是其中的一些:

  • Helm安装(推荐):使用 Helm 工具,可以在 Kubernetes 集群上轻松安装和升级 Ingress Nginx Controller。
  • Kubernetes YAML 安装:使用 Kubernetes YAML 配置文件,可以在 Kubernetes 集群上安装 Nginx Ingress Controller。
  • Cloud安装:在某些云平台上,可以使用托管服务的形式安装 Nginx Ingress Controller,例如阿里云上的 ACK。

1.1 使用Helm安装Ingress Nginx

1、helm安装

下载地址:https://github.com/helm/helm/releases

说明:我用的Kubernetes版本为1.26.9,考虑到后期会升级Kubernetes版本,所以helm版本为3.11

[root@master01 ~]# k get no
NAME       STATUS   ROLES           AGE   VERSION
master01   Ready    control-plane   11d   v1.26.9
master02   Ready    control-plane   11d   v1.26.9
master03   Ready    control-plane   11d   v1.26.9
node01     Ready    <none>          11d   v1.26.9
node02     Ready    <none>          11d   v1.26.9

下载二进制包

$ wget https://get.helm.sh/helm-v3.11.3-linux-amd64.tar.gz

解压,改名并做软链接

$ tar zxf helm-v3.11.3-linux-amd64.tar.gz  -C /opt/
$ mv /opt/linux-amd64/  /opt/helm
$ ln -s /opt/helm/helm  /bin/

验证软链接

$ ll /bin/helm

lrwxrwxrwx 1 root root 14 Oct  5 22:00 /bin/helm -> /opt/helm/helm

测试,查看helm版本

$ helm version

version.BuildInfo{Version:"v3.11.3", GitCommit:"323249351482b3bbfc9f5004f65d400aa70f9ae7", GitTreeState:"clean", GoVersion:"go1.20.3"}

2、helm下载ingress-nginx

添加Helm仓库源

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

更新Helm仓库

$ helm repo update

查看

$ helm repo list

搜索Hlem仓库中的ingress-nginx

$ helm search repo ingress-nginx/ingress-nginx

下载到本地并解压

$ helm pull ingress-nginx/ingress-nginx --version 4.6.0  --untar

#如果下载不下来,可以直接访问https://github.com/kubernetes/ingress-nginx/releases/download/helm-chart-4.6.0/ingress-nginx-4.6.0.tgz进行下载

3、修改values.yaml文件

修改 ingress-nginx-contorller 的镜像仓库地址(同时一定要注释掉digest信息)

[root@master01 6]# cd ingress-nginx
[root@master01 ingress-nginx]# vim values.yaml

#Controller镜像地址
  image:
    registry: registry.cn-hangzhou.aliyuncs.com
    image: google_containers/nginx-ingress-controller
    tag: "v1.7.0"

image-20231130095408109

修改 kube-webhook-certgen 的镜像地址改为国内仓库地址(同时一定要注释掉digest信息)

[root@master01 6]# cd ingress-nginx
[root@master01 ingress-nginx]# vim values.yaml

#kube-webhook-certgen镜像地址
  image:
    registry: registry.cn-hangzhou.aliyuncs.com
    image: google_containers/kube-webhook-certgen
    tag: v20230312-helm-chart-4.5.2-28-g66a760794

image-20231130095318748

dnsPolicy 由ClusterFirst设置为 ClusterFirstWithHostNet

dnsPolicy: ClusterFirstWithHostNet

image-20231130095752589

hostNetwork 由false设置为 true

hostNetwork: true

image-20231130095834301

NodeSelector 处在原来的基础上添加 ingress: "true"部署至指定节点

nodeSelector:
    kubernetes.io/os: linux
    ingress: "true"

image-20231130095917871

类型由Deployment更改为 DaemonSet,用于确保在Kubernetes集群的每个节点上都部署一个ingress-nginx的副本

kind: DaemonSet

image-20231130100006530

1.2 安装 Ingress Nginx

选择节点打label

[root@master01 ~]# kubectl label node node01 node02 ingress=true

验证

[root@master01 ingress-nginx]# kubectl get node --show-labels | grep ingress=true
node01     Ready    <none>          13d   v1.26.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
node02     Ready    <none>          13d   v1.26.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux

创建命名空间

[root@master01 ~]# kubectl create ns ingress-nginx

进入到ingress-nginx目录,使用helm进行安装

[root@master01 ~]# cd /root/6/ingress-nginx
[root@master01 ingress-nginx]# helm install ingress-nginx -f values.yaml -n ingress-nginx .

查看helm部署情况

[root@master01 ingress-nginx]# helm list -n ingress-nginx
NAME            NAMESPACE       REVISION    UPDATED                                 STATUS      CHART               APP VERSION
ingress-nginx   ingress-nginx   1           2025-04-07 08:18:33.722210289 +0800 CST deployed    ingress-nginx-4.6.0 1.7.0

更新维护

#删除ingress-nginx
[root@master01 ~]# cd /root/6/ingress-nginx
[root@master01 ingress-nginx]# helm delete ingress-nginx -n ingress-nginx

#更新ingress-nginx
[root@master01 ~]# cd /root/6/ingress-nginx
[root@master01 ingress-nginx]# helm upgrade ingress-nginx ./ingress-nginx -f values.yaml -n ingress-nginx

查看ingress-nginx资源

[root@master01 ingress-nginx]# kg all -ningress-nginx
NAME                                 READY   STATUS    RESTARTS   AGE
pod/ingress-nginx-controller-44w46   1/1     Running   0          9h
pod/ingress-nginx-controller-5zl7w   1/1     Running   0          9h

NAME                                         TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                      AGE
service/ingress-nginx-controller             LoadBalancer   10.0.104.133   192.168.1.10   80:30431/TCP,443:32003/TCP   9h
service/ingress-nginx-controller-admission   ClusterIP      10.0.36.40     <none>         443/TCP                      9h

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                         AGE
daemonset.apps/ingress-nginx-controller   2         2         2       2            2           ingress=true,kubernetes.io/os=linux   9h

ingress-nginx-controller Service:这个Service负责将请求转发到ingress-nginx- controller Pods。它通常会将流量分发到ingress-nginx-controller的多个副本中,并确 保副本集的负载平衡。这个Service可以被配置为使用NodePort、LoadBalancer或 ClusterIP类型,根据需要进行暴露。

ingress-nginx-controller-admission Service:用于检查和验证Ingress中定义的规则 和设置是否正确。它可以确保在创建、更新或删除Ingress资源时,所有必需的配置项都 已正确设置,并防止不正确的配置影响到您的应用程序的运行。此服务还可以执行一些 自动化的操作,例如生成TLS证书并将其与相应的Ingress资源关联,以确保通过Ingress 的所有流量都以加密的方式传输。该Service也可以被配置为使用NodePort、 LoadBalancer或ClusterIP类型,根据需要进行暴露。