DaemonSet trong Kubernetes là gì ? – Cuongquach.com | Hôm nay chúng ta sẽ cùng tìm hiểu qua một trong những thành phần dịch vụ cơ bản của Kubernetes : DaemonSet . Vậy DaemonSet là gì ? Có những ứng dụng thực tế như thế nào trong hạ tầng Kubernetes ? Cách tạo, xoá, … DaemonSet ra sao ?
Contents
DaemonSet trong Kubernetes là gì ?
DaemonSet là một dạng dịch vụ quản lý các Pod hoạt động với chức năng khá là riêng biệt bằng cách đảm bảo Pod dịch vụ sẽ được chạy trên toàn bộ các Node trong một Kubernetes Cluster (hoặc trên một số Node cụ thể trong Kubernetes Cluster).
DaemonSet sử dụng Pod template, để định nghĩa các thông số cho pod dịch vụ mà bạn sẽ chạy như : sử dụng image gì, volume gì được mount, label, selectors,…
Khi mà bạn thêm một node mới vào Kubernetes Cluster, thì DaemonSet pod sẽ được tự động add vào node mới đó. Cũng tương tự ở chiều ngược lại, khi bạn xoá một node khỏi Kubernetes Cluster thì pod đó sẽ được xoá khỏi hệ thống Kubernetes.

