KubernetesでPodがスケジューリングできない原因と解決方法(nodeのallocatableを調整する)

kubenetesロゴ

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
allocate再確認

node01にSSH接続

ssh node01

kubeletの設定を変更

vi /var/lib/kubelet/config.yaml

kubeletを再起動

sudo systemctl restart kubelet

allocatableが増えたことを確認

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つの方法として使える内容です