Kubernetes をアップグレードしてみた

Kubernetes をアップグレードしてみた

今回は Kubernetes クラスターをアップデートする手順をまとめてみます。運用環境ではないためスムーズに進められましたが、サービス運用している Pod などが稼働している場合は、アプリケーション観点でも更新の計画を立てる必要があります。

あくまでも Kubernetes クラスターの主要機能をアップグレードする手順を紹介します。公式ドキュメントとしては次のページを参考にしています。

Upgrading kubeadm clusters | Kubernetes

Kubernetes アップグレード概要

前提として、Kubernetes のバージョンは X.Y.Z のような表記となっており、X がメジャー バージョン、Y がマイナー バージョン、Z がパッチ バージョンを示しています。各バージョンの追加機能に関してはリリース ノートから確認できます。
community/versioning.md at master · kubernetes/community (github.com)

Kubernetes のバージョンをアップグレードする際は、マイナー バージョンを一つずつ上げていく必要があります。簡単に言えば、1.n バージョンの時は 1.n+1 バージョンにアップグレード可能で、1.n から 1.n+2 にはアップグレードできないということです。もしくは同一マイナー バージョンでパッチ バージョンがより大きいものにアップグレードできます。

今回は 1.18.2 から 1.22.2 まで一気にアップグレードをしたので、その手順を共通化してまとめています。なお、その際のアップグレード パスは次の通りでした。各ノードは Ubuntu を利用しています。

1.18.2 → 1.19.15 → 1.20.11→ 1.21.5 → 1.22.2

Kubernetes アップグレード手順

Kubernetes のアップグレードは大まかに次の流れとなります。

  1. プライマリのマスター ノードをアップグレード
  2. セカンダリのマスター ノードをアップグレード
  3. ワーカー ノードをアップグレード

マスター ノード アップグレード

kubeadm のアップグレード

まず、アップグレード可能なバージョンを確認します。次のコマンドでリポジトリから取得可能なバージョンの一覧を表示します。

apt update
apt-cache madison kubeadm

一覧からアップグレードしたいマイナーバージョンの最新バージョンを確認します。表示結果は一部省略しています。

$ apt-cache madison kubeadm
   kubeadm |  1.22.2-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
   kubeadm |  1.21.5-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
   kubeadm | 1.20.11-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
   kubeadm | 1.19.15-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
   kubeadm | 1.18.20-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages

次のコマンドでアップグレードするバージョンをインストールします。バージョンは先ほどのコマンドで確認したアップグレード先のマイナーバージョンのうち、最新のパッチバージョンを指定します。

apt-mark unhold kubeadm && \
> apt-get update && apt-get install -y kubeadm=1.YY.ZZ-00 && \
> apt-mark hold kubeadm

インストールが完了したらアップグレードの検証を行います。次のコマンドを実行して、表示結果にアップグレードコマンドが表示されていれば問題ありません。

kubeadm upgrade plan
Upgrade to the latest stable version:

COMPONENT                 CURRENT   AVAILABLE
kube-apiserver            v1.18.2   v1.19.15
kube-controller-manager   v1.18.2   v1.19.15
kube-scheduler            v1.18.2   v1.19.15
kube-proxy                v1.18.2   v1.19.15
CoreDNS                   1.6.7     1.7.0
etcd                      3.4.3-0   3.4.13-0

You can now apply the upgrade by executing the following command:

	kubeadm upgrade apply v1.19.15

コントロール プレーンのうち 1 台にて、表示されたコマンドで kubeadm のアップグレードを実行します。

kubeadm upgrade apply v1.YY.ZZ

表示結果で ‘[upgrade/successful]’ が表示されていればアップグレードは成功です。

[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.19.15". Enjoy!

[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.

他のコントロール プレーンがある場合は、`kubeadm upgrade apply` の代わりに次のコマンドで kubeadm のアップグレードを実行します。

kubeadm upgrade node

kubelet / kubectl のアップグレード

実行中の Pod がある場合は、アップグレードを実行する前にノードから退避させておきます。

kubectl drain <node 名> --ignore-daemonsets

次のコマンドを実行して kubelet と kubectl のアップグレードするバージョンをインストールをします。

apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.YY.ZZ-00 kubectl=1.YY.ZZ-00 && \
apt-mark hold kubelet kubectl

インストールが完了したら次のコマンドで kubelet を再起動します。

sudo systemctl daemon-reload
sudo systemctl restart kubelet

アップグレードが完了したら、Pod がスケジューリングされるようにします。

kubectl uncordon <node 名>

ワーカー ノード アップグレード

kubeadm のアップグレード

次のコマンドでアップグレードするバージョンをインストールします。バージョンはコントロール プレーンで確認したアップグレード先のマイナーバージョン、最新のパッチバージョンを指定します。

apt-mark unhold kubeadm && \
> apt-get update && apt-get install -y kubeadm=1.YY.ZZ-00 && \
> apt-mark hold kubeadm

次のコマンドで kubeadm のアップグレードを実行します。

kubeadm upgrade node

kubelet / kubectl のアップグレード

実行中の Pod がある場合は、アップグレードを実行する前にノードから退避させておきます。

kubectl drain <node 名> --ignore-daemonsets

次のコマンドを実行して kubelet と kubectl のアップグレードするバージョンをインストールをします。

apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet=1.YY.ZZ-00 kubectl=1.YY.ZZ-00 && \
apt-mark hold kubelet kubectl

インストールが完了したら次のコマンドで kubelet を再起動します。

sudo systemctl daemon-reload
sudo systemctl restart kubelet

アップグレードが完了したら、Pod がスケジューリングされるようにします。

kubectl uncordon <node 名>

アップグレード確認

ノードのバージョンがアップグレードされ、状態が Ready となっていれば問題ありません。

$ kubectl get nodes
NAME            STATUS   ROLES                  AGE   VERSION
k8s-master-01   Ready    control-plane,master   59d   v1.22.2
k8s-worker-01   Ready    <none>                 59d   v1.22.2
k8s-worker-02   Ready    <none>                 59d   v1.22.2