每一個 Service 如果要對外的話,都要有一個 Port 與其對應。當 Service 越來越多時,我們就需要管理更多的 Port number ,也會使得維運上更加複雜。這時候就可以使用 Ingress ,透過 Ingress 可以讓 Node 對外開放的 Port 統一,結合 Ingress Controller 更能在 Kubernetes Cluster 中實現負載平衡的功能。

是否使用 Ingress 比較

左圖為未使用 Ingress 架構圖,可以看出每個服務都需要對應到相對的 Service,而 Service 需要一個 Port number 對外,才能使服務向外開通。

右圖為使用 Ingress 架構圖,使用統一個 Port number 對外,並且以路徑區分出流量要導到哪一個 Service。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/88d65f7c-8871-479c-9a10-26683df21d77/k8s-ingress_(3).jpg

基本 YAML file 設定

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/08ba9ed5-fe6c-4c63-adc8-bc7389d5a92c/k8s-ingress.jpg


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - http:
      paths:
      - path: /testpath # 請求路徑
        pathType: Prefix
        backend:
          service:
            name: my-service # 請求/testpath的流量要導到的Service名稱
            port:
              number: 80 # Service port number

多個 Domain

若有多個 Domain Name 同時指向一台 Node 時,也可以透過 Host 的設置,將不同的 Domain Name 對應到不同的 Service 物件

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
	**- host: my-app-one.com**
	  http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service-1
            port:
              number: 80
	**- host: my-app-two.com**
	  http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service-2
            port:
              number: 80

支援終止 SSL(SSL termination

可以使用 SSL 憑證,詳細用法會再另外做一集視頻跟大家說明(老高)

Ingress controller

透過 Nginx-Ingress-Controller 實現 routing、 ssl/tls termination、 load balancing 等等功能。而比較穩定且常被人使用的 Ingress-nginx 是 Kubernetes org 內維護的專案,專案內容主要是在kubernetes上執行 Nginx。 安裝完後會依據 Ingress 的設定,在 Nginx pod 裡設定對應的 routing rules,如果有 ssl/tls 設定,也一併載入。

本地端使用 Kind 搭配 Ingerss 範例

安裝 Nginx-Ingress-Controller

kubectl apply -f <https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml>

Ingress controller 已全部设置好。等待直到準備好處理正在運行的請求:

kubectl wait --namespace ingress-nginx \\
  --for=condition=ready pod \\
  --selector=app.kubernetes.io/component=controller \\
  --timeout=90s

在 Azure Kubernetes 上使用 Ingress controller