iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Cloud Native

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

Day 10: K8s 的關聯機制- Labels 與 Selectors

  • 分享至 

  • xImage
  •  

大家好,歡迎來到 K8s 核心篇的第三天!

在昨天的 Day 9,我們部署了第一個由 Deployment 管理,並透過 Service 對外提供的 ota-backend 應用。

但是這裡可能會有一個問題:

  • Deployment 怎麼知道自己應該管理哪一些 Pod?
  • Service 又是怎麼在一大堆 Pod 當中,精準地找到要轉發流量的那幾個?

答案就是 Labels (標籤)Selectors (選擇器)。這是 Kubernetes 裡所有物件之間建立關聯的基礎。

Part 1:Labels (標籤)

在 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)。

有了標籤之後,我們就能用它來篩選物件,進一步控制或操作。

Part 2:Selectors (選擇器)

如果說 Labels 是我們幫物件打上的註記,那麼 Selectors 就是用來查詢這些註記的工具。

最常用的方式是「等式查詢 (Equality-based Selectors)」,語法很簡單:

  • app = ota-backend → 找出所有標籤裡 appota-backend 的物件
  • environment != staging → 找出所有環境不是 staging 的物件
  • app = ota-backend, tier = backend → 同時符合多個條件

這樣一來,不管叢集裡有多少物件,我們都能快速鎖定需要的那一群。

Part 3:Deployment 與 Service 的合作

回到昨天的例子,我們來看看 deployment.yamlservice.yaml 裡,是怎麼透過 Labels 與 Selectors 建立關聯的。

Deployment

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

這裡有兩個重點:

  1. spec.selector.matchLabels → 告訴 Deployment 要管理哪些 Pod(帶有 app=ota-backend 的 Pod)。
  2. spec.template.metadata.labels → 確保新建的 Pod 也會帶上 app=ota-backend 標籤。

這樣 Deployment 就能持續維持正確的 Pod 數量。

Service

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 重建幾次,只要標籤一樣,流量就能正確地被導向。

https://ithelp.ithome.com.tw/upload/images/20250917/20178656T99UOWIGaC.png

Part 4:kubectl 的日常應用

除了在 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 裡物件之間的關聯。

  • Labels:物件的標籤,用來描述屬性。
  • Selectors:查詢標籤的方式,用來篩選物件。
  • Deployment 與 Service 都是透過 Selectors,動態地找到需要管理或轉發的 Pod。

雖然這個機制看起來很簡單,但它是 Kubernetes 自動化與彈性設計的基礎。

接下來,如果我們的叢集裡同時運行好幾個不同專案(像 OTA、客戶管理、權限管理等),那要怎麼徹底隔離彼此的資源呢?明天,我們就來認識 Kubernetes 的「Namespaces (命名空間)」。


上一篇
Day 9: Pod, Deployment, Service 的三角關係
系列文
從 Docker 到 K8s:我的 30 天雲原生筆記10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言