(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】ノードのkubeadm/kubelet/kubectlをUpgradeする

スポンサーリンク

はじめに

kubeadmで用意したノードのkubeadm/kubelet/kubectlをaptでアップグレードした際のメモです。

環境情報
  • kubectl v1.17.0
  • kubeadm v1.17.0
  • kubelet v1.17.0

kubeadmのバージョンアップ

バージョンアップ前にdrainコマンドでPodがスケジュールされない状態にします。

$ kubectl drain master -v=6
5438 loader.go:375] Config loaded from file:  ~.kube/config
5438 round_trippers.go:443] GET https://172.17.0.5:6443/api/v1/nodes/master 200 OK in 13milliseconds
5438 round_trippers.go:443] PATCH https://172.17.0.5:6443/api/v1/nodes/master 200 OK in 5 milliseconds
node/master01 cordoned
5438 round_trippers.go:443] GET https://172.17.0.5:6443/api/v1/pods?fieldSelector=spec.nodeName%3Dmaster 200 OK in 10 milliseconds
5438 round_trippers.go:443] GET https://172.17.0.5:6443/apis/apps/v1/namespaces/kube-system/daemonsets/kube-proxy 200 OK in 2 milliseconds
5438 round_trippers.go:443] GET https://172.17.0.5:6443/apis/apps/v1/namespaces/kube-system/daemonsets/weave-net 200 OK in 3 milliseconds
node/master drained

以下でkubeadmの新バージョンをインストールします。

$ apt install kubeadm=1.18.0-00

インストールするとコマンド上ではバージョンが変わっていますが

$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", 

まだ実際のバージョンには反映されていません。

$ kubectl get pod -n kube-system kube-apiserver-master -o=yaml
apiVersion: v1
...
    image: k8s.gcr.io/kube-apiserver:v1.17.0
...

以下コマンドでapplyして初めてバージョンとして反映されます。

$ kubeadm upgrade apply v1.18.0
[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 -oyaml'
[preflight] Running pre-flight checks.
[upgrade] Running cluster health checks
[upgrade/version] You have chosen to change the cluster version to "v1.18.0"
[upgrade/versions] Cluster version: v1.17.0
...
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.18.0". Enjoy ..

確かにイメージも最新バージョンになっています。

$ kubectl get pod -n kube-system kube-apiserver-master -o=yaml
...
    image: k8s.gcr.io/kube-apiserver:v1.18.0
...

ちなみにaptで新バージョンを落とす前にapplyすると以下エラーとなります。

$  kubeadm upgrade apply v1.18.0
...
[upgrade/version] FATAL: the --version argument is invalid due to these fatal errors:
        - Specified version to upgrade to "v1.18.0" is at least one minor release higher than the kubeadm minor release (18 > 17). Such an upgrade is not supported
Please fix the misalignments highlighted above and try upgrading again
To see the stack trace of this error execute with --v=5 or higher

kubelet/kubectlのバージョンアップ

kubeadmを最新化してもkubectl get nodeで表示されるバージョンは変化していません。

$ kubectl get node
NAME     STATUS   ROLES    AGE     VERSION
master01   Ready,SchedulingDisabled     master   x   v1.17.0

ここはkubeletの新バージョンをインストールして初めて変化します。

$ apt install kubelet=1.18.0-00
...
Unpacking kubelet (1.18.0-00) over (1.17.0-00) ...
Setting up kubelet (1.18.0-00) ...
$ kubectl get node
NAME     STATUS   ROLES    AGE     VERSION
master01   Ready,SchedulingDisabled     master   x   v1.18.0

kubectlも同じように新バージョンをインストールすれば

$ apt install kubectl=1.18.0-00
...
Preparing to unpack .../kubectl_1.18.0-00_amd64.deb ...
Unpacking kubectl (1.18.0-00) over (1.17.0-00) ...
Setting up kubectl (1.18.0-00) ...

即時反映されます。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"xx...

終わりに

kubeadmのみは実際にインストールしたのちにkubeadm upgrade applyが必要である点は覚えておきたいです。また、kubeadm upgrade planを利用すればその時点でapplyできるバージョンが確認できます。

以上、ご参考になれば幸いです。