DaemonSet trong Kubernetes là gì ?

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 ?

daemonset-kubernetes-la-gi

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.

DaemonSet trong Kubernetes là gì ?
DaemonSet trong Kubernetes là gì ?

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/

Previous articleResize EBS Volume cho AWS EC2 Instance không cần restart
Next articleEbook Giáo Trình Lập Trình Java Cơ Bản (PDF)
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !