Ingress 的功能其實很容易理解:所謂 Ingress,就是 Service 的“Service”,代理不同後端 Service 而設定的負載均衡服務。
一、安裝ingress
1.查詢ingress安裝檔案
從github上檢視ingress對應k8s版本的deploy檔案,連結地址是:
https://github.com/kubernetes/ingress-nginx/tree/main/deploy/static/provider/baremetal
2.點選Raw按鈕可得到該檔案的url連結
3.在master節點上下載該檔案
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/1.21/deploy.yaml
4.更改檔名
mv deploy.yaml ingress-nginx.yaml
5.替換映象
由於國內訪問不了谷歌,需要更改ingress-nginx.yaml檔案中的映象,從docker hub上搜尋相關映象進行替換
k8s.gcr.io/ingress-nginx/controller:v1.1.2@sha256:28b11ce69e57843de44e3db6413e98d09de0f6688e33d4bd384002a44f7
8405c 替換成 liangjw/ingress-nginx-controller:v1.1.2
k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a
91b20cc67868660 替換成 liangjw/kube-webhook-certgen:v1.1.1
6.建立nginx ingress
kubectl apply -f ingress-nginx.yaml
7.檢視資源
kubectl get pod,svc -n ingress-nginx
8.在叢集外通過叢集內任意一臺節點的IP+Port就可以訪問
由於還沒有配置被代理的服務,所以返回404
二、配置
1.參考前面的章節部署nginx的deploy與service
服務名為:svc-nginx
2.配置ingress
建立ingress-svc.yaml檔案
vi ingress-svc.yaml
編寫檔案內容
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-demo
# 名稱空間不要忘了
namespace: dev
spec:
ingressClassName: nginx
rules:
- host: "demo.k8s.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
# 代理的服務名稱
name: svc-nginx
port:
# 服務埠
number: 8000
3.建立ingress物件
kubectl apply -f ingress-svc.yaml
4.檢視ingress物件的資訊
5.配置域名訪問
在windows宿主機上找到hosts檔案:
C:\Windows\System32\drivers\etc\hosts,
新增一條對映記錄(從三臺節點中任選一臺的IP進行對映):
192.168.59.112 demo.k8s.com
然後通過該域名加上ingress controller服務自己暴露的埠就可以訪問了,千萬要注意不是你代理的服務的埠。如下圖所示獲取ingress服務的埠
在瀏覽器就可以訪問被ingress代理的k8s服務了
三、路徑重寫
1.更新yaml檔案
vi ingress-svc.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
# 加上此重寫配置
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: ingress-demo
namespace: dev
spec:
ingressClassName: nginx
rules:
- host: "demo.k8s.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: svc-nginx
port:
number: 8000
- host: "demo2.k8s.com"
http:
paths:
- pathType: Prefix
path: "/nginx(/|$)(.*)"
backend:
service:
name: svc-nginx
port:
number: 8000
2.更新ingress物件
kubectl apply -f ingress-svc.yaml
3.檢視ingress物件
4.配置域名
在windows宿主機上找到hosts檔案:
C:\Windows\System32\drivers\etc\hosts,新增一條對映記錄:
192.168.59.112 demo2.k8s.com
在瀏覽器中訪問
四、限流配置
1.更新yaml檔案
vi ingress-svc.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
# 加上此重寫配置
nginx.ingress.kubernetes.io/rewrite-target: /$2
# 限流
nginx.ingress.kubernetes.io/limit-rps: "1"
name: ingress-demo
namespace: dev
spec:
ingressClassName: nginx
rules:
- host: "demo.k8s.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: svc-nginx
port:
number: 8000
- host: "demo2.k8s.com"
http:
paths:
- pathType: Prefix
path: "/nginx(/|$)(.*)"
backend:
service:
name: svc-nginx
port:
number: 8000
2.更新ingress物件
kubectl apply -f ingress-svc.yaml
3.測試
快速重新整理訪問會報異常,你可以自定義錯誤頁面
五、總結
目前,Ingress 只能工作在七層,而 Service 只能工作在四層。所以當你想要在 Kubernetes 裡為應用進行 TLS 配置等 HTTP 相關的操作時,都必須通過 Ingress 來進行。