---
apiVersion: v1
kind: ConfigMap
metadata:
  name: q19
  labels:
    question.kontest.amsy.dev: "19"
data:
  question: |-
    Kubernetesではノードをメンテナンスなどに入れる際には、「kubectl drain」コマンドを利用してそのノード上のPodを追い出します。
    複数台のノードをdrainした際に同時に同じ種類のPodが停止されてしまうと、サービスに影響が発生してしまいます。
    複数台のノードを停止した場合でも、次のDeploymentの最低30%（minAvailable=30%）のPodが起動されていることを保証するようにPodDisruptionBudgetリソースを作成してください。
    なお、このDeploymentのレプリカ数は変わるものとします。
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 10
      selector:
        matchLabels:
          app: nginx-app
      template:
        metadata:
          labels:
            app: nginx-app
        spec:
          containers:
          - name: nginx-container
            image: amsy810/echo-nginx:v2.0

  hint: |-
    https://kubernetes.io/docs/tasks/run-application/configure-pdb/
  base_content.yaml: |-
    apiVersion: policy/v1beta1
    kind: PodDisruptionBudget
    metadata:
      name: nginx-pdb
    spec:

  answer.yaml: |-
    apiVersion: policy/v1beta1
    kind: PodDisruptionBudget
    metadata:
      name: nginx-pdb
    spec:
      minAvailable: 30%
      selector:
        matchLabels:
          app: nginx-app

  comment: |-
    【解説 by カサレアル】
    PodDisruptionBudgetの spec には、下記3つの値を指定可能です。
    - maxUnavailable : 停止できるPodの最大値です。Pod数またはパーセンテージで指定します。
    - minAvailable : 動作しているPodの最小値です。Pod数またはパーセンテージで指定します。
    - selector : このPodDisruptionBudgetによって管理されるPodの条件を指定します。 matchLabels にはラベル、 matchExpressions にはラベルセレクターを指定可能です。
    今回の場合、Deploymentの spec.selector.matchLabels が app: nginx-app なので、同じラベルを PodDisruptionBudgetの spec.selector.matchLabels にも指定すればOKです。
  author: |-
    Masaya Aoyama (@amsy810)
