iT邦幫忙

2025 iThome 鐵人賽

DAY 15
0
Cloud Native

從 Docker 到 K8s:我的 30 天雲原生筆記系列 第 15

Day 15: Ingress & Ingress Controller

  • 分享至 

  • xImage
  •  

哈囉大家好,歡迎來到 K8s 的第八天!

到目前為止,我們的應用雖然已經能部署、能健康檢查、能存資料,但都還是「關在 Kubernetes 叢集裡面」。問題來了:如果想讓外部使用者透過一個正常的網址(例如 https://ota.example.com)來存取服務,要怎麼做?

之前在 Day 9,我們用過 kubectl port-forward 測試,但那當然不可能拿來上線。今天,我們要來介紹 K8s 世界裡專門處理外部流量的角色 —— Ingress

Part 1:為什麼 Service 還不夠?

K8s 的 Service 確實能把 Pod 暴露出去,但只靠 Service,限制很多。

  • NodePort 會在每台 Node 上開一個高編號的 Port,例如 :30080。網址長得很醜,像 http://your-node-ip:30080,不適合給人使用。而且如果某台 Node 掛掉,那個 IP 也就失效,還得額外處理負載平衡。
  • LoadBalancer 在雲端會自動申請一台 L4 負載平衡器,提供公開 IP,比 NodePort 方便,但每個服務都要綁一台,成本高,而且只能依 IP/Port 轉發,無法依路徑分流。在裸機或自建 K8s 環境,可以用 MetalLB 自架 LoadBalancer,從指定的 IP pool 分配公開 IP,配合 Ingress Controller 就能用單一 IP 管理多個服務,並依 Host 或 Path 做流量分流,還能節省雲端費用。

所以,我們需要一個更聰明、也更省錢的方案。這就是 Ingress 登場的時候。

Part 2:Ingress,其實是一份「規則文件」

Ingress 本身不是 Pod,也不是 Service,而是一個 API 物件。它就像一本「流量路由說明書」,裡面可以定義:

  • ota.example.com → 前端服務
  • ota.example.com/api → 後端服務
  • cms.example.com → 另一個專案

只要流量進來,K8s 就能依照這份規則,把請求送到正確的 Service。但是,Ingress 只是定義「規則」,並不會自己生效。真正執行規則的,是 Ingress Controller。

Part 3:Ingress Controller,規則的執行者

Ingress Controller 是跑在 Pod 裡的應用程式。它會監聽 API Server,一旦偵測到新的 Ingress 規則,就會更新自己的路由設定(例如修改 Nginx config)。所有外部的 HTTP/HTTPS 請求,會先被送進 Ingress Controller,它再依照規則,把流量轉給對應的 Service。這樣一來,只需要一個公開的 LoadBalancer IP,就能靠 Hostname 或 Path 把流量分流到不同服務。

常見實作:

  • Nginx Ingress Controller
  • Traefik
  • HAProxy Ingress

今天我們先以 Nginx 為例。

Part 4:實戰,為 OTA 專案上 Ingress

假設環境裡已經安裝好 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,流量就能正確導向對應服務。

Part 5:一張圖看懂 Ingress + MetalLB 流量

https://ithelp.ithome.com.tw/upload/images/20250922/20178656Bxy2xDm5Fg.png

在雲端環境,MetalLB 會被雲端 LB 取代;在自建環境,MetalLB 就會管理公開 IP,並把流量導向 Ingress Controller。

現在我們的應用已經能從「內部」走到「外部」了。明天,我們要來看看 K8s 的套件管理工具 —— Helm,如何把這些 YAML 打包成「應用程式包」,一鍵安裝、升級、分享!


上一篇
Day 14: Probes (Liveness & Readiness)
下一篇
Day 16: 標準化包裝:Helm
系列文
從 Docker 到 K8s:我的 30 天雲原生筆記16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言