KubernetesでPodがスケジューリングできない原因と解決方法(nodeのallocatableを調整する)
KubernetesでDeploymentを作成したのに、Podが作成されず「未割り当てのまま」になることがあります。
本記事では、nodeのリソース(allocatable)不足が原因でPodが作成できない場合の確認方法と解決方法を解説します。
CKA試験対策としても非常に重要なポイントです。
記事の目次
今回の検証環境
学習環境として下記を使用しています。
- Killercoda
- 1ノード構成(node01)
まずはnodeのallocatableを確認
最初に、nodeで実際にPodへ割り当て可能なリソースを確認します。
kubectl get node node01 -o yaml | grep -A10 allocatable出力例:
allocatable:
cpu: "0"
ephemeral-storage: "18698430040"
hugepages-2Mi: "0"
memory: 822528Ki
pods: "110"
capacity:
cpu: "1"
ephemeral-storage: 19221248Ki
hugepages-2Mi: "0"
memory: 1948928Ki
重要ポイント
- capacity:nodeが持っている最大リソース
- allocatable:Podに割り当て可能なリソース
つまり今回の環境では
CPUがPodに割り当てられない状態になっています。
kubeletの設定を確認
node01にログインして、kubeletの設定を確認します。
view /var/lib/kubelet/config.yaml設定内容:
kubeReserved:
cpu: 1000m
memory: 1000Mi
どういう意味?
nodeのCPUが1コアなのに
1000m = 1CPUを予約しているため、
Podに割り当てるCPUが0になっています。
リソース不足を再現するDeployment
次に、Podが作成できないDeploymentを作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: fail-test
spec:
replicas: 1
selector:
matchLabels:
app: fail-test
template:
metadata:
labels:
app: fail-test
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: "10m"デプロイ:
kubectl apply -f deploy.yaml
kubectl get deploy結果:
Podは作成されず、未割り当てのままになります。
解決方法:allocatableを増やす
まず現在のリソースを再確認します。
kubectl get node node01 -o yaml | grep -A10 allocatable
node01にSSH接続
ssh node01
kubeletの設定を変更
vi /var/lib/kubelet/config.yaml
kubeletを再起動
sudo systemctl restart kubeletallocatableが増えたことを確認
kubectl get node node01 -o yaml | grep -A10 allocatable
CPUが割り当て可能になっていればOKです。
再デプロイ
kubectl apply -f deploy.yaml
kubectl get deploy
今度はDeploymentが正常に作成されます 🎉
まとめ
Podが作成できない場合は、以下を確認しましょう。
確認ポイント
- nodeのallocatable
- kubeReservedの設定
- resources.requests の値
結論
nodeのリソース不足は、kubeletのreserved設定で調整できます。
特にCKA試験では
- PodがPendingになる
- リソース不足でスケジューリングできない
という問題が非常によく出ます。
この手順はそのまま試験対策の1つの方法として使える内容です
- タグ:
- kubernetes