iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
DevOps

新創視角下的 DevOps × AI 探索系列 第 13

Day13: Ingress 與 Ingress Controller:管理 HTTP/HTTPS 流量

  • 分享至 

  • xImage
  •  

前言

在 Day12: DNS 與 Service Discovery 中,我們學會了如何在 Kubernetes 內部透過 DNS 與 Service 讓不同 Pod 或服務彼此發現。
但有一個更常見的情境是:外部使用者要如何存取我們部署在 K8s 內的服務?

這就是今天要介紹的重點 —— Ingress 與 Ingress Controller。它們是 Kubernetes 集群對外 HTTP/HTTPS 流量的 Gateway。

為什麼需要 Ingress?

在沒有 Ingress 之前,K8s 提供兩種方式將服務暴露到外部:

  1. NodePort
    • 在每個 Node 上開放一個指定的 port
    • 使用者必須知道 Node IP + Port 才能存取
    • Port 數量有限,不利於管理
  2. LoadBalancer
    • 雲端環境下自動建立 LB
    • 缺點是 每個 Service 都需要一個 LB,成本與維運複雜度高

👉 因此,我們需要一個更好的方法:

  • 單一入口點(Entry Point)
  • 依據 Host/Path 將流量導向不同 Service
  • 內建支援 SSL/TLS

這就是 Ingress 登場的原因。

Ingress vs Ingress Controller

Ingress (API 物件)

  • Kubernetes 提供的 Resource,用來定義路由規則
  • 例如:example.com/api → service-a

Ingress Controller (實作元件)

  • 負責讀取 Ingress 資源並真正處理流量

常見選項:

  • Nginx Ingress Controller
  • Traefik
  • HAProxy
  • 雲端原生 Controller(AWS ALB、GCP Ingress)

📝 小結:
Ingress 就像「規則文件」,而 Ingress Controller 就是「守門員」。

Ingress 的核心功能

  1. 路由 (Routing)
    • Host-based routing:foo.example.com → Service A
    • Path-based routing:/api → Service B
  2. TLS/HTTPS 支援
    • 憑證管理(常搭配 cert-manager + Let’s Encrypt)
  3. Rewrite / Redirect
    • 例如 /old → /new
    • 強制 HTTP 轉 HTTPS
  4. 負載平衡與健康檢查

常見的 Ingress Controller

  • Nginx Ingress Controller:最普遍,功能完整
  • Traefik:內建 Dashboard,簡單上手
  • Cilium Gateway API:新世代,與 CNI 深度整合
  • 雲端原生:AWS ALB、GCP Ingress,適合雲平台使用

實作範例:Nginx Ingress Controller

  1. 安裝 Nginx Ingress Controller
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx --create-namespace

Helm 是 Kubernetes 的套件管理工具,可以類比於 Linux 的 apt 或 yum。

  1. 建立兩個示範服務
apiVersion: v1
kind: Service
metadata:
  name: service-a
spec:
  selector:
    app: app-a
  ports:
    - port: 80
      targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: service-b
spec:
  selector:
    app: app-b
  ports:
    - port: 80
      targetPort: 8080
  1. 建立 Ingress 資源
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /app-a
        pathType: Prefix
        backend:
          service:
            name: service-a
            port:
              number: 80
      - path: /app-b
        pathType: Prefix
        backend:
          service:
            name: service-b
            port:
              number: 80
  1. 測試效果
curl -H "Host: example.com" http://<Ingress-Controller-IP>/app-a
curl -H "Host: example.com" http://<Ingress-Controller-IP>/app-b

你會發現,流量會依據不同的 Path 被導向到不同的 Service 🎉

進階議題

  • TLS 憑證自動化(cert-manager + Let’s Encrypt)
  • 多租戶隔離與安全性
  • Ingress 與 Service Mesh (Istio, Gloo) 的比較

結論

  • Ingress 與 Ingress Controller 是 Kubernetes HTTP/HTTPS 流量的核心工具
  • 它解決了 NodePort/LoadBalancer 的不足,提供 單一入口、靈活路由、TLS 支援
  • 與下一篇 Day14: CNI 網路插件 有承接關係:Ingress 著重在 L7 流量(HTTP/HTTPS),而 CNI 插件則處理 L3/L4 網路基礎連線。

上一篇
Day12: DNS 與 Service Discovery:如何在 K8s 內部找到服務
下一篇
Day 14: CNI 網路插件:Calico、Flannel、Cilium 簡介
系列文
新創視角下的 DevOps × AI 探索15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言