EKSがKubernetesのバージョン1.12をサポートしたので、アップデート手順を確認してみる

2019年3月28日に、Amazon EKSが、Kubernetesバージョン1.12.6に対応したことが発表されました!!

EKSクラスターのバージョンアップ手順を改めて確認しまとめてみました。クラスター自身のバージョンアップ以外にも関連アドオンのバージョンアップが必要であったり、もちろんワーカーノードのバージョンアップも必要であったり、それなりに手間がかかります。

ただ、EKSクラスターを過去のバージョンで塩漬けするなんてとんでもない。なんのために、Kubernetesを採用しているのか。今後EKSクラスターのバージョンアップは必須の運用なので、これを機会に一度、クラスターのバージョン更新の手順を確認することを強くオススメします。

この記事では、以下の2点に分けて、手順を解説します。

  • 新規でバージョン1.12のクラスタを作成する方法
  • 既存のクラスターをバージョン1.12に更新する方法
EKSバージョンアップきたか…!!

  ( ゚д゚) ガタッ
  /   ヾ
__L| / ̄ ̄ ̄/_
  \/   /

Kubernetesバージョン1.12の主な変更点

以下のリンクを参照ください。非常によくまとまっています。

EKSクラスターのバージョン1.12を作成する方法

まずは、新規でバージョン1.12のクラスターを作成する方法です。こちらはシンプル。

①Webコンソールから作成する方法

Webコンソールの「クラスターの作成」ボタンをクリックすると、クラスターの作成画面が表示されます。

Kubernetesバージョンとして1.12が選択できるようになっているので、これをクリックするのみです。

後はいつものやり方でクラスターを作成する方法でOKです。

②eksctlから作成する方法

cliでEKSを作成できるweaveworks/eksctl:でも、--version=1.12が指定できるようになっています。

以下のコマンドで、無事1.12のEKSクラスターが作成されました。

cm-hamada.koji:~/environment $ eksctl create cluster --name eks112-cluster --nodes=1 --version=1.12                                                                                           
[ℹ]  using region us-east-2
[ℹ]  setting availability zones to [us-east-2a us-east-2b us-east-2c]
[ℹ]  subnets for us-east-2a - public:192.168.0.0/19 private:192.168.96.0/19
[ℹ]  subnets for us-east-2b - public:192.168.32.0/19 private:192.168.128.0/19
[ℹ]  subnets for us-east-2c - public:192.168.64.0/19 private:192.168.160.0/19
[ℹ]  nodegroup "ng-2cdb48db" will use "ami-0e17dd7eeae729d78" [AmazonLinux2/1.12]
[ℹ]  creating EKS cluster "eks112-cluster" in "us-east-2" region
[ℹ]  will create 2 separate CloudFormation stacks for cluster itself and the initial nodegroup
[ℹ]  if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=us-east-2 --name=eks112-cluster'
[ℹ]  building cluster stack "eksctl-eks112-cluster-cluster"
[ℹ]  creating nodegroup stack "eksctl-eks112-cluster-nodegroup-ng-2cdb48db"
[ℹ]  --nodes-min=1 was set automatically for nodegroup ng-2cdb48db
[ℹ]  --nodes-max=1 was set automatically for nodegroup ng-2cdb48db
[✔]  all EKS cluster resource for "eks112-cluster" had been created
[✔]  saved kubeconfig as "/home/ec2-user/.kube/config"
[ℹ]  adding role "arn:aws:iam::629895769338:role/eksctl-eks112-cluster-nodegroup-n-NodeInstanceRole-N7MMKICRDV2Z" to auth ConfigMap
[ℹ]  nodegroup "ng-2cdb48db" has 0 node(s)
[ℹ]  waiting for at least 1 node(s) to become ready in "ng-2cdb48db"
[ℹ]  nodegroup "ng-2cdb48db" has 1 node(s)
[ℹ]  node "ip-192-168-47-199.us-east-2.compute.internal" is ready
[ℹ]  kubectl command should work with "/home/ec2-user/.kube/config", try 'kubectl get nodes'
[✔]  EKS cluster "eks112-cluster" in "us-east-2" region is ready

EKSクラスターのバージョンを確認すると、無事バージョン1.12で作成されていることが確認できます。

cm-hamada.koji:~/environment $ eksctl get cluster --name eks112-cluster
NAME            VERSION STATUS  CREATED                 VPC                     SUBNETS                                                                                                      SECURITYGROUPS
eks112-cluster  1.12    ACTIVE  2019-03-31T21:07:41Z    vpc-00fd1cedd3c95fdf6   subnet-0383e5882aab38c00,subnet-05ca09c9c964fc24a,subnet-09b6cd92f5b7df65e,subnet-09bc907d2f8585ae2,subnet-0c43f335060d14cd3,subnet-0f9d964797e7e6d44 sg-089ee03135bdfe8d8

既存のEKSクラスターを旧バージョンから1.12にバージョンアップする方法

バージョンアップは考慮事項が多々あるので、ゆっくりやっていきましょ。基本的なアップデート手順は、こちらの公式ドキュメントにまとめられています。

アップデート時の注意点は以下の通り。

Although Amazon EKS runs a highly available control plane, you might experience minor service interruptions during an update. For example, if you attempt to connect to an API server just before or just after it's terminated and replaced by a new API server running the new version of Kubernetes, you might experience API call errors or connectivity issues. If this happens, retry your API operations until they succeed.
引用:Updating an Amazon EKS Cluster Kubernetes Version - Amazon EKS

バージョンアップ中はAPIサーバーの切断が発生するので、APIリクエストに失敗した場合は、再実行が必要と記載されています。

