2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

年末なので Kubernetes クラスタをアップグレードしよう

Posted at

はじめに

こんにちは、cyokozai (X: @cyokozai0427) です。 
千葉にある工業大学に通っています。
3-shake という会社で現在インターンシップに参加しています。
最近はCloudNative Daysの運営に携わっています。

今回は Funabashi.dev で発表した、サークルで運用している Kubernetes クラスタのアップグレードに関する内容をブログにまとめ直しました。

目次

ここにもくじ

サークル紹介

ネットワークコンテンツ研究会

logo

ネッコ研は、デジタルコンテンツやシステムを製作する創作×技術系サークルです。
現在、以下のチームが活動中!

  • Miku's Origin
    ボカロオタク達がアツいライブを製作するチーム、Miku's Originです!
  • Nekko Cloud
    おもしろ実験プライベートクラウド「Nekko Cloud」を開発するチームです!

写真は今年開催された第76回津田沼祭で行われたボーカロイドによるファンメイドライブの様子です。

numasai2025

新メンバー募集中!
入会希望の方は以下の連絡先からご連絡ください🙇‍♂️

Nekko Cloud

nekko_cloud

Nekko Cloudとは、現在ネットワークコンテンツ研究会で活動しているチームのひとつで、学生の自宅サーバをVPNで繋げてプライベートクラウドを構築・開発・運用するプロジェクトです。

image.png

現在は幕張、津田沼、浦和の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年間放置という名の運用をしていたのです。

image.png

当然 1.30.4 は既に EOL しています。
したがって Kubernetes のアップグレードは急務です。

Kubernetes 自動構築ツール

その前に、Kubernetes クラスタの運用に使用しているツール Kubespray について紹介します。

Kubespray

Kubespray は、Ansible を用いて Kubernetes クラスタを自動構築・管理するためのツールです。
既存のサーバへ SSH で接続し、OS 設定、コンテナランタイム、ネットワーク、CNI、証明書、アドオンなどの環境構築を Ansible Playbook に基づいて自動化します。
内部では kubeadm を使用してクラスタ初期化を行い、構成内容は inventory と変数ファイルで柔軟にカスタマイズ可能です。

image.png

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 を検出し、安全に移行できる
  • 一気に上げると「全体が壊れたときの原因究明」が非常に難しくなる

image.png

Kubesprayを使用したクラスタのアップグレード手順を以下にまとめます。

  1. 各ノードを1つずつバックアップを取る
  2. Kubespray の設定ファイルが保存されているディレクトリで DevContainer を起動 (入っていない場合は Python3 pip をインストール)
  3. upgrade-cluster.yaml の Kubernetes バージョン情報を書き換える
  4. Ansible Playbook を実行
  5. 発行された admin.confKUBECONFIG に設定

現在稼働している Kubernetes (NKE) と作業環境は以下の構成です。

Kubernetes (NKE)

  • Proxmox VE
    • Nodes
      • vm-01 (Ubuntu22.04)
      • vm-02 (Ubuntu22.04)
      • vm-03 (Ubuntu22.04)

ローカル

  • Macbook Air M3 (arm)
    • DevContainer (Ubuntu24.04)

nke_kubespray.png

各ノードを1つずつバックアップを取る

バックアップでは以下の作業手順で行います。
クラスタが崩壊するのを防ぐため、バックアップ作業は必ず1ノードずつ行いましょう。

  1. cordon/drain
  2. etcd スナップショット→ダウンロード
  3. 電源OFF
  4. スナップショット
  5. 電源ON
  6. uncordon

では、手順通りに作業を行います。

  1. まずは、各ノードに SSH できることを確認する

  2. 各ノードが無事に動作していることを確認する

    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
    
  3. 問題ないのでバックアップを開始する

    # 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 |       |
    +------------------------+--------+-------------+-------+
    
  4. 再度 vm-01 に SSH し、cordon/drain を実行する

    kubectl cordon vm-01
    kubectl drain vm-01 --force --ignore-daemonsets --delete-emptydir-data
    
  5. 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
    
  6. ノードをシャットダウンして、Proxmox VE 側でスナップショットを作成する

  7. ノードを再起動し、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
  1. 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 バージョン情報を書き換える

  1. kubespray/inventory/nke-cluster/group_vars/k8s_cluster/k8s-cluster.ymlkube_version: を変更する

    ## Change this to use another Kubernetes version, e.g. a current beta release
    kube_version: v1.30.4
    ↓ +1 ずつマイナーバージョンを上げる
    kube_version: v1.31.4
    

    kubespray/inventory/ には Kubespray が構築するインフラの構成ファイル inventory.ini や Kubernetes の各種マニフェストなどの重要なファイルが保存されます

Ansible Playbook を実行

  1. Ansible Playbook で dry-run を実行し、問題がないか確認を行う

    ansible-playbook \
        -i inventory/nke-cluster/inventory.ini \
        --private-key ../k8s-test \
        --become \
        --become-user=root \
        --check \
        upgrade-cluster.yml
    
  2. 問題なく完了したら、更新を行う

    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.confKUBECONFIG に設定

  1. 発行された kubespray/inventory/nke-cluster/artifacts/admin.confKUBECONFIG に設定し、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回行う必要がありますね、とほほ....😭

参考資料・引用元

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?