Tagbangers Blog

EKS クラスターのバージョンアップに失敗した(1.15 → 1.17)

はじめに

Kubernetes はおよそ 3 か月ごとにリリースされており、各マイナーバージョンは最初にリリースされてから約 9 か月間サポートされます。

また、現在(2020/08/13) Amazon EKS で新しいクラスターで利用する際には以下のバージョンで作成できます。

  • 1.17.6

  • 1.16.8

  • 1.15.11

AWSとしても、クラスターをタイムリーに更新することをお勧めしているのでバージョンアップしようと思います。

Kubernetes 1.16 にアップグレードにするための前提条件 を確認し特に問題なさそうなので、1.15 → 1.17 でバージョンアップします。(といっても飛び級であげられませんが...)

アップデート(失敗)

EKS クラスターの構築、設定を Terraform にて管理しているため version を 1.16 にし apply 。

怒られた。

Error: error updating EKS Cluster (cluster-name) version: InvalidRequestException: Kubelet version of Fargate pods must be updated to match cluster version 1.15 before updating cluster version; Please recycle all offending pod replicas
{
  Message_: "Kubelet version of Fargate pods must be updated to match cluster version 1.15 before updating cluster version; Please recycle all offending pod replicas"
}

Management Console でも

awscli でも

$ aws eks --region ap-northeast-1 update-cluster-version --name cluster-name --kubernetes-version 1.16

An error occurred (InvalidRequestException) when calling the UpdateClusterVersion operation: Kubelet version of Fargate pods must be updated to match cluster version 1.15 before updating cluster version; Please recycle all offending pod replicas

同じエラーですね。

https://kubernetes.io/ja/docs/concepts/overview/components/

コントロールプレーンのアップデートをかけようとしたところワーカーノード内で実行されるエージェントである、 kubelet のアップデートが求められました。

原因

この点についてサポートに確認したところ、以下のような回答をいただきました。

  • コントロールプレーンの Kubernetes のバージョンと、Fargate のノードの kubelet の Kubernetes バージョンがマイナーバージョンまで一致している必要がある
  • Fargate のノードの Kubernetes バージョンをアップデートするには、当該ノードを使用している Pod を削除し再作成する必要がある

※この点はまだ、AWSドキュメントには記載されていないようです

# 1.14 がまぎれている
$ kubectl get nodes
NAME                                                       STATUS   ROLES    AGE    VERSION
fargate-ip-172-21-10-116.ap-northeast-1.compute.internal   Ready    <none>   37d    v1.15.10-eks-094994
fargate-ip-172-21-11-111.ap-northeast-1.compute.internal   Ready    <none>   66d    v1.15.10-eks-094994
fargate-ip-172-21-11-212.ap-northeast-1.compute.internal   Ready    <none>   110d   v1.15.10-eks-094994
fargate-ip-172-21-11-222.ap-northeast-1.compute.internal   Ready    <none>   85d    v1.15.10-eks-094994
fargate-ip-172-21-12-127.ap-northeast-1.compute.internal   Ready    <none>   57d    v1.15.10-eks-094994
fargate-ip-172-21-14-147.ap-northeast-1.compute.internal   Ready    <none>   9d     v1.15.10-eks-094994
fargate-ip-172-21-15-136.ap-northeast-1.compute.internal   Ready    <none>   144d   v1.14.8-eks
fargate-ip-172-21-15-218.ap-northeast-1.compute.internal   Ready    <none>   111d   v1.15.10-eks-094994
fargate-ip-172-21-15-77.ap-northeast-1.compute.internal    Ready    <none>   80d    v1.15.10-eks-094994
fargate-ip-172-21-9-139.ap-northeast-1.compute.internal    Ready    <none>   71d    v1.15.10-eks-094994
$ kubectl get pods -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
alb-ingress-controller-7fdcddbf89-h9cfz   1/1     Running   0          71d
coredns-9c47646f9-7l6nw                   1/1     Running   0          85d
coredns-9c47646f9-7qmxd                   1/1     Running     0        144d
metrics-server-7668599459-5q99s           1/1     Running   0          9d