各Kubernetesバージョンにおける推奨アドオンの一覧。後ほど手順がでてきますが、クラスターのバージョンアップを実施した後、これらのアドオンのバージョンアップも必要になります。

Kubernetes Version 1.1 1.11 1.12
Amazon VPC CNI plug-in We recommend the latest available CNI version (1.3.3)
DNS kube-dns 1.14.10 CoreDNS 1.1.3 CoreDNS 1.2.2
KubeProxy 1.10.3 1.11.5 1.12.6

Webコンソールからクラスターをアップデート

Webコンソールを開いて既存のEKSクラスターを選択すると、「クラスターバージョンの更新」ボタンがアクティブになっているのでクリックします。

「クラスターバージョンの更新」画面が表示されるので、Kubernetesバージョンを確認して「更新」ボタンをクリックします。

すると注意画面が。「Kuberetesバージョンのアップグレードを元に戻すことはできません。」と表示されます。不可逆なので注意しましょうということすね。大丈夫なら、手でクラスター名を入力して、「確認」ボタンをクリックします。

そうすると、クラスターのバージョン更新が開始されます。私の環境では完了まで20分ほどかかりました。

更新完了後、kubectlでサーバーバージョンを確認します。Server Versionがv1.12.6になっていればOK。

$ kubectl version --short
Client Version: v1.11.5
Server Version: v1.12.6-eks-d69f1b

この時、自分の環境ではkubectlがサーバーに繋がらなくなっていました。原因の詳細は不明ですが、以下のコマンドでkubeconfigを更新することで再度繋がりました。つながらなかったかたは一度試してみても良いかと思います。

aws eks update-kubeconfig --name cluster_name

kube-proxy利用のためのパッチ適用

kube-proxy daemonsetが、バージョン1.12.6クラスターバージョンのイメージを使うようにパッチを当てます。

$ kubectl patch daemonset kube-proxy \
-n kube-system \
-p '{"spec": {"template": {"spec": {"containers": [{"image": "602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/kube-proxy:v1.12.6","name":"kube-proxy"}]}}}}'
daemonset.extensions/kube-proxy patched

CoreDNSのアップグレード

クラスターでCoreDNSが使われているか確認します。今回は、1.11.5からのバージョンアップだったため、CoreDNSは既にインストール済みです。

$ kubectl get pod -n kube-system -l k8s-app=kube-dns
NAME                       READY     STATUS    RESTARTS   AGE
coredns-5c466f5779-47mkg   1/1       Running   0          16h
coredns-5c466f5779-w6lhv   1/1       Running   0          16h

もし、まだCoreDNSがインストールされていないクラスターであれば、別途CoreDNSのインストールが必要になります。こちら(CoreDNS のインストール)を参照して、インストールしてください。

インストールされているCoreDNSのバージョンを確認します。

$ kubectl describe deployment coredns --namespace kube-system | grep Image | cut -d "/" -f 3
coredns:v1.1.3

各EKSクラスターで推奨されている、CoreDNSのバージョンは以下の通り。

  • Kubernetes 1.12: 1.2.2
  • Kubernetes 1.11: 1.1.3

今回は、EKSクラスターを1.12にバージョンアップしているため、CoreDNSのバージョンも1.2.2へのアップグレードが必要になります。

kubectl set image --namespace kube-system deployment.apps/coredns \
coredns=602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/coredns:v1.2.2
deployment.apps/coredns image updated

CNIプラグインのバージョン確認

最後にCNIプラグインのバージョンを確認します。

$ kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
amazon-k8s-cni:v1.3.2

もし、CNIのバージョンが1.3.3以前の場合、以下のコマンドでCNIバージョンをアップグレードします。

$ kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/v1.3/aws-k8s-cni.yaml
clusterrole.rbac.authorization.k8s.io/aws-node configured
serviceaccount/aws-node unchanged
clusterrolebinding.rbac.authorization.k8s.io/aws-node configured
daemonset.apps/aws-node configured
customresourcedefinition.apiextensions.k8s.io/eniconfigs.crd.k8s.amazonaws.com configured

再度、バージョンを確認し、1.3.3になっていることを確認しましょう。

$ kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
amazon-k8s-cni:v1.3.3

ここまでで、EKSクラスター自体のバージョンアップと、関連アドオンの推奨バージョンへのアップグレードが完了しました。

ワーカーノードの更新

次はワーカーノードの更新ですが、こちらは別ドキュメントになっているのでこちらを参考に実施してみてください。

EKSにおけるKubernetesバージョンのEOLの方針

1.12サポートの発表とともに、KubernetesバージョンについてのEOLの考え方が発表されています。

  • 最新の3つのリリースをサポート対象とする

というわけで、2019年4月1日現在、Kubernetes 1.10、1.11、1.12が完全にサポートされている状態となります。

EKSにおけるクラスターバージョンの継続アップデートは今後必須

Kubernetes界隈は、その関連ツールや本体のバージョンアップがもの凄く早いです。つい先日も、Kubernetes 1.14がリリースされたばかり。まじで進化が早い。

オープンソースのコンテナ管理ツール「Kubernetes 1.14」リリース | Think IT(シンクイット)

ということは、自ずからEKSの対応バージョンも、継続してアップデートされていくことが予想されます。EKSを利用する上では、一度構築したクラスターをそのまま安定運用するのも重要ですが、それ以上に、進化するKubernetesに追従しながら、ベストプラクティスを常に追い続けるマインドもそれと同じぐらい重要です。

今回、新しいEKSサポートバージョンと合わせてKubernetesバージョンのサポート方針も確定したとのことなので、これをきっかけに一度クラスターバージョンのアップデートと合わせて、ワーカーノードのバージョンアップ手順を確認してみるのが良いと思います。

それでは、今日はこのへんで。濱田(@hamako9999)でした。