EKSアップデートとしないとお金かかる話

# EKSアップデートとしないとお金かかる話

:::note warn
この記事は、[Supershipグループ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/supership)の3日目の記事になります。
:::

## はじめに
Amazon EKS（Elastic Kubernetes Service) を使用している方が頭を悩ませる発表がありました。

https://aws.amazon.com/jp/blogs/news/amazon-eks-extended-support-for-kubernetes-versions-pricing/

これはサポート設計が二つに分かれ、それぞれサポート料金が変わるというものでした。

* 標準サポート
  * KubernetesバージョンがEKSで利用可能になってから14か月間
  * クラスターあたり1時間あたり0.10 USD

* 延長サポート
  * 標準サポート終了後、さらに12か月間のサポート
  * クラスターあたり1時間あたり0.60 USD

しかも、Kubernetesのバージョンアップはサイクルが早く定期的にアップデートしていかないと知らない間に料金が上がってしまうなんて事になってしまいます。

https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-release-calendar

今回は、何回かのアップデートを通して得た知見を共有したいと思います。

## EKSアップデート概要

### アップデートの種類

EKSのアップデートには以下の3種類をする必要があります

1. **コントロールプレーンのアップデート**
こちらは一番わかりやすいと思いますが、Kubernetesのコントロールプレーンのコンポーネント群をアップデートします。
2. **ワーカーノードのアップデート**
ワーカーノードにもバージョンがあり、こちらもコントロールプレーン同様アップデートする必要があります。
3. **アドオンのアップデート**
そして、最後にkubernetesとEKSとの橋渡しをしているアドオン群も同様にアップデートする必要があります。

また、今回のkubernetesの環境はセルフマネージドのバージョンアップで多分に手動で行っていることが多いのでそこら辺はご容赦ください。

## 事前準備

今回のクラスターではアプリケーション側の都合上新しくノードを作成し、新しく作成したノードへデプロイメントして動作を確認してから古いノードを消す手順で行いました。

### アップデート前に確認すべきこと
**現行のデプロイメント他リソースYAMLの取得**

デプロイメントなど、移行したいリソースYAMLを念の為ローカルにバックアップいたしました。
ソースコード上にもありますが、今回はCIツールではなくローカル上で全て行ったのでバックアップを取りました。

```bash
kubectl get deployment your-app-deployment -n your -o yaml > your-app-deployment.yml
```

他にも、アドオンのリソースを保存します。
現在はコンソールから、アドオンをインストール更新などできますが古い方法でインストールし更新を続けていたので今回は手動での更新を行いました。

```bash
aws eks describe-addon --cluster-name your-cluster --addon-name coredns --query addon.addonVersion --output text
```
例: coredns

## アップデート手順

### 1. コントロールプレーンのアップデート

今回はコンソール画面から行いました。他にもAWS CLIからも行うことは可能です。

手順:

1. AWSコンソールにログイン
2. EKSクラスターを選択
3. [アップデート] ボタンをクリックし、新しいバージョンを選択
4. 確認後、アップデートを開始

暫く経つとアップデートされます。

### 2. ワーカーノードのアップデート

新たにワーカーノードを作成しアプリケーションを移行してから古いノードを消す手順を行いました。
こちらもコンソールを使用して作成いたしました。

手順:

1. 新しいAMIを使用してノードグループを作成

構築時と同様、ノードIAMロールの指定、起動テンプレート（あれば）を指定し作成します。
注意点としては、当たり前ですが新しくサーバ群が構築されるのでIPなどもろもろ新たに作成されます。

2\. ローリングアップデートを実施

新しく作成されたノードに先ほどバックアップしたYAMLをコピーして新しいノードグループように`nodeSelector`を書き換えます。

```yaml
      nodeSelector:
        eks.amazonaws.com/nodegroup: <1.で作成したノード名>
```

書き換えが終わったら、順次反映していきます。

```bash
kubectl apply -f new-your-app-deployment.yml
```

3\. 不要になった古いノードを削除

すべてのリソースが移行し終わったことを確認し古いノードを削除します。

### 3. アドオンのアップデート

最後に、アドオンをアップデートします。
今回はセルフマネージド環境なのでアップデートを手動で行いました。
各アドオンごとにAWSドキュメントがあるのでそちらを参考にアップデートしていきます。
今回の例はCoreDNSで説明いたします。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/coredns-add-on-self-managed-update.html

現在インストールされている。アドオンのimageを確認します。

```bash
kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3
> v1.8.7-eksbuild.2
```

そして、アップデートしたkubernetesバージョンに対応するimageを下記の表から取得します。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/managing-coredns.html#coredns-versions

先ほど事前準備で取得したアドオンのリソースYAMLをコピーし新しいYAMLを作成しimageの箇所を書き換えます。

```yml
        image: 602401143452.dkr.ecr.ap-northeast-1.amazonaws.com/eks/coredns:v1.9.3-eksbuild.15
```

書き換えたら反映します

```bash
kubectl apply -f coredns-new-version.yaml
```

最後にバージョンが上がっていることを確認します。

```bash
kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3
> v1.9.3-eksbuild.15
```

以上で完了です。

## まとめ

今回はセルフマネージド環境でのアップデートの仕方を説明いたしました。
私が行った環境は複雑で特殊であったため、色々な手順がありましたがCLIも充実しすべてをCIに寄せることは可能そうです。
また、アップデートを意識しないECS環境を構築するのもよいかと思います。
アップデートを通しリリースノートなどを読み変更点を知ることでkubernetesの方向性を知ることができたのが最大の収穫だと思っております。

今回の説明がご参考になれば幸いです。


--- 

:::note
**最後に宣伝です。**

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いします。
:::