corednsを動かしているノードのKubernetesが1.14だったようです。

coredns は deployment として作成しているので pod を削除しても再作成が行われます。

$ kubectl get deployment -n kube-system
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
alb-ingress-controller   1/1     1            1           85d
coredns                  2/2     2            2           160d
metrics-server           1/1     1            1           15d

$ kubectl delete pod coredns-9c47646f9-7qmxd -n kube-system
pod "coredns-9c47646f9-7qmxd" deleted

$ kubectl get pods -n kube-system
NAME                                      READY   STATUS              RESTARTS   AGE
alb-ingress-controller-7fdcddbf89-h9cfz   1/1     Running             0          71d
coredns-9c47646f9-7l6nw                   1/1     Running             0          85d
coredns-9c47646f9-cdz2w                   0/1     ContainerCreating   0          64s
metrics-server-7668599459-5q99s           1/1     Running             0          9d

$ kubectl get pods -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
alb-ingress-controller-7fdcddbf89-h9cfz   1/1     Running   0          71d
coredns-9c47646f9-7l6nw                   1/1     Running   0          85d
coredns-9c47646f9-pcq68                   0/1     Pending   0          13s
metrics-server-7668599459-5q99s           1/1     Running   0          9d

$ kubectl get pods -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
alb-ingress-controller-7fdcddbf89-h9cfz   1/1     Running   0          71d
coredns-9c47646f9-7l6nw                   1/1     Running   0          85d
coredns-9c47646f9-pcq68                   1/1     Running   0          100s
metrics-server-7668599459-5q99s           1/1     Running   0          9d

# ノードのバージョンが 1.15 になった
$ kubectl get nodes
NAME                                                       STATUS   ROLES    AGE    VERSION
fargate-ip-172-21-10-116.ap-northeast-1.compute.internal   Ready    <none>   37d    v1.15.10-eks-094994
fargate-ip-172-21-10-125.ap-northeast-1.compute.internal   Ready    <none>   50s    v1.15.10-eks-094994
fargate-ip-172-21-11-111.ap-northeast-1.compute.internal   Ready    <none>   66d    v1.15.10-eks-094994
fargate-ip-172-21-11-212.ap-northeast-1.compute.internal   Ready    <none>   110d   v1.15.10-eks-094994
fargate-ip-172-21-11-222.ap-northeast-1.compute.internal   Ready    <none>   85d    v1.15.10-eks-094994
fargate-ip-172-21-12-127.ap-northeast-1.compute.internal   Ready    <none>   57d    v1.15.10-eks-094994
fargate-ip-172-21-14-147.ap-northeast-1.compute.internal   Ready    <none>   9d     v1.15.10-eks-094994
fargate-ip-172-21-15-218.ap-northeast-1.compute.internal   Ready    <none>   111d   v1.15.10-eks-094994
fargate-ip-172-21-15-77.ap-northeast-1.compute.internal    Ready    <none>   80d    v1.15.10-eks-094994
fargate-ip-172-21-8-20.ap-northeast-1.compute.internal     Ready    <none>   2m1s   v1.15.10-eks-094994
fargate-ip-172-21-9-139.ap-northeast-1.compute.internal    Ready    <none>   71d    v1.15.10-eks-094994

アップデート(成功)

この状態で再度アップデートしたら無事に 1.16 に!

$ aws eks describe-cluster --name cluster-name --region ap-northeast-1 | jq '.cluster["version"]' -r
1.16

※1.16 -> 1.17 へのアップデートも同様の理由(コントロールプレーンとFargate のノードの Kubernetes のマイナーバージョンの不一致)でエラーになる

{
  Message_: "Kubelet version of Fargate pods must be updated to match cluster version 1.16 before updating cluster version; Please recycle all offending pod replicas"
}

→再度、podを再作成してアップデートする