Kubernetes小ネタです。
EKS Fargateは便利なのですが、Fargate = PodなのでDaemonSetは配置できません。ということで、「DaemonSetをFargateには配置しない」をNode Affinityで実現しましょう。
Node affinity を用いた Fargate にスケジュールしない指定
単純なNodeGroupベースの配置ならnodeSelectorでいいのですが、FargateかどうかとなるとNode affinityのほうが柔軟に管理しやすいのでこれを用ています。
apiVersion: apps/v1 kind: DaemonSet metadata: name: foo-daemonset spec: selector: matchLabels: k8s-app: foo-daemonset template: metadata: labels: k8s-app: foo-daemonset spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: NotIn values: - fargate containers: - name: foo image: foo
設定に関してはAssigning Pods to Nodesを参照するのが王道です。大体ここに書いてあります。
Node affinityには2つの指定方法があります。 IgnoredDuringExecutionはNodeのラベルがスケジュール後に代わってもPodをそこで動作させ続ける意味です。
requiredDuringSchedulingIgnoredDuringExecution: 指定した条件のNodeに配置できないならスケジュールはしない。nodeSelectorと同じような使い方preferredDuringSchedulingIgnoredDuringExecution: 指定した条件のNode配置できるなら配置したいけどだめなら他のNodeにスケジュールして良し
幸いEKS FargateはSelectorにeks.amazonaws.com/compute-type: fargateを持っているのでこれで指定できますね。
どんな時に使う?
DaemonSetなので、管理用に入れているエージェント系Podが多いことでしょう。私の場合、Datadog AgentやNodeLocal DNSCache、FluentBitで利用すること多いです。
HelmでnodeAffinityを想定されていることが多くなったので、ここ一年ぐらいで楽になってきましたね。