はじめに
こんにちは、cyokozai (X: @cyokozai0427) です。
千葉にある工業大学に通っています。
3-shake という会社で現在インターンシップに参加しています。
最近はCloudNative Daysの運営に携わっています。
今回は Funabashi.dev で発表した、サークルで運用している Kubernetes クラスタのアップグレードに関する内容をブログにまとめ直しました。
目次
ここにもくじ
サークル紹介
ネットワークコンテンツ研究会
ネッコ研は、デジタルコンテンツやシステムを製作する創作×技術系サークルです。
現在、以下のチームが活動中!
- Miku's Origin
ボカロオタク達がアツいライブを製作するチーム、Miku's Originです! - Nekko Cloud
おもしろ実験プライベートクラウド「Nekko Cloud」を開発するチームです!
写真は今年開催された第76回津田沼祭で行われたボーカロイドによるファンメイドライブの様子です。
新メンバー募集中!
入会希望の方は以下の連絡先からご連絡ください🙇♂️
Nekko Cloud
Nekko Cloudとは、現在ネットワークコンテンツ研究会で活動しているチームのひとつで、学生の自宅サーバをVPNで繋げてプライベートクラウドを構築・開発・運用するプロジェクトです。
現在は幕張、津田沼、浦和の3リージョンで構成されています。
人柱リージョン参加者募集中です!
詳しくはこちらのスライドにまとまっているので、気になった方はぜひご覧ください!
サークルの Kubernetes が古くてヤバい!
NCチームでは現在、KubernetesクラスタNekko Cloud Kubernetes Engine (NKE)をベータ版として運用しています。
ちょうど学祭用のWebサイトをデプロイする関係で、久しぶりにKubernetesクラスタの状態を確認しました。
~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm-01 Ready control-plane 386d v1.30.4
vm-02 Ready control-plane 386d v1.30.4
vm-03 Ready control-plane 386d v1.30.4
「v1.30 ?!?!!」
Kubernetesのバージョンアップはマイナーバージョンが約4か月に1回の頻度でリリースされます。
執筆時点で最新の安定版バージョンは 1.34.2 。
そうです、去年の秋ごろに構築したクラスタは、誰もメンテナンスをせず、1年間放置という名の運用をしていたのです。
当然 1.30.4 は既に EOL しています。
したがって Kubernetes のアップグレードは急務です。
Kubernetes 自動構築ツール
その前に、Kubernetes クラスタの運用に使用しているツール Kubespray について紹介します。
Kubespray
Kubespray は、Ansible を用いて Kubernetes クラスタを自動構築・管理するためのツールです。
既存のサーバへ SSH で接続し、OS 設定、コンテナランタイム、ネットワーク、CNI、証明書、アドオンなどの環境構築を Ansible Playbook に基づいて自動化します。
内部では kubeadm を使用してクラスタ初期化を行い、構成内容は inventory と変数ファイルで柔軟にカスタマイズ可能です。
Kubesprayを用いた構築方法の詳細は以下のブログで紹介しております。
Kubernetes クラスタのアップグレード
今回は Kubespray の最新リリースが対応している Kubernetes バージョン 1.33.5 までアップグレードすることを目標とします。
Kubernetes バージョンアップグレードは Step by Step で実施
- Kubernetes は コントロールプレーンと kubelet(ノード)のバージョン差が ±1 のみ許可されている
- 2 つ以上飛び越えると、API サーバ/kubelet が動かなくなる可能性があるため、1 minor version ずつ順番に上げる必要がある
- API の非推奨 → 廃止対応を段階ごとに行う必要がある
- リリースごとに Deprecated (非推奨) → Removed (削除) が行われる
- 1 つずつ上げることで、各ステップで非推奨 API を検出し、安全に移行できる
- 一気に上げると「全体が壊れたときの原因究明」が非常に難しくなる
Kubesprayを使用したクラスタのアップグレード手順を以下にまとめます。
- 各ノードを1つずつバックアップを取る
- Kubespray の設定ファイルが保存されているディレクトリで DevContainer を起動 (入っていない場合は Python3 pip をインストール)
-
upgrade-cluster.yamlの Kubernetes バージョン情報を書き換える - Ansible Playbook を実行
- 発行された
admin.confをKUBECONFIGに設定
現在稼働している Kubernetes (NKE) と作業環境は以下の構成です。
Kubernetes (NKE)
- Proxmox VE
- Nodes
- vm-01 (Ubuntu22.04)
- vm-02 (Ubuntu22.04)
- vm-03 (Ubuntu22.04)
- Nodes
ローカル
- Macbook Air M3 (arm)
- DevContainer (Ubuntu24.04)
各ノードを1つずつバックアップを取る
バックアップでは以下の作業手順で行います。
クラスタが崩壊するのを防ぐため、バックアップ作業は必ず1ノードずつ行いましょう。
- cordon/drain
- etcd スナップショット→ダウンロード
- 電源OFF
- スナップショット
- 電源ON
- uncordon
では、手順通りに作業を行います。
-
まずは、各ノードに SSH できることを確認する
-
各ノードが無事に動作していることを確認する
sudo ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/ssl/etcd/ssl/ca.pem \ --cert=/etc/ssl/etcd/ssl/node-$(hostname).pem \ --key=/etc/ssl/etcd/ssl/node-$(hostname)-key.pem \ endpoint health --write-out=table -
問題ないのでバックアップを開始する
# vm-01 +------------------------+--------+-------------+-------+ | ENDPOINT | HEALTH | TOOK | ERROR | +------------------------+--------+-------------+-------+ | https://127.0.0.1:2379 | true | 32.384996ms | | +------------------------+--------+-------------+-------+ # vm-02 +------------------------+--------+-------------+-------+ | ENDPOINT | HEALTH | TOOK | ERROR | +------------------------+--------+-------------+-------+ | https://127.0.0.1:2379 | true | 13.916231ms | | +------------------------+--------+-------------+-------+ # vm-03 +------------------------+--------+-------------+-------+ | ENDPOINT | HEALTH | TOOK | ERROR | +------------------------+--------+-------------+-------+ | https://127.0.0.1:2379 | true | 12.934121ms | | +------------------------+--------+-------------+-------+ -
再度 vm-01 に SSH し、cordon/drain を実行する
kubectl cordon vm-01 kubectl drain vm-01 --force --ignore-daemonsets --delete-emptydir-data -
etcdのスナップショットを作成してローカルに保存する
sudo ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/ssl/etcd/ssl/ca.pem \ --cert=/etc/ssl/etcd/ssl/node-$(hostname).pem \ --key=/etc/ssl/etcd/ssl/node-$(hostname)-key.pem \ snapshot save /root/etcd-snapshot-$(hostname)-$(date +%F).db -
ノードをシャットダウンして、Proxmox VE 側でスナップショットを作成する
-
ノードを再起動し、uncordon を実行する
kubectl uncordon vm-01
同様の操作を 全てのノード で行ってください。
Kubespray の設定ファイルが保存されているディレクトリで DevContainer を起動 (入っていない場合は Python3 pip をインストール)
ここからは、Kubespray の構成ファイルなどを直接操作していきます。
作業ディレクトリは以下のとおりです。
.
└── kubespray <- Kubespray repo
└── inventory
└── nke-cluster <- NKE 設定ディレクトリ
├── artifacts
├── credentials
├── group_vars
│ ├── all
│ └── k8s_cluster
└── patches
-
kubespray/ディレクトリへ移動し、更新する Kubernetes バージョンに対応した Kubespray のリリースバージョンに変更する
現在のリリースバージョンは以下の表のとおりです。Kubernetes Version Kubespray Release 1.33.5 2.29.0 1.32.5 2.28.0 1.31.4 2.27.0 まずは 1.30 から 1.31 へアップグレードするので、
remotes/origin/release-2.27へ変更します。~$ cd kubespray ~/kubespray$ git branch -a ~/kubespray$ git switch remotes/origin/release-2.27 --detach
upgrade-cluster.yaml の Kubernetes バージョン情報を書き換える
-
kubespray/inventory/nke-cluster/group_vars/k8s_cluster/k8s-cluster.ymlのkube_version:を変更する## Change this to use another Kubernetes version, e.g. a current beta release kube_version: v1.30.4 ↓ +1 ずつマイナーバージョンを上げる kube_version: v1.31.4kubespray/inventory/には Kubespray が構築するインフラの構成ファイルinventory.iniや Kubernetes の各種マニフェストなどの重要なファイルが保存されます
Ansible Playbook を実行
-
Ansible Playbook で dry-run を実行し、問題がないか確認を行う
ansible-playbook \ -i inventory/nke-cluster/inventory.ini \ --private-key ../k8s-test \ --become \ --become-user=root \ --check \ upgrade-cluster.yml -
問題なく完了したら、更新を行う
ansible-playbook \ -i inventory/nke-cluster/inventory.ini \ --private-key ../k8s-test \ --become \ --become-user=root \ upgrade-cluster.ymlエラーが発生せず
inventory/nke-cluster/artifactsに有効なadmin.confが生成されていれば成功 (実行時間は大体 40 分前後)-
出力
PLAY RECAP *************************************************************************************************************************************** vm-01 : ok=937 changed=78 unreachable=0 failed=0 skipped=1587 rescued=0 ignored=1 vm-02 : ok=849 changed=67 unreachable=0 failed=0 skipped=1356 rescued=0 ignored=2 vm-03 : ok=851 changed=67 unreachable=0 failed=0 skipped=1354 rescued=0 ignored=2
-
発行された admin.conf を KUBECONFIG に設定
-
発行された
kubespray/inventory/nke-cluster/artifacts/admin.confをKUBECONFIGに設定し、kubectlが問題なく実行されることを確認する~$ export KUBECONFIG="~/.kube/admin.conf" ~$ kubectl get nodes NAME STATUS ROLES AGE VERSION vm-01 Ready control-plane 386d v1.31.4 vm-02 Ready control-plane 386d v1.31.4 vm-03 Ready control-plane 386d v1.31.4
終わりに
以上が Kubespray を用いた Kubernetes アップグレードの一通りの手順となります。
皆さんのお家の Kubernetes は EOL していませんか?
相手にして貰えないと Kubernetes がかわいそうなので、年末年始の時間がある時にぜひやってあげてください。
ちなみに私はこのブログを書き終えた後、この作業をもう2回行う必要がありますね、とほほ....😭
参考資料・引用元





