1. バージョンスキューポリシー
| コンポーネント | 許容バージョン差 |
|---|---|
| kube-apiserver | 基準バージョン (例: 1.30) |
| controller-manager, scheduler | apiserver ± 1 (例: 1.29–1.30) |
| kubelet | apiserver -2 〜 apiserver (例: 1.28–1.30) |
| kubectl | apiserver ± 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 NODE | cordon + 既存Podの退避(eviction) |
kubectl uncordon NODE | スケジュール可能に戻す |
5. チートシート
| タスク | コマンド |
|---|---|
| アップグレード計画確認 | kubeadm upgrade plan |
| コントロールプレーン適用 | kubeadm upgrade apply v1.30.0 |
| ワーカーノード設定更新 | kubeadm upgrade node |
| ノードのdrain | kubectl drain NODE --ignore-daemonsets |
| ノードのuncordon | kubectl 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の順序でアップグレードします。バージョンスキップは予期しない互換性問題を引き起こす可能性があります。