大家好,歡迎來到 K8s 核心篇的第三天!
在昨天的 Day 9,我們部署了第一個由 Deployment
管理,並透過 Service
對外提供的 ota-backend
應用。
但是這裡可能會有一個問題:
Deployment
怎麼知道自己應該管理哪一些 Pod?Service
又是怎麼在一大堆 Pod 當中,精準地找到要轉發流量的那幾個?答案就是 Labels (標籤) 和 Selectors (選擇器)。這是 Kubernetes 裡所有物件之間建立關聯的基礎。
在 Kubernetes 裡,任何物件(像是 Pod、Service、Node)都可以加上一組 Labels。
Labels 就是一組 鍵值對 (key/value pair),它們的內容完全由使用者自己定義,系統不會解讀它的意義。
舉例來說,我們可以在 ota-backend
的 Pod 裡面加上這樣的標籤:
metadata:
labels:
app: ota-backend
tier: backend
environment: production
release: stable
這些標籤很直觀地描述了 Pod 的屬性:它屬於哪個應用 (app),角色是什麼 (tier),在哪個環境 (environment),版本是什麼 (release)。
有了標籤之後,我們就能用它來篩選物件,進一步控制或操作。
如果說 Labels 是我們幫物件打上的註記,那麼 Selectors 就是用來查詢這些註記的工具。
最常用的方式是「等式查詢 (Equality-based Selectors)」,語法很簡單:
app = ota-backend
→ 找出所有標籤裡 app
是 ota-backend
的物件environment != staging
→ 找出所有環境不是 staging 的物件app = ota-backend, tier = backend
→ 同時符合多個條件這樣一來,不管叢集裡有多少物件,我們都能快速鎖定需要的那一群。
回到昨天的例子,我們來看看 deployment.yaml
和 service.yaml
裡,是怎麼透過 Labels 與 Selectors 建立關聯的。
apiVersion: apps/v1
kind: Deployment
metadata:
name: ota-backend-deployment
spec:
replicas: 3
selector: # <-- Deployment 用這個條件找要管理的 Pod
matchLabels:
app: ota-backend
template: # <-- Pod 的模板
metadata:
labels:
app: ota-backend # 新建 Pod 時會帶上這個標籤
spec:
containers:
- name: backend-container
image: your-docker-id/ota-backend:1.0
這裡有兩個重點:
spec.selector.matchLabels
→ 告訴 Deployment 要管理哪些 Pod(帶有 app=ota-backend
的 Pod)。spec.template.metadata.labels
→ 確保新建的 Pod 也會帶上 app=ota-backend
標籤。這樣 Deployment 就能持續維持正確的 Pod 數量。
apiVersion: v1
kind: Service
metadata:
name: ota-backend-service
spec:
selector: # <-- Service 用這個條件找到後端 Pod
app: ota-backend
ports:
- port: 80
targetPort: 8080
這裡的 spec.selector
告訴 Service:只要是有 app=ota-backend
標籤的 Pod,就會被納入流量轉發的目標。這樣一來,不論 Pod 重建幾次,只要標籤一樣,流量就能正確地被導向。
除了在 YAML 裡設定之外,我們在命令列操作時,也能透過 -l
來篩選 Pod:
# 只看 ota-backend 的 Pod
kubectl get pods -l app=ota-backend
# 只看 production 環境的 Pod
kubectl get pods -l environment=production
# 同時符合多個條件
kubectl get pods -l 'app=ota-backend,tier=backend'
# 動態新增標籤
kubectl label pods <your-pod-name> version=1.1
今天我們拆解了 Kubernetes 裡物件之間的關聯。
雖然這個機制看起來很簡單,但它是 Kubernetes 自動化與彈性設計的基礎。
接下來,如果我們的叢集裡同時運行好幾個不同專案(像 OTA、客戶管理、權限管理等),那要怎麼徹底隔離彼此的資源呢?明天,我們就來認識 Kubernetes 的「Namespaces (命名空間)」。