Kubernetes は複数のバージョンにわたるアップグレードをサポートしていません。したがって、1.18-1.19-1.20-1.21-1.22-1.23 への段階的なアップグレードが必要ですが、複数のバージョンにまたがる場合、アップグレードはさらに面倒になります。
I. 概要
1. バージョンアップ時の注意事項
- 以下では、アップグレード プロセス中に各ノードがいつ空になるかについて説明します。のマイナー バージョン アップグレードを実行している場合は
kubelet
、最初にアップグレードするノードをクリアする必要があります。CoreDNS Pods
コントロール プレーン ノードの場合、またはその他の非常に重要な負荷がそれら上で実行されている可能性があります。詳細については、「空のノード」を参照してください。 - アップグレード後、コンテナ仕様のハッシュが変更されたため、すべてのコンテナが再起動されます。
- アップグレード後に kubelet サービスが正常に再起動されたことを確認するには、サービス ログを実行
systemctl status kubelet
または表示します。journalctl -xeu kubelet
2. バージョン逸脱戦略
名前 | アピサーバー | キュベレット |
---|---|---|
アピサーバー | ±1 | |
キュベレット | -2 | |
kube-controller-manager、kube-scheduler | -1 | |
代理人になる | -2 | kubeletノードと同じ |
クベクトル | ±1 |
3. 現在のクラスタ環境
ザ・ホスト | システム | IP |
---|---|---|
loc-マスター35 | CentOS 7.6 | 10.10.1.35 |
場所ノード36 | CentOS 7.6 | 10.10.1.36 |
loc-node37 | CentOS 7.6 | 10.10.1.37 |
4. マクロのアップグレードプロセス
- メイン コントロール プレーン ノードをアップグレードする
- 他のコントロール プレーン ノードをアップグレードする
- ワーカーノードをアップグレードする
2. コントロール プレーン ノードをアップグレードする
1. アップグレードバージョンを確認する
# yum list --showduplicates kubeadm --disableexcludes=kubernetes
......
ubeadm.x86_64 1.17.16-0 kubernetes
kubeadm.x86_64 1.17.17-0 kubernetes
......
kubeadm.x86_64 1.18.20-0 kubernetes
kubeadm.x86_64 1.19.0-0 kubernetes
kubeadm.x86_64 1.19.1-0 kubernetes
kubeadm.x86_64 1.19.2-0 kubernetes
kubeadm.x86_64 1.19.3-0 kubernetes
kubeadm.x86_64 1.19.4-0 kubernetes
kubeadm.x86_64 1.19.5-0 kubernetes
kubeadm.x86_64 1.19.6-0 kubernetes
kubeadm.x86_64 1.19.7-0 kubernetes
kubeadm.x86_64 1.19.8-0 kubernetes
kubeadm.x86_64 1.19.9-0 kubernetes
kubeadm.x86_64 1.19.10-0 kubernetes
kubeadm.x86_64 1.19.11-0 kubernetes
kubeadm.x86_64 1.19.12-0 kubernetes
kubeadm.x86_64 1.19.13-0 kubernetes
kubeadm.x86_64 1.19.14-0 kubernetes
kubeadm.x86_64 1.19.15-0 kubernetes
......
kubeadm.x86_64 1.24.0-0 kubernetes
2. コントロール プレーン ノードをアップグレードする
まず最初のマスター コントロール ノードをアップグレードし、次に他のコントロール ノードをアップグレードし、最後に他のワーカー ノードをアップグレードします。
2.1 kubeadm のアップグレード
- アップグレード
kubeadm
# yum install kubeadm-1.19.12-0 --disableexcludes=kubernetes
- アップグレード計画の確認
# kubeadm upgrade plan # 检查集群是否可以升级
......
Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT CURRENT AVAILABLE
kubelet 3 x v1.18.0 v1.19.16
Upgrade to the latest stable version:
COMPONENT CURRENT AVAILABLE
kube-apiserver v1.18.0 v1.19.16
kube-controller-manager v1.18.0 v1.19.16
kube-scheduler v1.18.0 v1.19.16
kube-proxy v1.18.0 v1.19.16
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.16
Note: Before you can perform this upgrade, you have to update kubeadm to v1.19.16.
......
_____________________________________________________________________
- アップグレードするバージョンを選択してください
# kubeadm upgrade apply 1.19.12
......
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.19.12". Enjoy!
kubeadm upgrade
ノード上で管理されている証明書は自動的にkubeadm
更新されます。証明書の更新操作をスキップする必要がある場合は、フラグ --certificate-renewal=false を使用できます。
# kubeadm upgrade apply 1.19.12 --certificate-renewal=false
2.2 空のノード
kubectl drain
ノードをスケジュール不可としてマークし、すべての負荷を排除するコマンド
# kubectl drain loc-master35 --ignore-daemonsets
2.3 kubelet と kubectl のアップグレード
# yum install kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetes -y
# 重启 kubelet
# systemctl daemon-reload
# systemctl restart kubelet
2.4 ノードの保護を解除する
# kubectl uncordon loc-master35
node/loc-master35 uncordoned
3. 他のコントロール プレーンをアップグレードする
他にもあると仮定すると、これらもアップグレードするmaster
必要がありますmaster
# yum install kubeadm-1.19.12-0 kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetes
#
# kubeadm upgrade node # 这一点与主不一样
# kubectl drain loc-master-xx --ignore-daemonsets
# systemctl daemon-reload
# systemctl restart kubelet
# kubectl uncordon loc-master-xx
3. 稼働ノードをアップグレードする
1.kubeadmをアップグレードする
# yum install kubeadm-1.19.12-0 --disableexcludes=kubernetes
2、kubeadmのアップグレード
# kubeadm upgrade node
3. ノードを退避する
kubectl drain
ノードをスケジュール不可としてマークし、すべての負荷を排除するコマンド
# kubectl drain loc-node36 --ignore-daemonsets
4. kubelet と kubectl をアップグレードする
# yum install kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetes -y
# 重启 kubelet
# systemctl daemon-reload
# systemctl restart kubelet
5. ノードの保護を解除する
# kubectl uncordon loc-node36
node/loc-node36uncordoned
4. バージョンアップ後の検査
- ノードのステータスを表示する
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
loc-master35 Ready master 33d v1.19.12 10.10.1.35 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://18.6.3
loc-node36 Ready <none> 33d v1.19.12 10.10.1.36 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://18.6.3
loc-node37 Ready <none> 33d v1.19.12 10.10.1.37 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://18.6.3
- プラグインが正常か確認してください
# kubectl logs -f kube-controller-manager-loc-master35 -n kube-system
kubelet
ログ出力の表示
# journalctl -f -u kubelet
...
5.動作原理
1、kubeadmアップグレード適用
kubeadm upgrade apply は次のことを行います。
- クラスターがアップグレード可能な状態であるかどうかを確認します。
-
- APIサーバーにアクセスできる
-
- すべてのノードは準備完了状態です
-
- コントロールサーフェスは健全です
- バージョンドリフトポリシーを適用します。
- コントロール プレーンのイメージが利用可能であるか、サーバーにプルされていることを確認してください。
- コンポーネント構成でバージョンのアップグレードが必要な場合は、代替構成を生成するか、ユーザー指定の上書きバージョン構成を使用します。
- コントロール プレーン コンポーネントをアップグレードするか、いずれかのコンポーネントが起動に失敗した場合はロールバックします。
- 新しい CoreDNS および kube-proxy マニフェストを適用し、必要なすべての RBAC ルールを強制的に作成します。
- 古いファイルの有効期限が 180 日後に切れた場合、API サーバーの新しい証明書とキー ファイルが作成され、古いファイルがバックアップされます。
2、kubeadmアップグレードノード
kubeadm upgrade node
他のコントロール フラット ノードで次の操作を実行します。
- クラスターから kubeadm ClusterConfiguration を取得します。
- (オプション) kube-apiserver 証明書をバックアップします。
- コントロール プレーン コンポーネントの静的ポッド マニフェストをアップグレードします。
- このノードの kubelet 構成をアップグレードします
kubeadm upgrade node
ワーカー ノードで次のタスクを完了します。
- クラスターから kubeadm ClusterConfiguration を取得します。
- このノードの kubelet 構成をアップグレードします。
参照:
https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
https://kubernetes.io/releases/version-skew-policy/