はじめに
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を再作成してアップデートする