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