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 を想定されていることが多くなったので、ここ一年ぐらいで楽になってきましたね。