ingress-nginx-controller 部署以及優化


一、說明

  • 本文使用的ingress-nginx v1.0 最新版本,v1.0 適用於 Kubernetes 版本 >= v1.19 小於這個版本的k8s集群,請降級ingress-nginx。

1、ingress-nginx github地址
2、官網

二、部署

部署ingress-nginx 比較簡單,直接下載github上的 deploy.yaml 部署即可,如果需要優化請看步驟三。
由於網絡問題鏡像如果拉取失敗,可以使用下面我提交到hub.docker 上的鏡像:

所需鏡像

# 對應官方k8s.gcr.io/ingress-nginx/controller:1.0


docker pull koala2020/ingress-nginx-controller:v1

#對應官方k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0

docker pull koala2020/ingress-nginx-kube-webhook-certgen:v1

1、下載 ingres-nginx 的 deploy.yaml 文件
由於github 上目錄比較多,涵蓋了幾乎所有平台,所以需要根據自己情況選擇,文章是centos 舉例:
下載 github 上 /deploy/static/provider/baremetal/ 目錄下的deploy.yaml

wget  https://github.com/kubernetes/ingress-nginx/blob/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml -O deploy.yaml 

2、部署
默認不做任何修改即可運行

kubectl apply -f  deploy.yaml

#刪除請使用:

kubectl delete -f  deploy.yaml

3、查看運行狀態
顯示Completed 狀態的是兩個已經完成任務Job 不用管。

[root@k8s-master01 baremetal]# kubectl get pods -n ingress-nginx 

NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-gsllw       0/1     Completed   0          94m
ingress-nginx-admission-patch-7bvsd        0/1     Completed   0          94m
ingress-nginx-controller-f54b4c9bd-tk7fn   1/1     Running     0          94m


#查看 service

[root@k8s-master01 baremetal]# kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.0.0.112   <none>        80:30220/TCP,443:32164/TCP   102m
ingress-nginx-controller-admission   ClusterIP   10.0.0.129   <none>        443/TCP                      102m

到此 ingress-nginx 就可以正常運行,如果集群中有ingres 項目,那么使用 項目域名:30220 端口號就可以訪問了,這個端口號是上面ingress-nginx-controller service nodePort隨機的。

三、優化

在步驟二里運行ingress-nginx 是不是感覺有問題,例如:
1、每次部署ingres-nginx 都隨機一個nodePort 是不是很不方便;
2、使用域名:端口 對外提供服務不人性化;
3、所有的訪問都集中在一個 ingres-nginx 上 pod,沒有起到負載均衡的作用(默認ingress-nginx v1.0 啟用一個副本);
所有綜上所訴我們還需要簡單的調整參數
4、由於新版本特性,需要ingress-nginx 需要增加 ingressClass,如果老項目沒有 ingressClass 怎么辦?

  • 負載均衡問題
    把配置文件里的 Deployment 換成 DaemonSet 模式,這樣保每一台node上都啟用 ingress-nginx-controller pod副本。

部分參數如下:

# Source: ingress-nginx/templates/controller-deployment.yaml
apiVersion: apps/v1
#kind: Deployment   //注釋掉
kind: DaemonSet     //改為此模式
metadata:
  labels:
    helm.sh/chart: ingress-nginx-4.0.1
...
...

  • 端口問題
    默認ingress-nginx 隨機提供node port 端口,體驗不好,因此需開啟hostNetwork 啟用80、443端口,配置如下:
    依然是修改 Deployment 下面的 spec
    spec:
      hostNetwork: true   //增加
      dnsPolicy: ClusterFirst
      containers:
        - name: controller
          image: koala2020/ingress-nginx-controller:v1 // 鏡像地址換成自己私有倉庫地址
          imagePullPolicy: IfNotPresent
          lifecycle:

  • ingressClass 問題
    如果不關心 ingressClass,或者很多沒有 ingressClass 配置的 ingress 對象,需要添加參數 ingress-controller --watch-ingress-without-class=true。
args:
  - /nginx-ingress-controller
  - --publish-service=$(POD_NAMESPACE)/ingress-nginx-dev-v1-test-controller
  - --election-id=ingress-controller-leader
  - --controller-class=k8s.io/ingress-nginx
  - --configmap=$(POD_NAMESPACE)/ingress-nginx-dev-v1-test-controller
  - --validating-webhook=:8443
  - --validating-webhook-certificate=/usr/local/certificates/cert
  - --validating-webhook-key=/usr/local/certificates/key
  - --watch-ingress-without-class=true  //新增
...
...

添加參數 - --watch-ingress-without-class=true 以后的ingres 會在 ADDRESS 綁定了后端的宿主機ip
而CLASS 為空是因為沒有寫jenkins的ingressClass,如果啟用- --watch-ingress-without-class=true 就不用在關心ingressClass 問題;


[root@k8s-master01 k8s]# kubectl  get ing -A
NAMESPACE   NAME      CLASS    HOSTS                 ADDRESS                                           PORTS     AGE
default     jenkins   <none>   jenkins.example.com   192.168.100.170,192.168.100.171,192.168.100.172   80, 443   3d8h

四、使用
1、老版本
后端兩個域名1.test.com 和2.test.com。kubernetes.io/ingress.class: "nginx"注釋自動發現所ingress。ingress 資源應放置在與后端資源相同的命名空間內。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"  //必須配置
spec:
  rules:
  - host: 1.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myservicea
            port:
              number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"  //必須配置
spec:
  rules:
  - host: 2.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myserviceb
            port:
              number: 80

2、新版本
k8s 集群 >= 1.19,上面的 Ingress 資源將不起作用。您需要部署以下內容以使其與新的 api 版本匹配。這將需要對 Ingress 對象進行如下更改,以及類型為“kind: IngressClass”的新對象

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
spec:
  rules:
  - host: 1.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myservicea
            port: 
              number: 80
  ingressClassName: nginx #新增特性
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
spec:
  rules:
  - host: 2.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myserviceb
            port: 
              number: 80
  ingressClassName: nginx #新增特性
---
# 新版本新增 IngressClass
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: k8s.io/ingress-nginx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM