透過 Ingress 暴露服務

定義 ingress —— 進入或進入的行為;進入的權利;進入的手段或地點;入口

為什麼需要 ingress

一個重要的原因是每個 LoadBalancer 服務都需要自己的負載平衡器,以及獨立擁有的公開IP,而 ingress 只需要一個公開IP就能為許多服務提供訪問。當客戶端發送HTTP請求到ingress時,ingress會根據請求的 hostname 和 request path 來決定讓請求轉發到哪個服務,如下圖。

圖5.9 透過一個 ingress 暴露多個服務

圖5.9 透過一個 ingress 暴露多個服務

ingress在網路第七層應用層(HTTP)實作,並且可以提供一些原本服務資源不能實現的功能,例如:針對cookie方式來達到session affinity(親和性)。

ingress controller是不可缺少的

強調必須有 ingress controller 的叢集中運行,ingress 資源才能正常工作,不同的k8s環境使用不同的ingress controller實作,如:GKE使用GCP帶有HTTP負載平衡模組來提供ingress功能。 一般自建的k8s(如minikube)通常預設沒有提供ingress controller,則必須手動啟用或者自行安裝ingress controller。

補充:在進行以下範例,請先安裝好 ingress controll,可以參考 k8s 整合MetalLB+nginx ingress

建立 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並沒有這樣的要求。

部屬ingress

[root@cp200 ch5]# kubectl create -f kubia-ingress.yaml 
ingress.networking.k8s.io/kubia created

透過ingress訪問服務

你必須透過 http://kubia.example.com 訪問服務,要確保dns解析為ingress controller的IP。

取得ingress controller的IP

IP會在ADDESS顯示出來(需要一點時間)