📝

EKS Fargate で PDB を設定した際にポッドを削除した場合の挙動を確認してみた

に公開

Protect critical workloads with a PDB - AWS Prescriptive Guidance

A pod disruption budget (PDB) is an essential feature for maintaining the high availability of applications in a cluster. The PDB specifies a target size, which is the minimum availability for a particular type of pod. This means that a minimum number of replicas of a particular pod type must be running at any given time.

PDB を設定した際に kubectl delete pod でポッドを削除した場合、対象のポッドは削除され、新規のポッドが起動する挙動でした。

前提

  • コマンド実行環境: CloudShell

検証内容

# 必要なコマンドのインストール
$ kubectl version --client
Client Version: v1.33.0-eks-802817d
Kustomize Version: v5.6.0

$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp

$ sudo mv /tmp/eksctl /usr/local/bin

$ eksctl version
0.212.0

# EKS Fargate クラスターの作成
$ eksctl create cluster \
--name pdb-test-cluster \
--region ap-northeast-1 \
--fargate

# クラスター情報確認
$ kubectl get nodes
NAME                                                        STATUS   ROLES    AGE    VERSION
fargate-ip-192-168-128-46.ap-northeast-1.compute.internal   Ready    <none>   113s   v1.32.7-eks-ace6451
fargate-ip-192-168-172-86.ap-northeast-1.compute.internal   Ready    <none>   109s   v1.32.7-eks-ace6451

$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   9m39s
kube-node-lease   Active   9m39s
kube-public       Active   9m39s
kube-system       Active   9m39s

# PDB の設定ファイル作成
$ cat > pdb-test.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-app
  template:
    metadata:
      labels:
        app: test-app
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: test-pdb
  namespace: default
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: test-app
EOF

# アプリケーションと PDB のデプロイ
$ kubectl apply -f pdb-test.yaml
deployment.apps/test-app created
poddisruptionbudget.policy/test-pdb created

# デプロイ結果の確認
$ kubectl get deployments
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
test-app   1/1     1            0           14s

# ポッドが起動すれば OK
$ kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
test-app-5c95798477-c2gnv   1/1     Running   0          5m44s

# PDB の設定確認
$ kubectl get pdb
NAME       MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
test-pdb   1               N/A               0                     6m34s

# ポッドの削除
$ kubectl delete pod test-app-5c95798477-c2gnv
pod "test-app-5c95798477-c2gnv" deleted

# ポッドの確認
$ kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
test-app-5c95798477-dbg7v   0/1     Pending   0          4s # 新ポッドが起動

以上より、kubectl delete pod 実行後すぐに新しいポッドが起動することを確認できました。
なお、ポッドが 1 つの状態で minAvailable を 1 に設定した場合でもダウンタイムは避けられない旨の情報もありました。
KubernetesのPDBでminAvailableに1を設定するとdrainに失敗する|サラトガ牧場

やはり 1 台だけで稼働させているテスト的な環境では、drain 時の一時的な通信断は避けられないかなぁ。

まとめ

今回は EKS Fargate で PDB を設定した際にポッドを削除した場合の挙動を確認してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion