Kubernetes label và selector

Kubernetes label và selector

Kubernetes là một container orchestration platform mạnh mẽ và nổi tiếng cho phép các developers và IT triển khai, quản lý và scale các ứng dụng một cách ổn định và đáng tin cậy. Một tính năng quan trọng của Kubernetes để giúp việc đó có thể thực hiên được là tính năng sử dụng các label.

Label là metadata được gắn vào các object như pod, node và deployment. Các cặp khóa-giá trị (key-value) được dùng để nhận diện và sắp xếp các object theo nhiều cách khác nhau. Ví dụ một label có thể đươc sử dụng để nhận diện môi trường môt pod nào đó đang chạy (test, stage, prod, ..). Nó cũng có thể được sử dụng để chỉ ra loại service mà deployment đang cung cấp (frontend, backend, database, ...)

Các label cực kì hữu dụng trong Kubernetes vì chúng cho phép người dùng có thể chọn và quản lý các nhóm object có cùng mục đích một cách nhanh chóng và hiệu quả.

Ví dụ bạn có rất nhiều pod chạy trên cụm Kubernetes, bạn sẽ cần sử dụng label selector để dễ dàng lưa chọn và quản lý tất cả các pod trong môi trường test hoặc mọi pod cung cấp frontend service.

Tóm lại, label là một thành phần không thể thiếu trong một hệ thống Kubernetes và hiểu được cách sử dụng chúng là một kĩ năng bắt buộc đối với quản trị viên Kubernetes.

Tại sao cần sử dụng labels trong Kubernetes?

Sắp xếp và tổ chức các object

Như đã nói ở trên, các label có thể sắp xếp các object dưa trên các nhu cầu khác nhau. Điều này vô cùng có ích khi làm viêc với các cụm lớn và phức tạp. Các label cho phép bạn dễ dàng chọn lựa và quản lý nhóm các object chia sẻ chung mục đích.

Ví dụ bạn có thể sử dụng label để nhóm các pod dựa trên môi trường hoặc service.

Phân bổ tài nguyên

Các label có thể định nghĩa các policy dùng để phân bổ tài nguyên cho các object. Ta cần dùng Kubernetes resource quotas và limit ranges cho việc này. Ví dụ bạn có thể dùng label để chỉ ra một pod nào đó hoặc deployment nào đó nên được phân bổ một số lượng CPU hay RAM nhất định.

Lập lịch

Các pod có thể được lập lịch qua các node selector, cho phép bạn định nghĩa label criteria cho việc chọn các node. Ví dụ bạn có thể dùng label để định nghĩa rằng một pod nào đó chỉ nên được lập lịch trên các node thoả mãn một số điều kiện (loại CPU, kích thước RAM khả dụng, ...)

Quản trị và kiểm soát

Bạn có thể dùng label để chỉ ra phiên bản của ứng dụng đang chạy trên pod hoặc chỉ ra môi trường mà pod đang chạy. Thông tin này có thể được sử dụng để lọc và nhóm các metric và log giúp cho việc hiểu và troubleshoot các issue trong ứng dụng thuận lợi hơn.

Sử dụng label hiệu quả sẽ giúp bạn nâng cao tính tổ chức trong ứng dụng, dễ dàng quản lý và kiểm soát từ đó thuận lợi hơn trong quá trình triển khai và scale một cách ổn định và tin cậy.

Sử dụng label và selector hiệu quả:

Một số phương pháp sử dụng hiệu quả như sau:

  • Dùng các tên có ý nghĩa: Thay vì sử dụng các label như env hay service1 , hãy sử dụng các tên mô tả rõ hơn như environment hay service-type.

  • Dùng môt quy ước đặt tên cố định: camelCase hoặc snake_case cho các tên label và luôn sử dụng các kí tự viết thường.

  • Dùng các giá trị cố định: Tương tự như trên, việc sử dụng giá trị cố định cho các label sẽ giúp đảm bảo việc đọc hiểu dễ dàng và sử dụng đơn giản hơn. Ví dụ thay vì dùng test, Test hay TEST để chỉ ra môi trường test, ta có thể dùng giá trị cố định như test cho mọi label của môi trường test.

  • Tránh sử dụng quá nhiều label: Mặc dù label rất hữu ích tuy nhiên ta chỉ nên sử dụng một vài label vì số lượng label càng nhiều thì khả năng quản lý và hiểu được label càng giảm. Cố gắng chỉ sử dụng các label cần thiết cho ứng dụng.

  • Tránh sử dụng các label quá tổng quát: Ví dụ ta nên dùng các label chi tiết như frontend hay backend thay vì sử dung app để chỉ ra loại ứng dụng.

