Chuyển đến nội dung chính

レッスン2: クラスタアップグレード(kubeadm)

kubeadmでクラスタをアップグレードする手順。コントロールプレーンとワーカーノードの 段階的アップグレード。バージョンスキューポリシー、drain/uncordon。

kubeadmクラスタアップグレードフロー — コントロールプレーンとワーカー

1. バージョンスキューポリシー

コンポーネント許容バージョン差
kube-apiserver基準バージョン (例: 1.30)
controller-manager, schedulerapiserver ± 1 (例: 1.29–1.30)
kubeletapiserver -2 〜 apiserver (例: 1.28–1.30)
kubectlapiserver ± 1

試験のポイント:1マイナーバージョンずつアップグレードする必要があります(例: 1.29 → 1.30 → 1.31)。バージョンスキップはサポートされていません。

2. コントロールプレーンのアップグレード

# ステップ1: kubeadmのアップグレード
sudo apt-get update
sudo apt-get install -y kubeadm=1.30.0-00
kubeadm version  # 確認

# ステップ2: アップグレードプランの確認
sudo kubeadm upgrade plan

# ステップ3: コントロールプレーンの適用
sudo kubeadm upgrade apply v1.30.0

# ステップ4: ノードのdrain
kubectl drain controlplane --ignore-daemonsets

# ステップ5: kubelet & kubectlのアップグレード
sudo apt-get install -y kubelet=1.30.0-00 kubectl=1.30.0-00
sudo systemctl daemon-reload
sudo systemctl restart kubelet

# ステップ6: uncordon
kubectl uncordon controlplane

3. ワーカーノードのアップグレード

# コントロールプレーンからdrainを実行
kubectl drain worker1 --ignore-daemonsets --delete-emptydir-data

# ワーカーノードにSSH
ssh worker1

# kubeadmのアップグレード
sudo apt-get update
sudo apt-get install -y kubeadm=1.30.0-00

# ノード設定のアップグレード
sudo kubeadm upgrade node

# kubeletのアップグレード
sudo apt-get install -y kubelet=1.30.0-00
sudo systemctl daemon-reload
sudo systemctl restart kubelet

# コントロールプレーンに戻ってuncordon
exit
kubectl uncordon worker1

4. drain & cordon

コマンド動作
kubectl cordon NODE新しいPodのスケジュールを無効化(既存Podは維持)
kubectl drain NODEcordon + 既存Podの退避(eviction)
kubectl uncordon NODEスケジュール可能に戻す

5. チートシート

タスクコマンド
アップグレード計画確認kubeadm upgrade plan
コントロールプレーン適用kubeadm upgrade apply v1.30.0
ワーカーノード設定更新kubeadm upgrade node
ノードのdrainkubectl drain NODE --ignore-daemonsets
ノードのuncordonkubectl uncordon NODE

6. 練習問題

Q1:コントロールプレーンのアップグレード手順として正しい順序は?

  • A) kubelet → kubeadm → kubectl
  • B) kubeadm → kubeadm upgrade apply → drain → kubelet/kubectl → uncordon ✓
  • C) kubectl → kubeadm → kubelet
  • D) drain → kubeadm → kubelet → uncordon → kubeadm upgrade

解説:正しい順序は、まずkubeadmパッケージをアップグレードし、kubeadm upgrade applyを実行、ノードをdrain、kubeletとkubectlをアップグレード、最後にuncordonです。

Q2:kubectl drain node1で--ignore-daemonsetsフラグを使用しない場合、何が起きますか?

  • A) DaemonSetのPodが削除される
  • B) drainがエラーで失敗する — DaemonSetのPodは退避できないため ✓
  • C) 全てのPodが正常に退避される
  • D) DaemonSetが自動的にスケールダウンする

解説:DaemonSetのPodは各ノードに1つずつ配置される設計です。drainで退避しようとするとエラーになります。--ignore-daemonsetsフラグでDaemonSetのPodを無視してdrainを続行します。

Q3:Kubernetes v1.29のクラスタをv1.31にアップグレードすることは可能ですか?

  • A) はい、kubeadm upgrade apply v1.31.0を直接実行できる
  • B) いいえ、まずv1.30にアップグレードしてからv1.31にする必要がある ✓
  • C) はい、--skip-versionフラグを使えば可能
  • D) いいえ、クラスタを再構築する必要がある

解説:Kubernetesのアップグレードは1マイナーバージョンずつ行う必要があります。v1.29 → v1.30 → v1.31の順序でアップグレードします。バージョンスキップは予期しない互換性問題を引き起こす可能性があります。