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.
Mục lục
- Tổ chức Pod
- Phân chia tài nguyên với Namespace
- Kết luận
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:
Chạy câu lệnh apply:
kubectl apply -f hello-kube.yamlKiểm tra Pod đã chạy chưa:
kubectl get podNAME 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=uiNAME READY STATUS RESTARTS AGE
hello-kube-ios 1/1 Running 0 2m24s
hello-kube-pc 1/1 Running 0 2m23sLiệt kê Pod được triển khai cho System:
kubectl get pod -l app=systemNAME READY STATUS RESTARTS AGE
hello-kube-os 1/1 Running 0 3m13sLabel 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.yamlpod "hello-kube-ios" deleted
pod "hello-kube-pc" deleted
pod "hello-kube-os" deletedPhâ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 nsNAME STATUS AGE
default Active 588d
kube-public Active 588d
kube-system Active 588dTấ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-systemTiế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 testingCá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: TCPTạo Pod:
kubectl apply -f hello-namespace.yamlSau 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 podNo 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 testingNAME READY STATUS RESTARTS AGE
hello-kube-testing 1/1 Running 0 3m13sVậ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 testingTa 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 testingKế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.
First AI Journey for DevOps:
- PromptOps: From YAML to AI
- The DevOps AI Advantage
- The AIOps Book