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.
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:
- kubia
Có 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: 3000
Chạy câu lệnh apply
:
kubectl apply -f hello-rs.yaml
Kiểm tra RS có tạo thành công không:
kubectl get rs
NAME DESIRED CURRENT READY AGE
hello-rs 2 2 2 3s
Kiểm tra số lượng Pod được tạo bởi RS có bằng với trường replicas
:
kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-rs-gmxfp 1/1 Running 0 21s
hello-xhtkg 1/1 Running 0 21s
Nế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-rs
DaemonSets
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=ssd
Sau đó 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-monitor
Khi 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.
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ả?