Kubernetes - 建立一個 DaemonSet

# 前言

本文會簡單介紹 Kubernetes DaemonSet, 並且實際建立一個 DaemonSet



# 簡介

DaemonSet 是一種 Pod 控制器, 簡單來說, 我們可以定義所有部分 的 Node 上自動運行 DaemonSet 所定義的 Pod
當新的 Node 被加入 Cluster, DaemonSet 所定義的 Pod 會自動 schedule 到該 Node, 而當該 Node 從 Cluster 被移除時, 該 Pod 也會被移除
常見的三種應用:

  • 用來運行 Cluster 規模的儲存應用, 像是 Ceph
  • 在每個 Node 上運行 Logs collection 應用, 像是 Fluentd-elasticsearch
  • 在每個 Node 上運行監控應用, 像是 Prometheus


# 實作

下面我們就依照官方文件簡單的來部署一個 DaemonSet 吧

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
# this toleration is to have the daemonset runnable on master nodes
# remove it if your masters can't run pods
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers

上面的配置架構基本上跟 Deployment 差不多

resources 為定義 Pod 的資源限制, request 為 將該 Pod 放置到該 Node, 該 Node 需耗費的資源, limit 為 該 Pod 可使用的資源限制, 若有多個 container, 相加之後就等於該 Pod 的資源限制。 詳情可參考 Kubernetes Resources

volumeMounts 會將定義的 volume 與 mountPath 定義的位置互相同步

volumes 可使用多種來源, configMap, secret 都是可以的, 這邊使用 hostPath, 為該 Pod 的 Host 位置, 也就試運行該 Pod 的 Node 位置

要特別注意的是 toleration, DaemonSet 預設是不會把 Pod 部署到 master node 上的, 但加了 toleration 的設定後, 就可以解除這個限制

讓我們實際部署吧, 可以 apply 上面的 yaml, 也可以 apply 官網提供的 url

kubectl apply -f https://k8s.io/examples/controllers/daemonset.yaml

接著讓我們來觀察一下是否每個 Node 都被分配了這個 Pod

kubectl get pods -l name=fluentd-elasticsearch -A -o wide

可以看到, 每個 Node 上都被部署了該 DaemonSet 定義的 Pod



# 結語

風蕭蕭兮易水寒, 壯士一去兮… 不復還…
拍謝我自己都不知道自己在工啥小
好啦! 本文就到此結束, 謝謝各位, 我們下次見!



# Questions and Answers

以下的 Kubernetes example code 代表什麼意思?
  • Example:
    kubectl get pods -l name=fluentd-elasticsearch -A -o wide
  • Answer:
    取出所有 Namespace 中, labels 為 name=fluentd-elasticsearch 的 Pod, output = wide
以下的 Kubernetes example code 代表什麼意思?
  • Example:
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
    name: fluentd-elasticsearch
    namespace: kube-system
    labels:
    k8s-app: fluentd-logging
    spec:
    selector:
    matchLabels:
    name: fluentd-elasticsearch
    template:
    metadata:
    labels:
    name: fluentd-elasticsearch
    spec:
    tolerations:
    - key: node-role.kubernetes.io/master
    effect: NoSchedule
    containers:
    - name: fluentd-elasticsearch
    image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
    terminationGracePeriodSeconds: 30
  • Answer:
    使用 tolerations 來解除 DaemonSet 預設並不會將 Pod 部署到 master node 上 的限制
Recursion (遞迴) 簡介 - PHP 範例 Kubernetes - DaemonSet

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×