前一篇介紹的 Service 可以提供 Pod 固定的連線入口,但如果有多個網站或 API 服務需要從叢集外部存取,為每個 Service 都建立 NodePort 或 LoadBalancer 會較難管理。
Ingress 可以依照網址網域或 URL 路徑,將 HTTP/HTTPS 請求轉送到不同的 Service。例如將 / 的請求轉送到前端 Service,將 /api 的請求轉送到後端 API Service。
Ingress 不會直接連線到 Pod,而是先找到指定的 Service,再由 Service 將流量轉送到符合 Label 的 Pod。
Ingress -> Service -> Pod
不過只建立 Ingress 資源還不能處理流量,還需要安裝 Ingress Controller。Ingress Controller 會讀取 Ingress 規則,並實際接收與轉送外部請求。
Minikube 可以直接啟用 NGINX Ingress Controller。
minikube addons enable ingress
等待一段時間後,可以確認 NGINX Ingress Controller 是否已啟動:
kubectl get pods -n ingress-nginx
接著建立一個 Ingress,將所有從根目錄 / 進入的請求,轉送到前一篇建立的 nginx-service。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
套用 YAML 檔:
kubectl apply -f ingress.yaml
確認 Ingress 是否建立成功:
kubectl get ingress
如果使用 Windows 搭配 Docker driver 執行 Minikube,還需要另外開啟一個終端機並輸入以下指令,讓本機能透過 127.0.0.1 存取 Ingress:
minikube tunnel
這個終端機需要保持開啟,關閉後就無法再透過 127.0.0.1 存取。
等待一段時間後再次輸入 kubectl get ingress,確認 ADDRESS 欄位出現 127.0.0.1,再使用瀏覽器開啟網站。
http://127.0.0.1
就能看到前一篇建立的 Nginx 網頁。
這次只有設定 / 路徑,因此所有請求都會被轉送到 nginx-service。之後如果有不同的前端、後端或 API Service,就可以在同一個 Ingress 中設定不同路徑,讓 Kubernetes 依照請求內容轉送到對應服務。