為什麼需要 Ingress?先看 NodePort 的痛
如果你已經學過 NodePort,那網址大概長這樣:
http://192.168.1.100:30080
這個網址要丟給使用者用?不可能。沒有人會記 IP,更不會記一個五位數的 port。
我們要的是這種:
http://myapp.com
http://myapp.com/api
http://www.myapp.com
標準的 80 port、用域名、用路徑分流。但 NodePort 給你的 port 範圍是 30000–32767,永遠開不到 80。
這個問題在 Docker 時代怎麼解?用 Nginx 反向代理:所有流量打進 Nginx,Nginx 看 URL 路徑或域名再轉給對應的容器。
K8s 上的等價解法叫 Ingress。
Ingress 跟 Ingress Controller 是兩個東西,不要搞混
新手最常被卡住的地方就是這個。Ingress 不是一個東西,是兩個:
| 名稱 | 是什麼 | 比喻 |
|---|---|---|
| Ingress(YAML) | 一份路由規則的設定檔 | 寫滿路徑的「電話簿」 |
| Ingress Controller | 真正跑在叢集裡的 Pod,監聽 80/443 | 負責接電話、查電話簿、轉接的「總機小姐」 |
常見的 Ingress Controller
- Nginx:最普及,K8s 官方維護
- Traefik:現代化、自動發現服務、k3s 預設內建
- HAProxy:高效能、企業常見
這篇用 k3s + Traefik 示範。如果你用 minikube,把後面範例的 ingressClassName: traefik 改成 nginx 即可(記得先 minikube addons enable ingress)。
重點整理
- NodePort 給的 port 是 30000-32767,沒辦法給使用者用。Ingress 就是為了讓你用標準 80/443 而存在
- Ingress(YAML 規則)跟 Ingress Controller(實際運作的 Pod)是兩個東西,少了任何一個都不會動
- k3s 預設裝 Traefik,
ingressClassName填traefik;minikube 是 nginx - 三個必填:
apiVersion: networking.k8s.io/v1、pathType、ingressClassName - Path-based 適合前後端共域名,Host-based 適合微服務各自有域名,實務常混用
- Ingress 後面的 Service 用 ClusterIP 就好,不要再開 NodePort