Bài viết thuộc series Kubernetes cơ bản
Giới thiệu
Ở bài trước ta đã tìm hiểu Pod là gì. Trong bài này ta cùng tìm hiểu cách quản lý Pod bằng cách sử dụng thuộc tính Labels.
Tổ chức Pod
Dùng label là cách để chúng ta có thể phân chia các pod khác nhau tùy thuộc vào dự án hoặc môi trường. Ví dụ công ty của chúng ta có 3 môi trường là testing, staging, production, nếu chạy pod mà không có đánh label thì chúng ta rất khó để biết pod nào thuộc môi trường nào.
Hãy hình dung trường hợp công ty của chúng ta có rất nhiều ứng dụng được triển khai với rất nhiều Pod như hình bên dưới:
Làm sao ta biết được Pod đó đang chạy gì và dùng cho mục đích gì? Cách đơn giản nhất là ta đặt tên cho Pod như hình ở trên là Order Service Pod cho Order hoặc Product Pod cho Product. Nhưng ta không thể nhóm Pod theo chức năng và ứng dụng. Ví dụ ta cần liệt kê toàn bộ Pod cho một ứng dụng thì ta làm thế nào? Chỉ với tên thì ta không thể làm được.
Pod cung cấp thuộc tính labels
để làm việc này. Sau khi ta gán label cho Pod thì ta có thể nhóm Pod lại như hình bên dưới:
Để định nghĩa label cho Pod ta dùng thuộc tính metadata.labels
và đặt tên theo cặp <key>: <value>
với giá trị ta muốn, ví dụ ta tạo tệp tin hello-kube.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: hello-kube-ios
labels:
app: ui
spec:
containers:
- image: 080196/hello-kube
name: hello-kube
ports:
- containerPort: 3000
protocol: TCP
---
apiVersion: v1
kind: Pod
metadata:
name: hello-kube-pc
labels:
app: ui
spec:
containers:
- image: 080196/hello-kube
name: hello-kube
ports:
- containerPort: 3000
protocol: TCP
---
apiVersion: v1
kind: Pod
metadata:
name: hello-kube-os
labels:
app: system
spec:
containers:
- image: 080196/hello-kube
name: hello-kube
ports:
- containerPort: 3000
protocol: TCP
Chạy câu lệnh apply:
kubectl apply -f hello-kube.yaml
Kiểm tra Pod đã chạy chưa:
kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-kube-ios 1/1 Running 0 89s
hello-kube-pc 1/1 Running 0 90s
hello-kube-os 1/1 Running 0 90s
Ở trên ta định nghĩa hai Pod với labels: app: ui
và một Pod với labels: app: system
. Để chọn Pod theo labels ta dùng câu lệnh get
với -l
. Ví dụ liệt kê Pod được triển khai cho UI:
kubectl get pod -l app=ui
NAME READY STATUS RESTARTS AGE
hello-kube-ios 1/1 Running 0 2m24s
hello-kube-pc 1/1 Running 0 2m23s
Liệt kê Pod được triển khai cho System:
kubectl get pod -l app=system
NAME READY STATUS RESTARTS AGE
hello-kube-os 1/1 Running 0 3m13s
Label là cách rất hay giúp ta tổ chức và quản lý Pod giữa các môi trường và dự án khác nhau. Nhớ xóa Pod sau khi làm xong:
kubectl delete -f hello-kube.yaml
pod "hello-kube-ios" deleted
pod "hello-kube-pc" deleted
pod "hello-kube-os" deleted
Phân chia tài nguyên với Namespace
Trong Kubernetes để quản lý và phân chia tài nguyên giữa các môi trường thì ta sử dụng Namespace.
Ví dụ ứng dụng của ta cần ba môi trường là testing, staging, production thì ta cần tạo ba namespace tương ứng. Ta có thể hiểu đơn giản Environment ~= Namespace
.
Mặc định khi bạn tạo Kubernetes Cluster nó có một vài namespace mặc định. Để liệt kê toàn bộ namespace:
kubectl get ns
NAME STATUS AGE
default Active 588d
kube-public Active 588d
kube-system Active 588d
Tất cả Pod ta tạo trong các bài trước đây đều nằm trong namespace tên là default.
Khi ta sử dụng câu lệnh kubectl get pod
để liệt kê Pod, kubectl tự động hiểu ta đang làm việc với default. Để chỉ định namespace thì ta thêm --namespace
vào khi chạy câu lệnh. Ví dụ liệt kê Pod ở kube-system
:
kubectl get pod --namespace kube-system
Tiếp theo ta thử tạo một namespace mới và tạo Pod trong namespace đó. Tạo namespace tên là testing
kubectl create ns testing
Cách tổ chức namespace tiêu chuẩn là tạo theo định dạng <project_name>-<enviroment>. Ví dụ: scaleup-testing, scaleup-staging, scaleup-production
Tạo một tệp tin tên là hello-namespace.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: hello-kube-testing
namespace: testing # namespace name
spec:
containers:
- image: 080196/hello-kube
name: hello-kube
ports:
- containerPort: 3000
protocol: TCP
Tạo Pod:
kubectl apply -f hello-namespace.yaml
Sau khi tạo Pod nếu ta liệt kê Pod mà không chỉ định namespace vào thì ta sẽ không thấy Pod vừa tạo.
kubectl get pod
No resources found in testing namespace.
Để liệt kê được Pod vừa tạo ta chỉ định thêm -n
khi gõ câu lệnh:
kubectl get pod -n testing
NAME READY STATUS RESTARTS AGE
hello-kube-testing 1/1 Running 0 3m13s
Vậy là ta đã tạo namespace và Pod thành công. Nhớ xóa Pod đi nhé:
kubectl delete pod hello-kube-testing -n testing
Ta có thể xóa namespace với câu lệnh delete
, nhưng chú ý là khi xóa namespace thì toàn bộ tài nguyên trong đó cũng bị xóa theo.
kubectl delete ns testing
Kết luận
Sử dụng labels để tổ chức và quản lý Pod. Sử dụng namespace để quản lý tài nguyên giữa các môi trường trong Kubernetes.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?