Khi bạn xoá một DaemonSet đang chạy, thì đồng nghĩa bạn xoá tất cả các DaemonSet Pod đang tồn tại.
Sử dụng DaemonSet trong trường hợp nào ?
Hẳn bạn sẽ quan tâm các trường hợp ứng dụng thực tế phổ biến mà ta sẽ chạy dịch vụ ở dạng DaemonSet. :
- Chạy dịch vụ để kết nối cluster storage ở mỗi Kubernetes Node như : glusterd, glusterfs, ceph,..
- Chạy dịch vụ để thu thập log (log container hoặc log os node) ở mỗi Kubernetes Node như : fluentd, logstash, datadog agent,..
- Chạy dịch vụ để giám sát hệ thống node ở mỗi Kubernetes Node như : prometheus node exporter, collectd, datadog agent, newrelic agent..
Nhìn chung thì ba trường hợp trên là ứng dụng thực tế phổ biến nhất đối với DaemonSet trong Kubernetes. Trong những hạ tầng công ty khác nhau, sẽ luôn có những nhu cầu đặc biệt ứng dụng mục đích khác nhau khi triển khai dịch vụ DaemonSet Kubernetes.
Bạn có thể chạy nhiều dịch vụ DaemonSet trong cùng một Node đấy, mỗi DaemonSet có thể đảm nhận chức năng khác nhau dù cùng một source ứng dụng.
Giao tiếp với DaemonSet như thế nào ?
Hm , bạn sẽ giao tiếp với DaemonSet như thế nào nhỉ ? Thì thực ra DaemonSet cũng chỉ là dịch vụ Pod chạy trên mỗi Node nên cách thức nói chuyện cũng sẽ quen thuộc như sau :
- Push: ở cơ chế Push, thì các DaemonSet Pod thường được cấu hình để tự động thu thập dữ liệu và đẩy về 1 dịch vụ cố định. Nên cũng không có nhu cầu client nào giao tiếp hết.
- NodeIP và known port: giống như khi deploy Prometheus Node Exporter, bạn sẽ cho DaemonSet Pods sử dụng
hostPort
và port IP cụ thể trên mỗi Node. Như vậy khi các service discovery sẽ lấy danh sách Kubernetes Node và giao tiếp với DaemonSet qua port mà bạn cấu hình. - DNS: bạn cũng có thể giao tiếp với DaemonSet qua DNS endpoint đấy.
- Service: bạn cũng có thể cấu Service cho DaemonSet, từ đó client khi truy cập DaemonSet qua Service sẽ truy cập ngẫu nhiên một DaemonSet Pod trên ngẫu nhiên Node.
Nhìn chung theo trải nghiệm của mình thì với DaemonSet, người ta hay cấu hình dịch vụ thu thập log tự động hoặc sử dụng NodeIP
& Port
như Prometheus Node Exporter.
Một số thao tác quản trị với DaemonSet Kubernetes
Khởi tạo DaemonSet
Tạo một file Daemonset Manifest với vài lưu ý:
- Bạn phải cấu hình Pod Template
spec.template
: để cấu hình các thông tin mà DaemonSet Pod sẽ chạy. - Bạn phải cấu hình Pod Selector
spec.selector
: để cấu hình cách thức lựa chọn Pod nào sẽ chạy, thường sẽspec.selector.matchLabels
sẽ match với label name của Pod ởspec.template
. - Bạn có thể quy định DaemonSet Pod chỉ chạy trên một số Kubernetes Node cụ thể với
.spec.template.spec.nodeSelector
.
# vi fluentd.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd spec: selector: matchLabels: name: fluentd template: metadata: labels: name: fluentd spec: containers: - name: fluentd image: gcr.io/google-containers/fluentd-elasticsearch:1.20 resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi
Khởi tạo DaemonSet fluentd nào.
# kubectl create -f fluentd.yaml daemonset.apps/fluentd created
Quản lý thông tin DaemonSet
Xem đang có bao nhiêu Kubernetes Node nào.
# kubectl get node NAME STATUS ROLES AGE VERSION ip-10-110-75-79.ap-southeast-1.compute.internal Ready <none> 4d1h v1.14.9-eks-1f0ca9 ip-10-110-75-150.ap-southeast-1.compute.internal Ready <none> 4d1h v1.14.9-eks-1f0ca9
Giờ xem dịch vụ DaemonSet Fluentd có đang chạy không nhé.
# kubectl get daemonset -A NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE default fluentd 2 2 2 2 2 <none> 3h10m 4d1h
Coi thông tin các DaemonSet Fluentd’s Pod. Ta có 2 Node thì sẽ là 2 pod .
# kubectl get pods -A | grep -i "fluentd" default fluentd-jdh64 1/1 Running 0 3h12m default fluentd-de7lh 1/1 Running 0 3h12m
Coi thông tin về DaemonSet Fluentd.
# kubectl get daemonset -n default fluentd -o=yaml apiVersion: extensions/v1beta1 kind: DaemonSet metadata: creationTimestamp: "2020-04-18T05:38:29Z" generation: 1 name: fluentd namespace: default resourceVersion: "266236" selfLink: /apis/extensions/v1beta1/namespaces/default/daemonsets/fluentd uid: 377f8996-4779-4aea-b178-592644cc14b9 spec: revisionHistoryLimit: 10 selector: matchLabels: name: fluentd template: metadata: creationTimestamp: null labels: name: fluentd spec: containers: - image: gcr.io/google-containers/fluentd-elasticsearch:1.20 imagePullPolicy: IfNotPresent name: fluentd resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi terminationMessagePath: /dev/termination-log terminationMessagePolicy: File dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 templateGeneration: 1 updateStrategy: rollingUpdate: maxUnavailable: 1 type: RollingUpdate status: currentNumberScheduled: 1 desiredNumberScheduled: 1 numberAvailable: 1 numberMisscheduled: 0 numberReady: 1 observedGeneration: 1 updatedNumberScheduled: 1
Xoá DaemonSet
Xoá DaemonSet cũng đơn giản.
# kubectl delete daemonset -n default fluentd daemonset.extensions "fluentd" deleted
Cũng khá đơn giản để hiểu vai trò của DaemonSet là gì trong Kubernetes phải không nào ? Ứng dụng DaemonSet sẽ tuỳ theo các nhu cầu đặc thù của mỗi môi trường dịch vụ,… Hy vọng cung cấp đủ kiến thức cơ bản về DaemonSet Kubernetes cho các bạn.
Nguồn: https://cuongquach.com/