最近PCを光らせることにハマっている村田でーす。
k8sのワーカーノードのkernelのアップデートをしたいって思うと再起動しないといけないじゃないですかー。たまにしかやらないから忘れるじゃないですかー。
メモがてら残しておきます。
awsのEKSでCloudFormation使っている場合には、ami等がアップデートされている場合があるのでそちらのアップデートも行う必要がありますので注意。
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/update-stack.html
TL;DR
ノードをcordon -> drainしてsshで入ってアップデートして、uncordonする流れです。
現在の状態
1台だけ古いkernelのものがいるのでこいつをアップデートしてみようと思います。
ip-10-21-2-82.ap-northeast-1.compute.internal ですね。
[ec2-user@ip-10-21-12-201 ~]$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-10-21-10-74.ap-northeast-1.compute.internal Ready <none> 7h v1.12.7 x.112.249.81 Amazon Linux 2 4.14.123-111.109.amzn2.x86_64 docker://18.6.1
ip-10-21-11-182.ap-northeast-1.compute.internal Ready <none> 7h v1.12.7 y.65.123.209 Amazon Linux 2 4.14.123-111.109.amzn2.x86_64 docker://18.6.1
ip-10-21-2-82.ap-northeast-1.compute.internal Ready <none> 1m v1.12.7 z.112.90.181 Amazon Linux 2 4.14.106-97.85.amzn2.x86_64 docker://18.6.1
やっていく
スケジュールの停止
[ec2-user@ip-10-21-12-201 ~]$ kubectl cordon ip-10-21-2-82.ap-northeast-1.compute.internal
node "ip-10-21-2-82.ap-northeast-1.compute.internal" cordoned
ステータスがSchedulingDisabledになります。
[ec2-user@ip-10-21-12-201 ~]$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-10-21-10-74.ap-northeast-1.compute.internal Ready <none> 7h v1.12.7 x.112.249.81 Amazon Linux 2 4.14.123-111.109.amzn2.x86_64 docker://18.6.1
ip-10-21-11-182.ap-northeast-1.compute.internal Ready <none> 7h v1.12.7 y.65.123.209 Amazon Linux 2 4.14.123-111.109.amzn2.x86_64 docker://18.6.1
ip-10-21-2-82.ap-northeast-1.compute.internal Ready,SchedulingDisabled <none> 4m v1.12.7 z.112.90.181 Amazon Linux 2 4.14.106-97.85.amzn2.x86_64 docker://18.6.1
podsを追い出す
動いているpodsがあまりなかったのでいまいちですが、ほかのノードに移してくれます。
[ec2-user@ip-10-21-12-201 ~]$ kubectl drain ip-10-21-2-82.ap-northeast-1.compute.internal --ignore-daemonsets
node "ip-10-21-2-82.ap-northeast-1.compute.internal" already cordoned
WARNING: Ignoring DaemonSet-managed pods: cloudwatch-agent-dzrkq, aws-node-4nqhw, fluentd-47pg8, kube-proxy-k4tdj
pod "tasks-gas-miner-1561545600-4l2xv" evicted
node "ip-10-21-2-82.ap-northeast-1.compute.internal" drained
動いている(止まったらヤバイ)Podがいないかどうか確認します。
[ec2-user@ip-10-21-12-201 ~]$ kubectl get pods --all-namespaces -o wide | grep 'ip-10-21-2-82.ap-northeast-1.compute.internal'
amazon-cloudwatch cloudwatch-agent-dzrkq 1/1 Running 0 10m 10.21.2.220 ip-10-21-2-82.ap-northeast-1.compute.internal
kube-system aws-node-4nqhw 1/1 Running 0 11m 10.21.2.82 ip-10-21-2-82.ap-northeast-1.compute.internal
kube-system fluentd-47pg8 1/1 Running 0 10m 10.21.2.195 ip-10-21-2-82.ap-northeast-1.compute.internal
kube-system kube-proxy-k4tdj 1/1 Running 0 11m 10.21.2.82 ip-10-21-2-82.ap-northeast-1.compute.internal
アップデート&再起動
適当にアップデートします。
今回はssh で入って$ sudo yum update -y
しました。
SystemManagerでやってもいいし、ansibleでもいいし、chefでも。いつもの方法でやってください。
今回はkernelのアップデートをしたいので$ sudo reboot
しました。
再起動後に確認するとkernelが上がっているのが確認できます。
[ec2-user@ip-10-21-12-201 ~]$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-10-21-10-74.ap-northeast-1.compute.internal Ready <none> 7h v1.12.7 x.112.249.81 Amazon Linux 2 4.14.123-111.109.amzn2.x86_64 docker://18.6.1
ip-10-21-11-182.ap-northeast-1.compute.internal Ready <none> 8h v1.12.7 y.65.123.209 Amazon Linux 2 4.14.123-111.109.amzn2.x86_64 docker://18.6.1
ip-10-21-2-82.ap-northeast-1.compute.internal Ready,SchedulingDisabled <none> 16m v1.12.7 z.112.90.181 Amazon Linux 2 4.14.123-111.109.amzn2.x86_64 docker://18.6.1
ノードを戻す
uncordonするとstatusがReadyになります。
[ec2-user@ip-10-21-12-201 ~]$ kubectl uncordon ip-10-21-2-82.ap-northeast-1.compute.internal
node "ip-10-21-2-82.ap-northeast-1.compute.internal" uncordoned
[ec2-user@ip-10-21-12-201 ~]$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-10-21-10-74.ap-northeast-1.compute.internal Ready <none> 7h v1.12.7 x.112.249.81 Amazon Linux 2 4.14.123-111.109.amzn2.x86_64 docker://18.6.1
ip-10-21-11-182.ap-northeast-1.compute.internal Ready <none> 8h v1.12.7 y.65.123.209 Amazon Linux 2 4.14.123-111.109.amzn2.x86_64 docker://18.6.1
ip-10-21-2-82.ap-northeast-1.compute.internal Ready <none> 17m v1.12.7 z.112.90.181 Amazon Linux 2 4.14.123-111.109.amzn2.x86_64 docker://18.6.1
確認
ちゃんと動いてます。
[ec2-user@ip-10-21-12-201 ~]$ kubectl get pods --all-namespaces -o wide | grep 'ip-10-21-2-82.ap-northeast-1.compute.internal'
amazon-cloudwatch cloudwatch-agent-dzrkq 1/1 Running 1 21m 10.21.2.197 ip-10-21-2-82.ap-northeast-1.compute.internal
default tasks-hikkosi-gvlrp 1/1 Running 0 1m 10.21.2.115 ip-10-21-2-82.ap-northeast-1.compute.internal
default tasks-zyuusyohenkou-rfnvq 1/1 Running 0 1m 10.21.2.173 ip-10-21-2-82.ap-northeast-1.compute.internal
kube-system aws-node-4nqhw 1/1 Running 1 22m 10.21.2.82 ip-10-21-2-82.ap-northeast-1.compute.internal
kube-system fluentd-47pg8 1/1 Running 1 21m 10.21.2.128 ip-10-21-2-82.ap-northeast-1.compute.internal
kube-system kube-proxy-k4tdj 1/1 Running 1 22m 10.21.2.82 ip-10-21-2-82.ap-northeast-1.compute.internal
[ec2-user@ip-10-21-12-201 ~]$
まとめ
サービスのダウンなくワーカーノードのアップデートができるのはよいですね。
podのシャットダウンから起動まで少し時間がかかると思うので移動の確認をお忘れなく。