iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
Cloud Native

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

Day 9: Pod, Deployment, Service 的三角關係

  • 分享至 

  • xImage
  •  

哈囉,大家好,歡迎來到學習 K8s 的第二天!

在昨天的文章中,我們比較了「手動部署 vs. K8s」的方式,理解了為什麼需要 Kubernetes,以及它的整體架構。今天,我們要正式進入實作面,學習如何在 K8s 叢集裡部署應用程式。

在 Kubernetes 中,大部分的操作都是透過 YAML 檔案 來完成的。我們會在 YAML 中宣告「期望的狀態」,然後交給 K8s 來維護。這也是 Kubernetes 的核心理念:宣告式管理 (Declarative Management)

在這個過程中,我們會逐步認識三個核心元件,以及它們之間的關係:

  1. Pod:最小的部署單位
  2. Deployment:負責管理 Pod 的生命週期
  3. Service:為 Pod 提供穩定的網路入口

Part 1:認識 kubectl - 與叢集溝通的工具

在開始之前,我們要先認識接下來會一直使用的工具:kubectl

kubectl 是 Kubernetes 的官方命令列工具,它負責與 API Server 溝通,提交我們的 YAML 設定或直接下達操作指令。

安裝 Docker Desktop 的時候,通常會自動附帶安裝 kubectl

你可以輸入以下指令確認版本:

kubectl version

Part 2:Pod - 最小的部署單位

在 Kubernetes 中,應用程式不會直接以 Container 的形式部署,而是以 Pod 為最小單位。

Pod 內可以包含一個或多個 Container,這些 Container 會共享網路與儲存環境。實務上,大部分情況是一個 Pod 對應一個 Container。

Pod 有一個重要特性:它是暫時性的。

當 Pod 因故障或更新而被移除後,它不會自動重建,這代表單獨的 Pod 在實際專案中並不適合作為直接使用的對象。

Part 3:Deployment - Pod 的管理者

由於 Pod 本身無法自我修復或確保數量穩定,Kubernetes 提供了 Deployment 來管理它們。

Deployment 的職責是根據我們在 YAML 中定義的「期望狀態」,確保正確數量的 Pod 持續運行。如果 Pod 發生錯誤,Deployment 會自動建立新的 Pod 來補上。

範例 Deployment YAML:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ota-backend-deployment
spec:
  replicas: 3 # 期望的 Pod 數量
  selector:
    matchLabels:
      app: ota-backend
  template:
    metadata:
      labels:
        app: ota-backend
    spec:
      containers:
      - name: backend-container
        image: your-docker-id/ota-backend:1.0
        ports:
        - containerPort: 8080

這段設定的意思是:建立一個名為 ota-backend-deployment 的 Deployment,並確保隨時有 3 個帶有 app: ota-backend 標籤的 Pod 正常運行。

Part 4:Service - 穩定的存取入口

當 Deployment 建立了多個 Pod 後,會面臨兩個問題:

  1. Pod 的 IP 是動態的,不會固定。
  2. 多個 Pod 要如何讓外部服務能夠統一存取?

這就是 Service 的用途。

Service 其實就像是一個固定的門牌號碼,不管後面是哪個 Pod 在運行,流量都能透過這個門牌進來,再由 Service 負責把請求分配給符合條件的 Pod。這樣一來,即使 Pod 不斷被銷毀和重建,應用服務依然能正常被存取。

在使用上,Service 也會根據場景不同而有不同的類型。

  • 最常見的就是 ClusterIP,這種方式只會在 Kubernetes cluster 內部建立一個固定 IP,讓內部服務之間彼此能夠互相存取,但外部是看不到的。
  • 如果我們想讓外部也能存取,就會用到 NodePort,這會在每個節點的特定 port 開一個入口,讓外部可以透過「節點 IP + port」進來。
  • 另一種更常見於雲端環境的是 LoadBalancer,它會幫我們直接對接雲端供應商的負載平衡器,提供一個對外的固定 IP 或 DNS 名稱,適合用在正式環境。

範例 Service YAML:

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: ota-backend-service
spec:
  selector:
    app: ota-backend
  ports:
    - protocol: TCP
      port: 80        # Service 對外的 Port
      targetPort: 8080 # Pod 內部容器的 Port

這段設定的意思是:建立一個名為 ota-backend-service 的 Service,將所有帶有 app: ota-backend 標籤的 Pod 收納起來,並將進入 Service 的流量轉送到 Pod 的 8080 Port。

Part 5:實戰演練:部署第一個 K8s 應用

  1. 建立設定檔案

    將上面的 deployment.yamlservice.yaml 存在同一個資料夾。

  2. 套用設定

    在該資料夾下執行:

    kubectl apply -f .
    
  3. 驗證部署狀態

    # 查看 Deployment 狀態
    kubectl get deployment
    
    # 查看 Pod 狀態
    kubectl get pods
    
    # 查看 Service 狀態
    kubectl get service
    
  4. 本機測試 (使用 port-forward)

    由於 ClusterIP 預設只能在叢集內部訪問,我們可以用 kubectl port-forward 轉發:

    kubectl port-forward service/ota-backend-service 8081:80
    

    接著開啟瀏覽器或 Postman,訪問 http://localhost:8081 就能連線到叢集中的服務。

結論

今天,我們完成了從 Docker 到 Kubernetes 的第一步實作,認識了三個核心元件:

  • Pod:最小的部署單位,但不具備自我修復能力。
  • Deployment:用來確保 Pod 的數量與狀態,提供自動化的管理。
  • Service:為 Pod 提供固定的入口,解決 IP 浮動與負載平衡問題。

這三個元件之間的連結依靠 Labels 與 Selectors

Deployment 透過標籤來管理 Pod,Service 則透過標籤找到對應的 Pod。

在明天的文章中,我們會進一步探討 Labels 與 Selectors 的運作方式。


上一篇
Day 8: 什麼是 K8s? 為什麼需要它?
下一篇
Day 10: K8s 的關聯機制- Labels 與 Selectors
系列文
從 Docker 到 K8s:我的 30 天雲原生筆記10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言