每一個 Service 如果要對外的話,都要有一個 Port 與其對應。當 Service 越來越多時,我們就需要管理更多的 Port number ,也會使得維運上更加複雜。這時候就可以使用 Ingress ,透過 Ingress 可以讓 Node 對外開放的 Port 統一,結合 Ingress Controller 更能在 Kubernetes Cluster 中實現負載平衡的功能。
左圖為未使用 Ingress 架構圖,可以看出每個服務都需要對應到相對的 Service,而 Service 需要一個 Port number 對外,才能使服務向外開通。
右圖為使用 Ingress 架構圖,使用統一個 Port number 對外,並且以路徑區分出流量要導到哪一個 Service。
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 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 憑證,詳細用法會再另外做一集視頻跟大家說明(老高)
透過 Nginx-Ingress-Controller 實現 routing、 ssl/tls termination、 load balancing 等等功能。而比較穩定且常被人使用的 Ingress-nginx 是 Kubernetes org 內維護的專案,專案內容主要是在kubernetes上執行 Nginx。 安裝完後會依據 Ingress 的設定,在 Nginx pod 裡設定對應的 routing rules,如果有 ssl/tls 設定,也一併載入。
安裝 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