← Về danh sách bài học Bài 10/25

🏷️ Bài 10: Labels & Selectors

⏱️ Thời gian: 15 phút | 📚 Độ khó: Dễ

🎯 Sau bài học này, bạn sẽ:

1. Labels Là Gì?

Labels là key-value pairs gắn vào resources để tổ chức và chọn lọc.

metadata:
  name: my-pod
  labels:
    app: nginx
    environment: production
    tier: frontend
    version: v1.2.0
💡 Labels dùng để:
• Service tìm Pods để route traffic
• Deployment quản lý Pods
• Query/filter resources với kubectl
• Tổ chức theo team, environment, version

2. Labels vs Annotations

Labels Annotations
Dùng để identify, select Metadata bổ sung, không select được
Service, Deployment query Tools đọc (monitoring, logging)
app: nginx prometheus.io/scrape: "true"

3. Quản Lý Labels

# Xem labels
kubectl get pods --show-labels

# Thêm label
kubectl label pod my-pod team=backend

# Thay đổi label (cần --overwrite)
kubectl label pod my-pod version=v2 --overwrite

# Xóa label
kubectl label pod my-pod team-

# Label nhiều pods
kubectl label pods -l app=nginx tier=frontend

4. Selectors - Query Resources

Equality-based Selectors

# Pods có label app=nginx
kubectl get pods -l app=nginx

# Pods không có label app=nginx
kubectl get pods -l app!=nginx

# AND: nhiều điều kiện
kubectl get pods -l app=nginx,environment=production

Set-based Selectors

# app IN (nginx, apache)
kubectl get pods -l 'app in (nginx, apache)'

# app NOT IN 
kubectl get pods -l 'app notin (test, dev)'

# Có label 'environment' (bất kỳ value)
kubectl get pods -l environment

# Không có label 'environment'
kubectl get pods -l '!environment'

5. Selectors Trong YAML

Deployment selector

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  selector:
    matchLabels:           # Equality-based
      app: web
      tier: frontend
    matchExpressions:      # Set-based
      - key: environment
        operator: In
        values: [production, staging]
  template:
    metadata:
      labels:              # Pods phải có labels này
        app: web
        tier: frontend
        environment: production

Service selector

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
    tier: frontend
  ports:
    - port: 80

6. Best Practices

💡 Labels phổ biến:
app - Tên ứng dụng
environment - dev, staging, production
tier - frontend, backend, database
version - v1, v2
team - Đội sở hữu
release - Tên release (Helm)
# K8s recommended labels
metadata:
  labels:
    app.kubernetes.io/name: mysql
    app.kubernetes.io/instance: wordpress-mysql
    app.kubernetes.io/version: "8.0"
    app.kubernetes.io/component: database
    app.kubernetes.io/part-of: wordpress
    app.kubernetes.io/managed-by: helm

📝 Tóm Tắt Bài Học