k8s worker nodeのアップデート

最近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のシャットダウンから起動まで少し時間がかかると思うので移動の確認をお忘れなく。