哈囉,大家好,歡迎來到學習 K8s 的第二天!
在昨天的文章中,我們比較了「手動部署 vs. K8s」的方式,理解了為什麼需要 Kubernetes,以及它的整體架構。今天,我們要正式進入實作面,學習如何在 K8s 叢集裡部署應用程式。
在 Kubernetes 中,大部分的操作都是透過 YAML 檔案 來完成的。我們會在 YAML 中宣告「期望的狀態」,然後交給 K8s 來維護。這也是 Kubernetes 的核心理念:宣告式管理 (Declarative Management)。
在這個過程中,我們會逐步認識三個核心元件,以及它們之間的關係:
kubectl
- 與叢集溝通的工具在開始之前,我們要先認識接下來會一直使用的工具:kubectl
。
kubectl
是 Kubernetes 的官方命令列工具,它負責與 API Server 溝通,提交我們的 YAML 設定或直接下達操作指令。
安裝 Docker Desktop 的時候,通常會自動附帶安裝 kubectl
。
你可以輸入以下指令確認版本:
kubectl version
在 Kubernetes 中,應用程式不會直接以 Container 的形式部署,而是以 Pod 為最小單位。
Pod 內可以包含一個或多個 Container,這些 Container 會共享網路與儲存環境。實務上,大部分情況是一個 Pod 對應一個 Container。
Pod 有一個重要特性:它是暫時性的。
當 Pod 因故障或更新而被移除後,它不會自動重建,這代表單獨的 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 正常運行。
當 Deployment 建立了多個 Pod 後,會面臨兩個問題:
這就是 Service 的用途。
Service 其實就像是一個固定的門牌號碼,不管後面是哪個 Pod 在運行,流量都能透過這個門牌進來,再由 Service 負責把請求分配給符合條件的 Pod。這樣一來,即使 Pod 不斷被銷毀和重建,應用服務依然能正常被存取。
在使用上,Service 也會根據場景不同而有不同的類型。
範例 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。
建立設定檔案
將上面的 deployment.yaml
和 service.yaml
存在同一個資料夾。
套用設定
在該資料夾下執行:
kubectl apply -f .
驗證部署狀態
# 查看 Deployment 狀態
kubectl get deployment
# 查看 Pod 狀態
kubectl get pods
# 查看 Service 狀態
kubectl get service
本機測試 (使用 port-forward)
由於 ClusterIP 預設只能在叢集內部訪問,我們可以用 kubectl port-forward
轉發:
kubectl port-forward service/ota-backend-service 8081:80
接著開啟瀏覽器或 Postman,訪問 http://localhost:8081 就能連線到叢集中的服務。
今天,我們完成了從 Docker 到 Kubernetes 的第一步實作,認識了三個核心元件:
這三個元件之間的連結依靠 Labels 與 Selectors。
Deployment 透過標籤來管理 Pod,Service 則透過標籤找到對應的 Pod。
在明天的文章中,我們會進一步探討 Labels 與 Selectors 的運作方式。