# 前言
本文會簡單介紹 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 |
上面的配置架構基本上跟 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 上
的限制
留言