EKS CoreDNSアドオンの Autoscalerを試してみる!


EKS CoreDNSアドオンのAutoscaling機能が5/15にGAされました!

   https://aws.amazon.com/jp/about-aws/whats-new/2024/05/amazon-eks-native-support-autoscaling-coredns-pods/

EKS CoreDNSアドオンとは、EKSクラスタを構築すると自動でデプロイされるCoreDNSの事を指しています。

EKSにとってCoreDNSはクラスタ内のコンテナ(Pod)間通信を行うためのkind:Serviceの名前解決などに使用される非常に重要なコンポーネントです。

特にマイクロサービスアーキテクチャの場合、サービスが増える事でコンテナ間の相互接続が指数関数的に伸びていくため、CoreDNSのキャパシティ管理はEKSクラスタの安定稼動のために非常に重要なタスクでした。

今回のリリースでCoreDNSアドオンがAutoscalingをサポートする事になりましたので、クラスタ管理者はCoreDNSのキャパシティ管理から開放される事になります。とてもありがたい機能ですね!

今回はこの機能を試してみたいと思いますー。


# 前提条件

* CoreDNSアドオンのAutoscalerを有効にするためにはEKSバージョン1.25以降を使用する必要があります。より詳細には公式ドキュメントにも記載されている通り、以下のバージョン以降を使う必要があります。

https://docs.aws.amazon.com/eks/latest/userguide/coredns-autoscaling.html

| EKS(Kubernetes)バージョン | Platformバージョン | CoreDNSアドオンバージョン |
|-----------:|------------:|------------:|
| 1.29.3 | eks.7 |v1.11.1-eksbuild.9 |
| 1.28.8 | eks.13|v1.10.1-eksbuild.11 |
| 1.27.12| eks.17|v1.10.1-eksbuild.11 |
| 1.26.15| eks.18|v1.9.3-eksbuild.15 |
| 1.25.16| eks.19|v1.9.3-eksbuild.15 |

* 上の表の通り、EKS1.29の場合CoreDNSアドオンバージョンはv1.11.1-eksbuild.9以降を選択する必要がありますが、5/17現在のデフォルトバージョンはv1.11.1-eksbuild.4でした。そのためEKSクラスタ構築時等で明示的にバージョン変更する必要がありますのでご注意ください。

![Corednsのデフォルトバージョン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/d0479c44-0bab-a081-af8b-40159430fb07.png)

# CoreDNS Autocalerを有効化してみる

それでは早速有効化してみましょう!
EKSクラスタ、ノードグループは構築済みのところから説明します。
Autoscalerの有効化はコンソールから設定する方法とaws cliから設定する方法がありますが、今回はコンソールから設定してみます。

1. EKSコンソールの左側ペインで「クラスター」を選択し、表示されるクラスタの一覧からAutoscalerを有効化したいクラスタを選択します。

![3.クラスタを指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/b9bd26e3-3063-0894-6dc1-e9169c8f4698.png)

2\.  「アドオン」タブをクリックします。

![4.アドオンタブを指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/5e6e90fe-862f-b433-3ff2-a899fc0bd0e6.png)

3\.  テキストボックスにCoreDNSと入力してCoreDNSアドオンを表示させた後、リンクをクリックします。

![5.Corednsを指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/d91e944a-c88a-bce4-de89-49031dad5d6e.png)

4\.「編集」ボタンをクリックします。

![6.編集ボタンをクリック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/7cc25b53-431c-2614-0b63-232d015b8d36.png)

5\.「オプションの設定」をクリックします。

![7.オプションの設定をクリック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/5cadffec-f4fc-167c-9757-92502288200f.png)

6\.「設定値」のテキストボックスにAutoscaling設定のJSONを貼り付けます。

![8.設定値のところにAutoScaling有効化のJSONを追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/dcc8c249-c754-1e92-43d2-5baa9f669d10.png)

今回は以下の設定を追加しました。

```json
{
  "autoScaling": {
    "enabled": true, ← Autoscalingを有効化
    "minReplicas": 2,  ← 最小レプリカ数
    "maxReplicas": 10  ← 最大レプリカ数
  }
}
```

7\.「変更内容を保存」ボタンをクリックします。

![9.変更内容を保存ボタンをクリック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/f510fd83-90a5-d274-6770-25ded9826fae.png)

これで設定変更は完了です。非常にシンプルですね!
追加したJSONは「高度な設定」に表示されます。

![12.高度な設定の箇所に設定が表示される。.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/77d6c51e-f670-942b-ea5e-e33dc0a2ebf3.png)

# 動作検証する

負荷を掛けて実際にAutoscalingを発動させることは時間的に難しかったので、minReplicasの値を変更する事でPod数が変更になるのかを試してみました。

現状は以下の様にcoredns podは2つ起動しています。

```
[cloudshell-user@ip-10-134-3-226 ~]$ kubectl get deploy coredns -n kube-system
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
coredns   2/2     2            2           42m
```

それでは設定変更してみましょう。今回はaws cliで変更してみます。

```                        
[cloudshell-user@ip-10-134-3-226 ~]$ aws eks update-addon --cluster-name my-eks --addon-name coredns  --resolve-conflicts PRESERVE --configuration-values '{"autoScaling":{"enabled":true, "minReplicas": 4, "maxReplicas": 10}}'
{
    "update": {
        "id": "905dd487-799a-3d53-a87f-7abc7cdb287d",
        "status": "InProgress",
        "type": "AddonUpdate",
        "params": [
            {
                "type": "ResolveConflicts",
                "value": "PRESERVE"
            },
            {
                "type": "ConfigurationValues",
                "value": "{\"autoScaling\":{\"enabled\":true, \"minReplicas\": 4, \"maxReplicas\": 10}}"
            }
        ],
        "createdAt": "2024-05-16T12:03:43.798000+00:00",
        "errors": []
    }
}
```
コマンドは成功した様ですね。
再度Pod数を確認したところPod数が4つに変りました! Autoscaling設定はちゃんと動いているみたいです!

```
[cloudshell-user@ip-10-134-3-226 ~]$ kubectl get deploy coredns -n kube-systemNAME      READY   UP-TO-DATE   AVAILABLE   AGE
coredns   4/4     4            4           47m
```

# HPAで動いている?

KubernetesにはHorizontalPodAutoscaler(HPA)というネイティブなPodの自動スケールアウトの機能があります。

https://kubernetes.io/ja/docs/tasks/run-application/horizontal-pod-autoscale/

今回のCoreDNSアドオンのAutoscaling機能も、内部でHPAが動いているのかなと思い```kubectl get```してみましたが、HPAリソースは作成されていませんでした。

HPAではなくEKSの独自の機構でAutoscalingを実現しているのですかね、気になります。。

```
[cloudshell-user@ip-10-134-3-226 ~]$ kubectl get hpa -A
No resources found
```

# おわりに

今回は5/15にGAされたEKSのCorednsアドオンのAutoscaling機能を触ってみました。
小さいJSONを追加するだけで簡単にAutoscaling機能を有効にできました。
また、検証前はHPAで実現しているのかなと思っていましたが、どうやら独自の機構を使っているのではという事も判りました。

EKSは最近機能追加が積極的に行われており、そのおかげでクラスタ構築の敷居がどんどん下っていると感じますので、今後のEKS機能拡張にも期待しましょう!
この記事がだれかのお役に立てれば幸いです!