Labels and Selectors trong Kubernetes

Labels giúp gán thông tin tùy chỉnh cho các đối tượng như Pods và Nodes, trong khi Selectors cho phép bạn lọc và lựa chọn các đối tượng đó một cách linh hoạt và hiệu quả. Trong bài viết này, hãy cùng mình tìm hiểu cách sử dụng Labels and Selectors trong Kubernetes.

Xem thêm:

Manual Scheduling trong K8s

Imperative và Declarative trong K8S

1. Khái niệm Labels và Selectors

Labels giống như mấy cái nhãn dán bạn gắn vào từng đối tượng trong Kubernetes (như Pod, Node, Deployment…). Nó có dạng key=value để phân loại, ví dụ như:

  • env=production
  • app=web
  • team=backend

Selectors thì giống như bộ lọc, dùng để tìm ra những đối tượng nào có label phù hợp với điều kiện bạn đưa ra.

Nói cách khác: Labels để gắn, Selectors để lọc.

Ví dụ minh họa:

Giả sử bạn có một vườn thú ảo với nhiều loài động vật.

Bạn có thể gắn Labels cho mỗi con vật dựa trên:

  • class=Thú (hổ, gấu…)
  • class=Chim (vẹt, cú mèo…)
  • color=Xanh, color=Đỏ, color=Vàng
  • habitat=NuôiNhốt, habitat=HoangDã

Giờ nếu bạn muốn tìm:

  • Tất cả các con thuộc lớp Thúclass=Thú
  • Tất cả các con màu xanhcolor=Xanh
  • Tất cả các con chim màu xanhclass=Chim, color=Xanh

Thì bạn dùng Selectors để “lọc” ra mấy con phù hợp!

2. Ứng dụng trong Kubernetes

Kubernetes dùng Labels và Selectors để quản lý hệ thống một cách linh hoạt, ví dụ:

  • ReplicaSet dùng Selector để nhận diện những Pod mà nó quản lý.
  • Service dùng Selector để biết Pod nào sẽ nhận traffic.

Tức là, khi bạn tạo một Service, bạn chỉ cần nói “này Service, mày tìm mấy cái Pod có app=web nha”, và Kubernetes sẽ tự kết nối mọi thứ cho bạn luôn.

3. Cách sử dụng Labels và Selectors

Ví dụ chúng ta đã triển khai các pod và gán nhãn tier, env, bu.

controlplane ~ ➜  kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
db-1-4tmgs    1/1     Running   0          4m14s
db-2-h9sx5    1/1     Running   0          4m14s
app-1-vddc2   1/1     Running   0          4m15s
db-1-bbgf5    1/1     Running   0          4m14s
auth          1/1     Running   0          4m14s
app-1-rt8v4   1/1     Running   0          4m15s
app-2-m9l77   1/1     Running   0          4m14s
app-1-zzxdf   1/1     Running   0          4m14s
app-1-jnlkb   1/1     Running   0          4m15s
db-1-hxj48    1/1     Running   0          4m14s
db-1-cl5zr    1/1     Running   0          4m14s

– Lọc các pod có env=dev

controlplane ~ ➜  kubectl get pods --selector env=dev
NAME          READY   STATUS    RESTARTS   AGE
db-1-4tmgs    1/1     Running   0          4m3s
app-1-vddc2   1/1     Running   0          4m4s
db-1-bbgf5    1/1     Running   0          4m3s
app-1-rt8v4   1/1     Running   0          4m4s
app-1-jnlkb   1/1     Running   0          4m4s
db-1-hxj48    1/1     Running   0          4m3s
db-1-cl5zr    1/1     Running   0          4m3s

– Lọc các pod có bu=finance

controlplane ~ ✖ kubectl get pods --selector bu=finance
NAME          READY   STATUS    RESTARTS   AGE
db-2-h9sx5    1/1     Running   0          5m25s
app-1-vddc2   1/1     Running   0          5m26s
auth          1/1     Running   0          5m25s
app-1-rt8v4   1/1     Running   0          5m26s
app-1-zzxdf   1/1     Running   0          5m25s
app-1-jnlkb   1/1     Running   0          5m26s

– Lọc các pod, replicaset và cả objects khac có env=prod

controlplane ~ ✖ kubectl get all --selector env=prod
NAME              READY   STATUS    RESTARTS   AGE
pod/db-2-h9sx5    1/1     Running   0          7m30s
pod/auth          1/1     Running   0          7m30s
pod/app-2-m9l77   1/1     Running   0          7m30s
pod/app-1-zzxdf   1/1     Running   0          7m30s

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/app-1   ClusterIP   10.43.138.121   <none>        3306/TCP   7m30s

NAME                    DESIRED   CURRENT   READY   AGE
replicaset.apps/db-2    1         1         1       7m30s
replicaset.apps/app-2   1         1         1       7m30s

– Lọc các pod có env=prod, tier=frontend, bu=finace

controlplane ~ ✖ kubectl get pods --selector env=prod,bu=finance,tier=frontend
NAME          READY   STATUS    RESTARTS   AGE
app-1-zzxdf   1/1     Running   0          9m25s

5. Annotations

Ngoài Labels, còn có một người anh em nữa tên là Annotations.

  • Labels dùng để lọc và phân loại.
  • Annotations thì dùng để ghi chú thêm thông tin mà không ảnh hưởng đến việc lọc.

Ví dụ, bạn có thể gắn thông tin build version, maintainer, commit hash… vào annotation.

Hy vọng qua bài viết này, bạn đã nắm vững cách sử dụng Labels and Selectors trong Kubernetes. Cảm ơn bạn đã tham khảo kubernetes cơ bản trên ttnguyen.net.

Bài viết liên quan:

Namespace và Cgroups trong K8S

ClusterIP, NodePort, Loadbalance – Các loại service K8S

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em