---
apiVersion: v1
kind: ConfigMap
metadata:
  name: q6
  labels:
    question.kontest.amsy.dev: "6"
data:
  question: |-
    TaintsをNodeに付与することで、Nodeに対して特定のPodしかスケジュールさせないようにすることができます。
    「env=production:NoExecute」のTaintsが付与されたNodeに対して、下記のPodがスケジュールできるようにしてください。
    なお、その他のTaints（env=staging:NoExecuteなど）は許容しないようにしてください。

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17
  hint: |-
    https://kubernetes.io/ja/docs/concepts/scheduling-eviction/taint-and-toleration/
  base_content.yaml: |-
    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17
  answer.yaml: |-
    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17
      tolerations:
      - key: "env"
        value: "production"
        operator: "Equal"
        effect: "NoExecute"
  comment: |-
    【解説 by カサレアル】
    TaintはNodeの「汚れ」で、それを許容（Tolerations）できるPodのみをスケジューリングできます。
    Taintの書き方は「Key=Value:Effect」です。Effectは全部で3種類あります（下のものほど条件が厳しくなります）。
    - PreferNoSchedule : 可能な限りスケジューリングしない
    - NoSchedule : スケジューリングしない（すでにスケジューリングされているPodはそのまま）
    - NoExecute : 実行を許可しない（すでにスケジューリングされているPodは停止される）
    今回のNodeには「env=production:NoExecute」というTaintが付与されていますので、「envの値がproductionになっているTolerationsを持つPodのみ、実行を許可する」という意味になります。
    このTolerationsを指定するには、 spec.tolerations に下記のように指定します。
      - key: "env"
        value: "production"
        operator: "Equal"
        effect: "NoExecute"
    operator には Equal （KeyとValueが等しい）または Exists （Keyが存在する）を指定可能です。
  author: |-
    Masaya Aoyama (@amsy810)
