一、說明
- 本文使用的ingress-nginx v1.0 最新版本,v1.0 適用於 Kubernetes 版本 >= v1.19 小於這個版本的k8s集群,請降級ingress-nginx。
二、部署
部署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