Ví dụ về cách dùng label tốt:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    environment: test # descriptive and meaningful name
    service-type: frontend # descriptive and meaningful name
    app_version: v1.0 # consistent naming convention and value
spec:
  containers:
    - name: my-container
      image: my-image

Quản lý các label với label selector

Label selector là các công cụ mạnh mẽ trong Kubernetes cho phép bạn chọn và quản lý nhóm các object. Chúng thường dược dùng trong các resource hỗ trợ label như pod, node, deployment.

Có 2 loại label selector trong Kubernetes: equality-based và set-based. Equality-based selector cho phép bạn chọn các object có một label với khóa và giá trị cụ thể. Ngược lại, set-based selector cho phép bạn chọn các object có label với khóa cụ thể và một hoặc nhiều giá trị cụ thể.

Đây là ví dụ về cách sử dụng equality-based selector để chọn các pod với label environment được đặt là test:

kubectl get pods --selector environment=test

Đây là ví dụ về cách sử dụng set-based selector để chọn các pod với label service-type được đặt là frontend hoặc backend:

kubectl get pods --selector service-type in (frontend, backend)

Ví dụ sử dụng label selector để chỉ ra các pod mà một deployment quản lý:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: my-image

Các kĩ thuật quản lý label nâng cao

Trong Kubernetes, có một số kĩ thuật khác bạn có thể dùng để nâng cao tính hiệu quả và thực dụng trong quản lý label:

Label Aliases

Tạo alias cho label có thể được sử dụng thay cho label đó. Giả sử bạn có một label dùng trong nhiều nơi khác nhau và muốn thay đổi giá trị của nó, bạn có thể sử dụng alias và có thể dùng alias đó tại mọi nơi.

kubectl label alias app=my-app app=my-new-app

Label Policies

Tính năng này cho phép bạn đặt ra các rule cho việc gán label và quản lý cụm. Ví dụ bạn có thể dùng một label policy để định nghĩa rằng mọi pod trong namespace nào đó nê có một label cụ thể nào đó hoặc người dùng hay nhóm nên có một label riêng.

kubectl label policy add-require environment=test --namespace=test --all-pods

Trong ví dụ trên, policy yêu cầu mọi pod trong test namespace phải có label environment đặt là test.

Label Webhooks

Tính năng cho phép bạn đặt ra logic tùy chỉnh cho việc quản lý label trong cụm. Ví dụ bạn có thể dùng label webhook để gán label cho pod dựa trên metadata của chúng. Bạn cũng có thể tạo các rule tùy chỉnh cách label được sử dụng.

Để sử dụng label webhook, bạn cần triển khai một webhook service tùy chỉnh chứa logic quản lý label mong muốn. Sau đó bạn có thể dùng kubectl label webhook để chỉ định webhook service cần dùng.

Để quản lý label hiệu quả

Use Labels Consistently Across Your Cluster Sử dụng label cố định trên cụm

Sử dụng chung label cho chung mục đích bất cứ khi nào có thể và sử dụng quy tắc đặt tên cố định cùng giá trị của các label đó.

Keep Your Labels Up-to-Date Thường xuyên cập nhật các label

Đảm bảo các label phản ánh chính xác trạng thái hiện tại của ứng dụng.

Use Label Selectors Wisely Sử dụng label selector hợp lý

Khi sử dụng label selector, việc lựa chọn criteria là vô cùng quan trọng để đảm bảo bạn chọn đúng các object. Hãy sử dụng các criteria thêm kèm để lọc lựa chọn tốt hơn.

Ví dụ ta có thể dùng nhiều label criteria trong một label selector để chọn các pod trong môi trường test và service frontend:

kubectl get pods --selector environment=test,service-type=frontend

Use Labels To Improve Observability Sử dụng label để kiểm soát hiệu quả

Bạn có thể dùng label để lọc và nhóm các metric và log hoặc nhận diện phiên bản của ứng dụng đang chạy trong pod.

Use Label Policies To Enforce Label Management Standards Dùng label policy để tăng cường tiêu chuẩn quản lý label

Nếu làm việc cùng các cụm Kubernetes lớn hoặc phức tạp, hãy cân nhắc sử dụng label policy để phát triển tiêu chuẩn quản lý label. Điều này sẽ giúp cho việc sử dụng các label trong cụm cố định hơn và giúp việc quản lý và bảo trì các ứng dụng dễ dàng hơn.