iT邦幫忙

2026 iThome 鐵人賽

DAY 11
0
Kubernetes

從零開始的雲端實戰:30 天 Kubernetes 核心觀念與部署指南系列 第 11

【Day 11】對外開門營運:Service NodePort 與 LoadBalancer 存取測試

  • 分享至 

  • xImage
  •  

今日目標

  • 理解 Kubernetes 將服務暴露給外部流量的兩大主流 Service 型態:NodePort 與 LoadBalancer。
  • 搞懂 NodePort 的端口範圍限制(30000–32767)與底層轉發原理。
  • 掌握雲端環境中 LoadBalancer 如何與雲端供應商(Cloud Provider)整合。
  • 實戰操作:將 Nginx 服務改為 NodePort / LoadBalancer,並在本地瀏覽器成功存取。

外部流量進入 K8s 的兩大主流方式

在 Day 10 中,我們學到了預設的 ClusterIP 只能在集群內部互相溝通。但如果我們做的是面向大眾的 Web 網站或公開 API,外部的使用者該如何連進來?

Kubernetes 提供了兩種直接的 Service 型態來開門迎客:

模式 核心概念 適用場景
NodePort 在每個節點開一扇門(30000~32767 Port),直連任一 Node IP 本地測試、Demo、自建機房
LoadBalancer 串接雲端平台的負載平衡器(配發獨立公網 IP) 雲端生產環境(AWS / GCP / Azure)

方案一:NodePort(在每個節點開一扇門)

運作原理

  • Kubernetes 會在集群中的**每一個節點(Node)**上,開放一個一模一樣的專用連接埠(Port)。
  • 預設端口範圍為 30000–32767(避免與常用系統 Port 衝突)。
  • 外部使用者只要連線到 任意節點的 IP:指定 NodePort,流量就會被 kube-proxy 自動轉發到後端的 Pod。

適用場景

  • 本地開發測試、Demo 展示。
  • 自建機房(On-Premises)且沒有外部負載平衡器時的臨時方案。

方案二:LoadBalancer(雲端企業級標準)

運作原理

  • 當在公有雲(如 AWS EKS、GCP GKE)上建立 type: LoadBalancer 的 Service 時,Kubernetes 會主動向雲端平台申請一台專屬的硬體/軟體負載平衡器(例如 AWS Network Load Balancer)。
  • 雲端平台會配置一個公網 IP 或 DNS 網址給這個 Service。
  • 外部流量進入雲端 LoadBalancer ➔ 轉發到各 NodePort ➔ 轉發到 Service ➔ 最終到達 Pod。

實戰演練:在本地測試 NodePort 與 LoadBalancer

實戰 A:建立 NodePort Service

建立 nginx-nodeport.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport-service
spec:
  type: NodePort
  selector:
    app: nginx-app
  ports:
    - protocol: TCP
      port: 80          # Service 內部的 Port
      targetPort: 80    # Pod 容器的 Port
      nodePort: 30080   # 指定在 Node 上開放的 Port (30000-32767)

套用配置:

kubectl apply -f nginx-nodeport.yaml

檢查 Service 狀態:

kubectl get svc nginx-nodeport-service

預期輸出:

NAME                     TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-nodeport-service   NodePort   10.108.85.12    <none>        80:30080/TCP   10s

在 Minikube 環境中,快速取得可連線的外部 URL:

minikube service nginx-nodeport-service --url

複製終端機輸出的網址(例如 http://127.0.0.1:54321http://192.168.49.2:30080)貼到瀏覽器,就能直接看到 Nginx 畫面!


實戰 B:體驗 LoadBalancer Service

建立 nginx-loadbalancer.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-lb-service
spec:
  type: LoadBalancer
  selector:
    app: nginx-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

套用配置:

kubectl apply -f nginx-loadbalancer.yaml

注意:如果在本地 Minikube,EXTERNAL-IP 會一直卡在 <pending>,因為本地沒有 AWS 或 GCP 的負載平衡器驅動。

要在 Minikube 模擬雲端 LoadBalancer,只需另開一個終端機執行:

minikube tunnel

執行後回到原視窗再次查詢 kubectl get svc nginx-lb-service,你會發現 EXTERNAL-IP 成功分到了 127.0.0.1!直接在瀏覽器打開 http://localhost 即可存取。


NodePort 與 LoadBalancer 的缺點是什麼?

雖然這兩種方式成功讓外部連進來了,但在大型系統中仍有瓶頸:

  1. NodePort 端口浪費與雜亂:每個服務都要佔用一個 30000+ 的特殊 Port,使用者訪問時還要記 Port 號(如 :30080),極不人性化。
  2. LoadBalancer 成本高昂:在雲端每開一個 LoadBalancer Service,雲端廠商每個月都會額外收費。如果有 50 個微服務,就要開 50 台 Load Balancer,帳單會非常可觀。

我們能不能只用一個公網 IP(Port 80/443),透過不同的網域名稱(Domain)或路徑(Path),自動把流量分派給不同的後端 Service 呢?


本日小結

今天我們掌握了將 Kubernetes 服務對外公開的兩種方式:

  • NodePort:簡單直接,在每個 Node 上開特定 Port 轉發。
  • LoadBalancer:雲端標準,由雲端平台配發獨立公網 IP 與負載平衡器。

為了解決多個微服務共用單一流量入口與網域路由的需求,明天 Day 12,我們將學習七層網路的流量總管:「流量總管:Ingress 與 Ingress Controller 網域路由設定」


上一篇
【Day 10】Pod 之間的溝通橋樑:Service(ClusterIP)概念與內部網路
下一篇
【Day 12】流量總管:Ingress 與 Ingress Controller 網域路由設定
系列文
從零開始的雲端實戰:30 天 Kubernetes 核心觀念與部署指南12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言