Label là các cặp giá trị key:value được gán vào một đối tượng trong Kubernetes như Pod, được sử dụng để chúng ta có thể định danh một đối tượng Kubernetes một cách nhanh chóng. Còn Selector thì được dùng để filter một tập hợp các đối tượng Kubernetes thoả mãn các điều kiện nào đó. Cụ thể như thế nào? Chúng ta hãy cùng nhau tìm hiểu thêm trong bài viết này các bạn nhé!
Điều đầu tiên đó là chúng ta có thể định nghĩa Label trong tập tin spec định nghĩa thông tin của một đối tượng Kubernetes.
Cú pháp của Label như sau:
1 2 3 4 |
metadata: labels: <key1>: <value1> <key2>: <value2> |
Trong đó key1:value1, key2:value2 là các cặp giá trị mà chúng ta muốn gán cho đối tượng Kubernetes.
Ví dụ như nếu mình muốn chạy một Pod với các Label được gán cho Pod này, mình sẽ định nghĩa spec của Pod như sau:
1 2 3 4 5 6 7 8 9 10 11 |
apiVersion: v1 kind: Pod metadata: name: huongdanjava labels: env: test purpose: blog spec: containers: - name: node-hello image: gcr.io/google-samples/node-hello:1.0 |
Kiểm tra kết quả sau khi tạo mới Pod từ tập tin spec .yaml trên, các bạn sẽ thấy kết quả như sau:
Như các bạn thấy, Pod huongdanjava của mình đã được gán với 2 Label mà chúng ta đã định nghĩa trong tập tin spec.
Chúng ta có thể có nhiều đối tượng Kubernetes có cùng Label, để thuận tiện cho việc filter một tập các đối tượng Kubenetes có cùng Label hoặc thoả mãn một hoặc vài tiêu chí gì đó, khái niệm Selector cũng được sử dụng trong Kubernetes.
Phân cách với nhau bằng dấu phẩy, các tiêu chí để filter của Selector được định nghĩa với mệnh đề AND. Chúng ta có 2 cách để filter với Selector đó là:
- Equality-based requirements
- Set-based requirements
Mình xin phép giữ nguyên tên tiếng anh của 2 cách trên. Nói nôm na thì Equality-based requirements sẽ sử dụng các toán tử =, ==, != cho phép chúng ta filter sử dụng key và value của Label. Chúng ta định nghĩa Selector này trong tập tin spec như sau:
1 2 3 |
selector: <key1>: <value1> ... |
Nếu cách bạn muốn sử dụng Selector cho Node thì các bạn có thể định nghĩa là:
1 2 3 |
nodeSelector: <key1>: <value1> ... |
các bạn nhé!
Còn Set-based thì sử dụng các toán tử in, notin và exists để filter chỉ cho key của Label.
1 2 3 4 5 |
selector: matchLabels: <key1>: <value1> matchExpressions: - { key: <key2>, operator: In, values: [<value1, <value2>]} |
Chúng ta có thể sử dụng Selector để tạo các Pod trên các Node mà Label của các Node này thoả mãn một điều kiện nào đó hoặc tạo Deployment sử dụng các Pod mà Label của chúng thoả mãn một điều kiện nào đó cũng được.