哈囉大家好,歡迎來到 K8s 的第八天!
到目前為止,我們的應用雖然已經能部署、能健康檢查、能存資料,但都還是「關在 Kubernetes 叢集裡面」。問題來了:如果想讓外部使用者透過一個正常的網址(例如 https://ota.example.com)來存取服務,要怎麼做?
之前在 Day 9,我們用過 kubectl port-forward
測試,但那當然不可能拿來上線。今天,我們要來介紹 K8s 世界裡專門處理外部流量的角色 —— Ingress。
K8s 的 Service 確實能把 Pod 暴露出去,但只靠 Service,限制很多。
:30080
。網址長得很醜,像 http://your-node-ip:30080
,不適合給人使用。而且如果某台 Node 掛掉,那個 IP 也就失效,還得額外處理負載平衡。所以,我們需要一個更聰明、也更省錢的方案。這就是 Ingress 登場的時候。
Ingress 本身不是 Pod,也不是 Service,而是一個 API 物件。它就像一本「流量路由說明書」,裡面可以定義:
ota.example.com
→ 前端服務ota.example.com/api
→ 後端服務cms.example.com
→ 另一個專案只要流量進來,K8s 就能依照這份規則,把請求送到正確的 Service。但是,Ingress 只是定義「規則」,並不會自己生效。真正執行規則的,是 Ingress Controller。
Ingress Controller 是跑在 Pod 裡的應用程式。它會監聽 API Server,一旦偵測到新的 Ingress 規則,就會更新自己的路由設定(例如修改 Nginx config)。所有外部的 HTTP/HTTPS 請求,會先被送進 Ingress Controller,它再依照規則,把流量轉給對應的 Service。這樣一來,只需要一個公開的 LoadBalancer IP,就能靠 Hostname 或 Path 把流量分流到不同服務。
常見實作:
今天我們先以 Nginx 為例。
假設環境裡已經安裝好 Nginx Ingress Controller(用 Helm 或 YAML 都可以),接著只要定義一個簡單的 Ingress 物件:
# Ingress 物件,負責把外部流量導入叢集內部服務
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ota-ingress # Ingress 名稱
namespace: project-space # 所屬 namespace
annotations:
nginx.ingress.kubernetes.io/rewrite-target: / # 將路徑重寫為 "/",方便轉發
spec:
ingressClassName: nginx # 使用 Nginx Ingress Controller
rules:
- host: ota.example.com # 外部域名
http:
paths:
- path: / # "/" 路徑導向前端
pathType: Prefix
backend:
service:
name: ota-frontend-service
port:
number: 80
- path: /api # "/api" 路徑導向後端
pathType: Prefix
backend:
service:
name: ota-backend-service
port:
number: 80
套用這個檔案後,Nginx Ingress Controller 就會更新設定。這時候打開 https://ota.example.com
,流量就能正確導向對應服務。
在雲端環境,MetalLB 會被雲端 LB 取代;在自建環境,MetalLB 就會管理公開 IP,並把流量導向 Ingress Controller。
現在我們的應用已經能從「內部」走到「外部」了。明天,我們要來看看 K8s 的套件管理工具 —— Helm,如何把這些 YAML 打包成「應用程式包」,一鍵安裝、升級、分享!