tech.guitarrapc.cóm

Technical updates

EKS Fargate に DaemonSet を配置しない Node Affinity

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