2023年7月8日土曜日

Kubernetesバージョンアップ手順

Kubernetesはバージョンアップ頻度が高く、おおよそ4か月に1回のペースで新しいマイナーバージョンがリリースされている。

バージョン リリース日
1.27 2023-04-11
1.26 2022-12-09
1.25 2022-08-23

サポートが有効なバージョンは最新の3世代となることから、結果として12ヶ月に1回はバージョンアップし、サポートされる状態を維持する必要がある。

Kubernetesのバージョンアップは決められた手順に従い実施すればそこまで難しいものではない。本記事では、Kubernetesのバージョンアップ手順を記載する。

環境

以下に各種ソフトウェアのバージョンを記載する。今回はバージョン1.27のパッチバージョンのバージョンアップとなるが、おそらくマイナーバージョン(例えば、1.27 -> 1.28)などでも同様の手順で実施できると想定している。

  • ホストOS : AlmaLinux 8.6
  • Kubernetes:
    • バージョンアップ前 : v1.27.1
    • バージョンアップ後 : v1.27.3

クラスターは3台で構成し、すべてコントロールプレーンのノードとなる。冗長化されたコントロールプレーンのKubernetesクラスターの構築手順は以下記事を参照いただきたい。

以下に、本記事で用いるKubernetes環境の構成概要図と、バージョンアップ手順の概要を記載する。

Kubernetesバージョンアップ手順

1. kubeadmバージョンアップ

バージョンアップ前のバージョン確認をしておく。kubeadmやノードのバージョンは、v1.27.1となっていることがわかる。

# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"27", GitVersion:"v1.27.1", GitCommit:"4c9411232e10168d7b050c49a1b59f6df9d7ea4b", GitTreeState:"clean", BuildDate:"2023-04-14T13:20:04Z", GoVersion:"go1.20.3", Compiler:"gc", Platform:"linux/amd64"}

# kubectl get node
NAME        STATUS   ROLES           AGE   VERSION
t3051kube   Ready    control-plane   25d   v1.27.1
t3052kube   Ready    control-plane   25d   v1.27.1
t3053kube   Ready    control-plane   25d   v1.27.1

kubeadmdnfコマンドでバージョンを指定することで、特定のバージョンへバージョンアップすることができる。

# dnf install kubeadm-1.27.3-0 --disableexcludes=kubernetes -y
メタデータの期限切れの最終確認: 0:01:42 時間前の 2023年06月18日 07時33分08秒 に実施しました。
依存関係が解決しました。
====================================================================================================================================================
 パッケージ                        アーキテクチャー                 バージョン                           リポジトリー                         サイズ
====================================================================================================================================================
アップグレード:
 kubeadm                           x86_64                           1.27.3-0                             kubernetes                            11 M

トランザクションの概要
====================================================================================================================================================
アップグレード  1 パッケージ

ダウンロードサイズの合計: 11 M

~(以下略)~

バージョンアップ後、kubeadmがバージョンアップされていることを確認しよう。今回であれば、v1.27.1 -> v1.27.3になっていることが確認できる。

# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"27", GitVersion:"v1.27.3", GitCommit:"25b4e43193bcda6c7328a6d147b1fb73a33f1598", GitTreeState:"clean", BuildDate:"2023-06-14T09:52:26Z", GoVersion:"go1.20.5", Compiler:"gc", Platform:"linux/amd64"}

2. アップグレードプランの確認

アップグレードプランを確認する。ここで、現在のKubernetesクラスターの状態が確認され、最終的にバージョンアップに必要なコマンドが表示される。

# kubeadm upgrade plan
[upgrade/config] Making sure the configuration is correct:
[upgrade/config] Reading configuration from the cluster...
[upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[preflight] Running pre-flight checks.
[upgrade] Running cluster health checks
[upgrade] Fetching available versions to upgrade to
[upgrade/versions] Cluster version: v1.27.2
[upgrade/versions] kubeadm version: v1.27.3
[upgrade/versions] Target version: v1.27.3
[upgrade/versions] Latest version in the v1.27 series: v1.27.3

Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT   CURRENT       TARGET
kubelet     3 x v1.27.1   v1.27.3

Upgrade to the latest version in the v1.27 series:

COMPONENT                 CURRENT   TARGET
kube-apiserver            v1.27.2   v1.27.3
kube-controller-manager   v1.27.2   v1.27.3
kube-scheduler            v1.27.2   v1.27.3
kube-proxy                v1.27.2   v1.27.3
CoreDNS                   v1.10.1   v1.10.1
etcd                      3.5.7-0   3.5.7-0

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

        kubeadm upgrade apply v1.27.3

_____________________________________________________________________


The table below shows the current state of component configs as understood by this version of kubeadm.
Configs that have a "yes" mark in the "MANUAL UPGRADE REQUIRED" column require manual config upgrade or
resetting to kubeadm defaults before a successful upgrade can be performed. The version to manually
upgrade to is denoted in the "PREFERRED VERSION" column.

API GROUP                 CURRENT VERSION   PREFERRED VERSION   MANUAL UPGRADE REQUIRED
kubeproxy.config.k8s.io   v1alpha1          v1alpha1            no
kubelet.config.k8s.io     v1beta1           v1beta1             no
_____________________________________________________________________

3. Kubernetesクラスターのバージョンアップ (1台目)

アップグレードプランの確認で出力されたkubeadm upgrade apply [ターゲットバージョン]コマンドを用いてKubernetesクラスターのバージョンアップを行う。この作業はコントロールプレーンの1台で実行する。

# kubeadm upgrade apply v1.27.3
[upgrade/config] Making sure the configuration is correct:
[upgrade/config] Reading configuration from the cluster...

~(中略)~

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

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

4. Kubernetesクラスターのバージョンアップ (2台目以降)

コントロールプレーンが冗長化されている場合は、2台目以降のすべてのコントロールプレーンのノードにて、kubeadm upgrade nodeコマンドを実行する。

# kubeadm upgrade node
[upgrade] Reading configuration from the cluster...
[upgrade] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
W0618 07:46:01.123220 3723323 images.go:80] could not find officially supported version of etcd for Kubernetes v1.27.3, falling back to the nearest etcd version (3.5.7-0)
W0618 07:46:27.546881 3723323 checks.go:835] detected that the sandbox image "registry.k8s.io/pause:3.6" of the container runtime is inconsistent with that used by kubeadm. It is recommended that using "registry.k8s.io/pause:3.9" as the CRI sandbox image.
[upgrade] Upgrading your Static Pod-hosted control plane instance to version "v1.27.3"...

