定義 ingress —— 進入或進入的行為;進入的權利;進入的手段或地點;入口
一個重要的原因是每個 LoadBalancer 服務都需要自己的負載平衡器,以及獨立擁有的公開IP,而 ingress 只需要一個公開IP就能為許多服務提供訪問。當客戶端發送HTTP請求到ingress時,ingress會根據請求的 hostname 和 request path 來決定讓請求轉發到哪個服務,如下圖。
ingress在網路第七層應用層(HTTP)實作,並且可以提供一些原本服務資源不能實現的功能,例如:針對cookie方式來達到session affinity(親和性)。
強調必須有 ingress controller 的叢集中運行,ingress 資源才能正常工作,不同的k8s環境使用不同的ingress controller實作,如:GKE使用GCP帶有HTTP負載平衡模組來提供ingress功能。 一般自建的k8s(如minikube)通常預設沒有提供ingress controller,則必須手動啟用或者自行安裝ingress controller。
補充:在進行以下範例,請先安裝好 ingress controll,可以參考 k8s 整合MetalLB+nginx ingress
確保k8s叢集已經正常運行ingress controller,就可以建立一個 ingress資源,kubia-ingress.yaml 如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kubia
annotations:
kubernetes.io/ingress.class: nginx # 使用 nginx ingress controller
spec:
rules:
- host: kubia.example.com # ingress 會根據此hostname對應到你的service
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kubia-nodeport # 將請求轉發到 kubia-nodeport服務的port 80
port:
number: 80
以上定義了一個單一規則的ingress,確保 ingress controller 收到header裡面 hostname=kubia.example.com 的HTTP請求,將被轉發到kubia-nodeport服務的port 80。
注意:有些雲端廠商的ingress controller (例如GKE)要求ingress指向一個NodePort服務。但k8s並沒有這樣的要求。
[root@cp200 ch5]# kubectl create -f kubia-ingress.yaml
ingress.networking.k8s.io/kubia created
你必須透過 http://kubia.example.com 訪問服務,要確保dns解析為ingress controller的IP。
IP會在ADDESS顯示出來(需要一點時間)