昨天透過 NodePort 作為將後端 API 服務對叢集外開放的 Service Type,不過如果要對外揭露的服務越來越多,前端、API 各佔多個入口,如此瀏覽器 URL 與 CORS 設定很快就會變複雜。
而今天要把這些入口改成同一個 host,在同一個 FQDN 的情況下配置以下 URL prefix 規則:/ 給前端,/api/ 給 API。

以 k3d 來說,k3d 使用的 K3s 預設安裝 Traefik;Traefik 依 /api 規則先把流量送到 api-gateway Service,再由應用 Gateway 轉送到兩個 API。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-entry
namespace: team-a
spec:
ingressClassName: traefik
rules:
- host: demo.example.internal
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-gateway
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: portal-web
port:
number: 80
host 是讓外部 Client 呼叫的 FQDN,實際上會依不同環境而有所不同,例如我的主域名是 demok8s.com的話,我也可以將 host 設定為 api.demok8s.com,這樣外部只能透過這一個 FQDN 呼叫到 Ingress 服務。
Ingress 將 /api 的 request 原封不動轉送給應用 Gateway,再由 Gateway 的 route 決定 /api/a、/api/b 如何導向兩個 API,以及是否移除 prefix 等相關轉送規則。
切換時,先確認 ClusterIP Service 與 EndpointSlice 有可用 Pod,再 apply Ingress。
並改從外部呼叫 Ingress 所設定的 FQDN + API Route 確認沒問題後,才移除 NodePort 入口。
當前端和 API 都由 Ingress 提供後,就可把 runtime URL 改成 /api/...,讓瀏覽器使用同源請求。
kubectl -n team-a get ingress,service,endpointslices
curl -H 'Host: demo.example.internal' http://localhost:8081/api/a/health
如此 Ingress 基礎服務就算完成了。
前面的 ingressClassName: traefik 代表使用 Traefik 的 Ingress,當配置其他叢集時,必須先確認實際安裝的 Controller 與 IngressClass。
也有 Contour、Kong 等 Controller,選用哪一種,要看叢集平台、既有負載平衡設備、TLS 與路由需求。
Kubernetes 社群的 ingress-nginx 已在 2026 年 3 月 24 日退役,之後不再發布版本、修正 bug 或提供安全更新。
既有部署不會因此立刻停止運作,但不宜再作為新部署選項。
不過還有一個名字很像的 F5 的 NGINX Ingress Controller 是另一個專案,2026 年仍有發佈新版本。
這也與 Ingress API 的「功能已凍結」不同。Ingress API 仍是 Kubernetes 的 API,並沒有因 ingress-nginx 退役而被移除。