Table of contents
- Tại sao cần sử dụng labels trong Kubernetes?
- Sử dụng label và selector hiệu quả:
- Quản lý các label với label selector
- Các kĩ thuật quản lý label nâng cao
- Để quản lý label hiệu quả
- Use Labels Consistently Across Your Cluster Sử dụng label cố định trên cụm
- Keep Your Labels Up-to-Date Thường xuyên cập nhật các label
- Use Label Selectors Wisely Sử dụng label selector hợp lý
- Use Labels To Improve Observability Sử dụng label để kiểm soát hiệu quả
- Use Label Policies To Enforce Label Management Standards Dùng label policy để tăng cường tiêu chuẩn quản lý label
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
hayservice1
, hãy sử dụng các tên mô tả rõ hơn nhưenvironment
hayservice-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
hayTEST
để 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
haybackend
thay vì sử dungapp
để 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.