DaemonSetは、クラスターの各ノードでポッドを実行し、ポッドが1つだけであることを保証するオブジェクト(デーモン)です。これは、ログ収集、リソース監視など、アプリケーションが必要とする一部のシステムレベルのアプリケーションに非常に適しています。各ノードは実行され、あまり多くのインスタンスを必要としません。良い例は、Kubernetesのkube-proxyです。
DaemonSetはノードに関連しています。ノードが異常な場合、他のノードでは再作成されません。
図1DaemonSet
以下は、DaemonSetの例です。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
labels:
app: nginx-daemonset
spec:
selector:
matchLabels:
app: nginx-daemonset
template:
metadata:
labels:
app: nginx-daemonset
spec:
nodeSelector: # 节点选择,当节点拥有daemon=need时才在节点上创建Pod
daemon: need
containers:
- name: nginx-daemonset
image: nginx:alpine
resources:
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
imagePullSecrets:
- name: default-secret
ここでは、各ノードが1つに固定されているため、DeploymentまたはStatefulSetにreplicasパラメーターがないことがわかります。
ポッドテンプレートにはnodeSelectorがあり、ポッドが「daemon = need」のノードにのみ作成されることを指定しています。次の図に示すように、DaemonSetは指定されたラベルのノードにのみポッドを作成します。各ノードにポッドを作成する必要がある場合は、ラベルを削除できます。
図2DaemonSetは、指定されたラベルでノード上にポッドを作成します
DaemonSetを作成します。
$ kubectl create -f daemonset.yaml
daemonset.apps/nginx-daemonset created
クエリにより、nginx-daemonsetにポッドが作成されていないことがわかりました。
$ kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-daemonset 0 0 0 0 0 daemon=need 16s
$ kubectl get pods
No resources found in default namespace.
これは、ノードにdaemon = needラベルがないためです。次のコマンドを使用して、ノードのラベルを照会します。
$ kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
192.168.0.212 Ready <none> 83m v1.15.6-r1-20.3.0.2.B001-15.30.2 beta.kubernetes.io/arch=amd64 ...
192.168.0.94 Ready <none> 83m v1.15.6-r1-20.3.0.2.B001-15.30.2 beta.kubernetes.io/arch=amd64 ...
192.168.0.97 Ready <none> 83m v1.15.6-r1-20.3.0.2.B001-15.30.2 beta.kubernetes.io/arch=amd64 ...
ノード192.168.0.212にタグを付けてから、もう一度確認すると、ポッドが作成されており、ポッドがノード192.168.0.212上にあることがわかります。
$ kubectl label node 192.168.0.212 daemon=need
node/192.168.0.212 labeled
$ kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-daemonset 1 1 0 1 0 daemon=need 116s
$ kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-daemonset-g9b7j 1/1 Running 0 18s 172.16.3.0 192.168.0.212
次に、ノード192.168.0.94にラベルを付けて、別のポッドが作成されていることを確認します。
$ kubectl label node 192.168.0.94 daemon=need
node/192.168.0.94 labeled
$ kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-daemonset 2 2 1 2 1 daemon=need 2m29s
$ kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-daemonset-6jjxz 0/1 ContainerCreating 0 8s <none> 192.168.0.94
nginx-daemonset-g9b7j 1/1 Running 0 42s 172.16.3.0 192.168.0.212
192.168.0.94ノードのラベルを変更すると、DaemonSetがこのノードのポッドを削除することがわかります。
$ kubectl label node 192.168.0.94 daemon=no --overwrite
node/192.168.0.94 labeled
$ kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-daemonset 1 1 1 1 1 daemon=need 4m5s
$ kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-daemonset-g9b7j 1/1 Running 0 2m23s 172.16.3.0 192.168.0.212