~(中略)~

[upgrade] The configuration for this node was successfully updated!
[upgrade] Now you should go ahead and upgrade the kubelet package using your package manager.

5. drain実行 (Podの退避・Podの配置の禁止)

Kubernetesクラスターのバージョンアップが完了したら、各ノードのkubelet及びkubectlのバージョンアップを行う。

一時的にkubeletの再起動が発生することから、バージョンアップ対象ノードからPodを退避(drain)したのち、Podの配置を禁止(cordon)する。

# kubectl drain t3051kube --ignore-daemonsets
node/t3051kube cordoned
Warning: ignoring DaemonSet-managed Pods: kube-flannel/kube-flannel-ds-x9mzn, kube-system/kube-proxy-6q4qn

~(中略)~

node/t3051kube drained

drainされると、ノードのステータスがSchedulingDisabledとなる。

# kubectl get node
NAME        STATUS                     ROLES           AGE   VERSION
t3051kube   Ready,SchedulingDisabled   control-plane   25d   v1.27.1
t3052kube   Ready                      control-plane   25d   v1.27.1
t3053kube   Ready                      control-plane   25d   v1.27.1

6. kubelet及びkubectlのバージョンアップ

kubelet及びkubectldnfコマンドでバージョンを指定することで、特定のバージョンへバージョンアップすることができる。

# dnf install kubelet-1.27.3-0 kubectl-1.27.3-0 --disableexcludes=kubernetes -y
メタデータの期限切れの最終確認: 0:28:16 時間前の 2023年06月18日 07時33分08秒 に実施しました。
依存関係が解決しました。
====================================================================================================================================================
 パッケージ                        アーキテクチャー                 バージョン                           リポジトリー                         サイズ
====================================================================================================================================================
アップグレード:
 kubectl                           x86_64                           1.27.3-0                             kubernetes                            11 M
 kubelet                           x86_64                           1.27.3-0                             kubernetes                            20 M

トランザクションの概要
====================================================================================================================================================
アップグレード  2 パッケージ

ダウンロードサイズの合計: 31 M

~(以下略)~

7. kubelet再起動

kubeletのバージョンアップ後、再起動を行う。

# systemctl daemon-reload
# systemctl restart kubelet

ノードの状態を確認すると、バージョンがv1.27.1 -> v1.27.3となっていることがわかる。

# kubectl get node
NAME        STATUS                     ROLES           AGE   VERSION
t3051kube   Ready,SchedulingDisabled   control-plane   25d   v1.27.3
t3052kube   Ready                      control-plane   25d   v1.27.1
t3053kube   Ready                      control-plane   25d   v1.27.1

8. uncordon実行

バージョンアップが完了したので、対象ノードのcordon状態を解消するため、uncordonを実行する。

# kubectl uncordon t3051kube

最終的にノードがバージョンアップされた状態でReadyとなった。

# kubectl get node
NAME        STATUS   ROLES           AGE   VERSION
t3051kube   Ready    control-plane   25d   v1.27.3
t3052kube   Ready    control-plane   25d   v1.27.1
t3053kube   Ready    control-plane   25d   v1.27.1

9. 手順5~8を残りのノードに対して繰り返す

残りのノードに対してもdrain、kubeletバージョンアップ、uncordonを繰り返しながらローリングアップデートを実行する。

以下は2台目の実行例となる。

# kubectl drain t3052kube --ignore-daemonsets
node/t3051kube cordoned

# dnf install kubelet-1.27.3-0 kubectl-1.27.3-0 --disableexcludes=kubernetes -y
# systemctl daemon-reload
# systemctl restart kubelet

# kubectl uncordon t3052kube

# kubectl get node
NAME        STATUS     ROLES           AGE   VERSION
t3051kube   Ready      control-plane   25d   v1.27.3
t3052kube   NotReady   control-plane   25d   v1.27.3
t3053kube   Ready      control-plane   25d   v1.27.1

以上で、Kubernetesのバージョンアップ手順は完了となる。

参考

0 件のコメント:

コメントを投稿

人気の投稿