Bài viết thuộc series Kubernetes cơ bản
Giới thiệu
Ở bài trước ta đã tìm hiểu cách sử dụng Replication Controllers. Trong bài này ta tìm hiểu về resource phiên bản nâng cao của Replication Controllers là ReplicaSets. Và cách sử dụng DaemonSet.
Mục lục
- So sánh ReplicaSets và Replication Controllers
- Sử dụng ReplicaSets
- DaemonSets
- Kết luận
- Bài viết liên quan
So sánh ReplicaSets và Replication Controllers
Replication Controllers (RC) đã được thay thế bởi ReplicaSets (RS) trong phiên bản Kubernetes 1.9.
RS và RC là hai resource hoạt động tương tự nhau. Nhưng RS linh hoạt hơn ở thuộc tính Label Selector. Với RC nó chỉ có thể chọn Pod mà có Label hoàn toàn giống với Label của nó. Còn RS cho phép dùng một số biểu thức trong mục Label Selector.
Ví dụ RC không thể nào chọn Pod có env=production và env=testing cùng lúc được, trong khi thằng RS có thể, bằng cách chỉ định label selector với giá trị env=*** . Ngoài ra RS còn hỗ trợ dùng Operators với thuộc tính matchExpressions như sau:
selector:
matchExpressions:
- key: app
operator: In
values:
- kubiaCó bốn Operators cơ bản là: In, NotIn, Exists, DoesNotExist. Cho phép một RS có thể chọn được nhiều Pod khác nhau.
Sử dụng ReplicaSets
Chúng ta sẽ dùng ReplicaSets (RS) để triển khai Pod thay vì dùng RC. Cấu hình RS sẽ giống với RC, chỉ khác thuộc tính selector. Tạo tệp tin tên là hello-rs.yaml:
apiVersion: apps/v1 # change version API
kind: ReplicaSet # change resource name
metadata:
name: hello-rs
spec:
replicas: 2
selector:
matchLabels: # change here
app: hello-kube
template:
metadata:
labels:
app: hello-kube
spec:
containers:
- image: 080196/hello-kube
name: hello-kube
ports:
- containerPort: 3000Chạy câu lệnh apply:
kubectl apply -f hello-rs.yamlKiểm tra RS có tạo thành công không:
kubectl get rsNAME DESIRED CURRENT READY AGE
hello-rs 2 2 2 3sKiểm tra số lượng Pod được tạo bởi RS có bằng với trường replicas:
kubectl get podNAME READY STATUS RESTARTS AGE
hello-rs-gmxfp 1/1 Running 0 21s
hello-xhtkg 1/1 Running 0 21sNếu có 2 pod tạo ra thì chúng ta đã chạy RS thành công. Như ta thấy cách hoạt động của RS giống với RC, chỉ khác ở cấu hình thuộc tính selector. Đây có thể là một câu hỏi xuất hiện trong buổi phỏng vấn nếu ta gặp người thích hỏi về lý thuyết.
Để xóa RS ta chạy câu lệnh delete:
kubectl delete rs hello-rsDaemonSets
Khác với RS, Pod được quản lý bằng RS có thể triển ở bất cứ Node nào, và trong một Node có thể chạy nhiều Pod. DaemonSets được sử dụng khi ta muốn triển khai mỗi Node một Pod, số lượng Pod sẽ tương ứng với số lượng Node được chọn, nó sẽ không có thuộc tính replicas.
Một trong các ứng dụng của DaemonSets là sử dụng trong việc thu thập log và giám sát hệ thống. Khi ta cần thu thập log từ Node thì ta chỉ cần mỗi Node một Pod, vì nếu có nhiều hơn một Pod cùng thu thập log từ Node thì sẽ bị trường hợp log bị trùng khi lưu trữ.
Một ví dụ khác ta cần giám sát tất cả Node sử dụng ổ đĩa SSD. Ta sẽ đánh label vào Node như sau:
kubectl label nodes <your-node-name> disk=ssdSau đó chỉ định vào thuộc tính nodeSelector của DaemonSets:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ssd-monitor
spec:
selector:
matchLabels:
app: ssd-monitor
template:
metadata:
labels:
app: ssd-monitor
spec:
nodeSelector: # config here
disk: ssd
containers:
- name: main
image: luksa/ssd-monitorKhi tạo DaemonSets thì nó chỉ triển khai Pod tới những Node nào được đánh label là disk=ssd.
Tìm hiểu nhiều hơn về DaemonSets ở đây.
Kết luận
Ta đã tìm hiểu xong về ReplicaSets và DaemonSet. RS là resource nâng cao của RC và được sử dụng trong thực tế. Sử dụng DaemonSet khi ta muốn triển khai mỗi Node một Pod.
First AI Journey for DevOps:
- PromptOps: From YAML to AI
- The DevOps AI Advantage
- The AIOps Book