iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
DevOps

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

Day11: 網路與服務 - Service 基礎:ClusterIP、NodePort、LoadBalancer

  • 分享至 

  • xImage
  •  

發生了一件悲慘的事情,昨天忘了發文,
按規定應該是失格了。。。
但秉持著鐵人的精神,我還是會盡力完賽的 🥹

--- 我是分隔線 ---

前一篇我們介紹了 StatefulSet 與 Headless Service,解釋了如何在 Kubernetes 中運行有狀態服務。但光有 Pod 與 StatefulSet 還不夠 —— Pod 的 IP 會隨著重建而改變,那麼服務之間要怎麼穩定地互相存取呢?

這時候就要登場的角色是 Service。它能為 Pod 提供固定入口,並且幫忙處理流量導向,是 Kubernetes 網路的核心之一。

在這篇文章中,我們會深入了解 Kubernetes Service 的三種主要型態:ClusterIP、NodePort、LoadBalancer,並搭配實作範例,讓你更直觀地理解其運作方式。

下一篇(Day12)我們會進一步探討 DNS 與 Service Discovery,說明 Kubernetes 如何讓服務之間能夠用「名字」彼此找到。

為什麼需要 Service?

在 Kubernetes 中,Pod 的生命週期是短暫的:當 Pod 被刪除或重新建立時,它的 IP 位址也會隨之改變。這就會帶來一個問題:
👉 其他服務如果直接依賴 Pod IP,就會遇到「找不到 Pod」的情況。

Service 的出現就是為了解決這個問題:

  1. 提供 固定的存取入口(Stable Endpoint)。
  2. 透過 Label Selector 自動綁定一組 Pod。
  3. 負責 流量分配(Load Balancing)。

Kubernetes Service 基礎概念

  • Selector:Service 透過 selector 找到對應的 Pod。
  • Port Mapping:可以把外部的 port 對應到 Pod 的 containerPort。
  • Service 類型:主要分為 ClusterIP、NodePort、LoadBalancer。
  • Endpoints / EndpointSlice:Service 會維護對應 Pod 的清單,並隨時更新。

接下來,我們就來看看三種常見的 Service 型態。

三種主要 Service 類型

  1. ClusterIP(預設)
  • 用途:讓叢集內部的服務之間能互相存取。
  • 存取方式:透過 ClusterIP(虛擬 IP),只能在 Cluster 內部使用。
  • 適用場景:微服務架構中,服務與服務之間的通訊。
  1. NodePort
    用途:將 Service 映射到每個 Node 的固定 Port,讓外部使用者能透過 NodeIP:NodePort 存取服務。
    特點:
  • 簡單,不需要雲端 Load Balancer。
  • 缺點是 Port 管理麻煩,並且沒有進階流量管理能力。
  • 適用場景:測試環境、小型內網服務。
  1. LoadBalancer
    用途:直接對接雲端提供的 Load Balancer(如 GCP LB、AWS ELB),讓服務能對外提供公網入口。
    特點:
  • 自動化建立外部入口。
  • 適合正式環境。
  • 缺點是依賴雲端環境,如果是裸機叢集需搭配 MetalLB 等方案。
  • 適用場景:線上服務(Web App、API Server)。

實作範例:建立三種 Service

我們用一個簡單的 nginx Deployment 來示範三種 Service 類型。

  1. 建立 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80

建立後,可以用 kubectl get pods -l app=nginx 確認 Pod 狀態。

  1. 建立 ClusterIP Service
apiVersion: v1
kind: Service
metadata:
  name: nginx-clusterip
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

測試方式:

kubectl exec -it <any-pod> -- curl nginx-clusterip:80
  1. 建立 NodePort Service
apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080
  type: NodePort

測試方式:

curl <NodeIP>:30080
  1. 建立 LoadBalancer Service
apiVersion: v1
kind: Service
metadata:
  name: nginx-lb
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
  type: LoadBalancer

測試方式:

kubectl get svc nginx-lb
# 會看到一個 EXTERNAL-IP
curl <EXTERNAL-IP>

三種 Service 的比較

類型 存取範圍 適用場景 優點 缺點
ClusterIP 叢集內部 微服務間通訊 簡單、預設 無法對外提供服務
NodePort 外部(NodeIP+Port) 測試、小型服務 不需雲端 LB Port 管理麻煩、功能有限
LoadBalancer 外部(公網 IP) 正式上線服務 自動化、公網入口 依賴雲端或額外工具

結語

在這一篇,我們學會了 Kubernetes Service 的三種基礎型態:ClusterIP、NodePort、LoadBalancer。

  • ClusterIP:內部通訊的基礎。
  • NodePort:簡單的外部存取。
  • LoadBalancer:正式服務的標準方案。

👉 下一篇(Day12)我們將探討 DNS 與 Service Discovery,進一步說明 Kubernetes 如何讓服務之間透過「名字」找到彼此。


上一篇
Day10: StatefulSet:有狀態服務與 Headless Service
系列文
新創視角下的 DevOps × AI 探索11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言