一、說明

  • 本文使用的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埠(ingress-nginx 使用的是7層代理),配置如下:

    依然是修改 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
  • ingressClass配置示例:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
name: nginx
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: k8s.io/ingress-nginx