🐕

[メモ]Amazon EKS Auto Modeの所感

2024/12/27に公開

今回はAmazon EKSで発表されたAuto Modeについて簡単に調査・検証したので、概要と所感を記載します。

EKS Auto Modeとは

EKS Auto Modeは、Amazon EKSの運用周りの一部機能をAWS側が管理し、利用者の運用負荷やコスト管理を軽減してくれる機能です。具体的にはデータプレーンノードのオートスケール、Add-onによる関連コンポーネントの管理、クラスターアップグレード時の自動更新などを含みます。

AWSの公式アナウンスでは以下のように紹介しています。

本日 re:Invent において、AWS は Amazon Elastic Kubernetes Service (Amazon EKS) の Auto Mode を発表しました。これは、Kubernetes クラスターのコンピューティング、ストレージ、およびネットワーキングの管理を完全に自動化する新機能です。Amazon EKS Auto Mode は、クラスターの運用を AWS にオフロードすることで Kubernetes の実行を簡素化し、アプリケーションのパフォーマンスとセキュリティを向上させ、コンピューティングコストを最適化するのに役立ちます。

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-eks-auto-mode/

所感

Auto Modeの調査や検証を踏まえての所感を記載します。

クラスター作成

クラスター作成はAWSマネジメントコンソール / AWS CLI / eksctlで実行できます。今回はマネジメントコンソールから作成してみましたが、クラスター作成で必要になるIAMロールの作成が簡単にできるのはありがたかったです。具体的にはIAMロール作成画面に移動すると、ユースケースに EKS - Auto Cluster EKS - Auto Node というユースケースが用意されており、これを選択してロールを作成するだけで完了しました。

コンピューティング

Auto ModeはPodが作成されるまでData planeノードを起動しません。そのため初回Podが作成されるときは通常のEC2 Data planeより多少起動まで時間がかかります。この辺りはEKS on Fargateを使っているときと似た感覚がありました。

[cloudshell-user@ip-10-130-62-92 ~]$ kubectl run nginx --image=nginx
pod/nginx created
[cloudshell-user@ip-10-130-62-92 ~]$ kubectl get pods -w
NAME    READY   STATUS    RESTARTS   AGE
nginx   0/1     Pending   0          6s
nginx   0/1     Pending   0          25s
nginx   0/1     ContainerCreating   0          25s
nginx   1/1     Running             0          46s
[cloudshell-user@ip-10-130-62-92 ~]$ kubectl get nodes
NAME                  STATUS   ROLES    AGE   VERSION
i-0e519abc4dcad7e54   Ready    <none>   66s   v1.31.1-eks-1b3e656

ただしFargateと違うのは、一度ノードが起動すれば (キャパシティ等の影響で新しいノードが立ち上がらない限り) ノード上にコンテナイメージのキャッシュが残るため、次回以降のPodの起動が高速になる点です。またFargateはGPUなどには対応していないため、Auto Modeのほうが対応できるケースは多いと思われます。

[cloudshell-user@ip-10-130-62-92 ~]$ kubectl run nginx2 --image=nginx
pod/nginx2 created
[cloudshell-user@ip-10-130-62-92 ~]$ kubectl get pods
NAME     READY   STATUS    RESTARTS   AGE
nginx    1/1     Running   0          15m
nginx2   1/1     Running   0          6s
[cloudshell-user@ip-10-130-62-92 ~]$ 

また、デフォルトの状態で使うと、上記のようにNginx Podを立ち上げたときは c5a.large のインスタンスが立ち上がりました。東京リージョンではこのサイズの時間単価は $0.096 + $0.01152 = $0.10752 であり、同じスペックであれば別のインスタンスタイプで安価なものもあります。

※EKS Auto Modeを利用するときは通常のインスタンス料金に追加料金が発生します。

https://aws.amazon.com/jp/eks/pricing/

例えば開発環境やテスト環境のためにAuto Modeを採用したい場合、EKSのコストを抑えたいという要望が出ると思います。そのため利用者は必要に応じてカスタムなNodePoolを作成する必要があります。

https://docs.aws.amazon.com/eks/latest/userguide/create-node-pool.html
https://docs.aws.amazon.com/eks/latest/userguide/set-builtin-node-pools.html
https://dev.classmethod.jp/articles/eks-auto-mode-custom-node-pool/

なおAuto ModeはAWSの管理するKarpenterを採用しており、クラスター作成時点でNodeClass / NodePoolが作成されます。デフォルトの設定は以下の通りです。

[cloudshell-user@ip-10-134-5-103 ~]$ kubectl get nodepool
NAME              NODECLASS   NODES   READY   AGE
general-purpose   default     0       True    13m
system            default     0       True    13m

[cloudshell-user@ip-10-134-5-103 ~]$ kubectl get nodeclass
NAME      ROLE                    READY   AGE
default   AmazonEKSAutoNodeRole   True    13m

[cloudshell-user@ip-10-134-5-103 ~]$ kubectl get nodepool general-purpose -oyaml
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  annotations:
    karpenter.sh/nodepool-hash: "4012513481623584108"
    karpenter.sh/nodepool-hash-version: v3
  creationTimestamp: "2024-12-26T06:15:51Z"
  generation: 1
  labels:
    app.kubernetes.io/managed-by: eks
  name: general-purpose
  resourceVersion: "1057"
  uid: 4bfa573a-e334-4b3e-b99c-d1743eac5f0d
spec:
  disruption:
    budgets:
    - nodes: 10%
    consolidateAfter: 30s
    consolidationPolicy: WhenEmptyOrUnderutilized
  template:
    metadata: {}
    spec:
      expireAfter: 336h
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default
      requirements:
      - key: karpenter.sh/capacity-type
        operator: In
        values:
        - on-demand
      - key: eks.amazonaws.com/instance-category
        operator: In
        values:
        - c
        - m
        - r
      - key: eks.amazonaws.com/instance-generation
        operator: Gt
        values:
        - "4"
      - key: kubernetes.io/arch
        operator: In
        values:
        - amd64
      - key: kubernetes.io/os
        operator: In
        values:
        - linux
      terminationGracePeriod: 24h0m0s
status:
  conditions:
  - lastTransitionTime: "2024-12-26T06:16:07Z"
    message: ""
    observedGeneration: 1
    reason: ValidationSucceeded
    status: "True"
    type: ValidationSucceeded
  - lastTransitionTime: "2024-12-26T06:16:09Z"
    message: ""
    observedGeneration: 1
    reason: NodeClassReady
    status: "True"
    type: NodeClassReady
  - lastTransitionTime: "2024-12-26T06:16:09Z"
    message: ""
    observedGeneration: 1
    reason: Ready
    status: "True"
    type: Ready
  resources:
    cpu: "0"
    ephemeral-storage: "0"
    memory: "0"
    nodes: "0"
    pods: "0"

[cloudshell-user@ip-10-134-5-103 ~]$ kubectl get nodeclass default -oyaml
apiVersion: eks.amazonaws.com/v1
kind: NodeClass
metadata:
  annotations:
    eks.amazonaws.com/nodeclass-hash: "3809868827326149578"
    eks.amazonaws.com/nodeclass-hash-version: v1
  creationTimestamp: "2024-12-26T06:15:51Z"
  finalizers:
  - eks.amazonaws.com/termination
  generation: 1
  labels:
    app.kubernetes.io/managed-by: eks
  name: default
  resourceVersion: "4199"
  uid: 5ad682f3-90fc-4773-9966-ff1148333c4d
spec:
  ephemeralStorage:
    iops: 3000
    size: 80Gi
    throughput: 125
  networkPolicy: DefaultAllow
  networkPolicyEventLogs: Disabled
  role: AmazonEKSAutoNodeRole
  securityGroupSelectorTerms:
  - id: sg-06d04b074a304cfd6
  snatPolicy: Random
  subnetSelectorTerms:
  - id: subnet-00d0e5348f6bfb294
  - id: subnet-027c2c4266a3bb9c7
status:
  conditions:
  - lastTransitionTime: "2024-12-26T06:16:09Z"
    message: ""
    observedGeneration: 1
    reason: SubnetsReady
    status: "True"
    type: SubnetsReady
  - lastTransitionTime: "2024-12-26T06:16:09Z"
    message: ""
    observedGeneration: 1
    reason: SecurityGroupsReady
    status: "True"
    type: SecurityGroupsReady
  - lastTransitionTime: "2024-12-26T06:16:09Z"
    message: ""
    observedGeneration: 1
    reason: InstanceProfileReady
    status: "True"
    type: InstanceProfileReady
  - lastTransitionTime: "2024-12-26T06:16:09Z"
    message: ""
    observedGeneration: 1
    reason: Ready
    status: "True"
    type: Ready
  instanceProfile: eks-ap-northeast-1-exciting-synth-sheepdog-2537443890950714400
  securityGroups:
  - id: sg-06d04b074a304cfd6
    name: eks-cluster-sg-exciting-synth-sheepdog-1547813176
  subnets:
  - id: subnet-00d0e5348f6bfb294
    zone: ap-northeast-1c
    zoneID: apne1-az1
  - id: subnet-027c2c4266a3bb9c7
    zone: ap-northeast-1a
    zoneID: apne1-az4
[cloudshell-user@ip-10-134-5-103 ~]$ 

また、Pod自体のオートスケールを管理する機能はなさそうなので、metrics-serverなどを別途導入する必要がありそうです。

アップグレード

Auto Modeクラスターのアップデートを開始すると、クラスター内のNodeの入れ替えを行います。また以下のコンポーネントは利用者が更新する必要がなく、自動的に更新されます。

  • CoreDNS
  • kube-proxy
  • AWS Load Balancer Controller
  • Karpenter
  • AWS EBS CSI Driver

https://docs.aws.amazon.com/eks/latest/userguide/auto-upgrade.html

個人的にAuto Modeで一番うれしいのは、クラスターアップデートの簡易化です。アップデート作業をして面倒なのは、クラスターのバージョンに合わせてAPIが非推奨になっていないかをチェックしたり、必要に応じてクラスター上のコンポーネントを前もって更新する必要がある点です。自作のコントローラーやOSS等を組み合わせてシステムを構築する場合は確認対象のコンポーネントも多くなり、運用負荷が高い作業でした。

APIの廃止についてはUpgrade Insightsの登場でかなり楽になりましたが、更新作業が必要な場合は利用者が行わなければなりません。その点で、CoreDNS/kube-proxy/Load Balancer Controllerあたりの更新もAWSがやってくれるのは、かなりありがたいと感じます。

ただし、当然ながら自前で導入したものは管理しないといけません。またアップデート自体は人がトリガーしないといけません。特にクラスター自体を大量に管理している場合は、スクリプトを組むなどの対応が必要でしょう (ここは自動更新してもよかったのでは、と思ったりしました。例えばUpgrade Insightsと組み合わせて、APIの問題がなければクラスターを更新してくれる、とか) 。

ストレージ

Auto Modeはクラスター作成時点でEBS CSI Driverを利用可能で、適切なStorageClassを作成すれば、リクエストに応じて自動的にEBSをプロビジョニングします。

https://docs.aws.amazon.com/eks/latest/userguide/create-storage-class.html

従来はクラスター作成後にEBS/EFS CSI Driverを利用者が導入する必要があったので、この辺りも楽になりました。ただしEFSは未対応なので、EFSを利用するには別途作業が必要となります。

ネットワーク

Auto ModeはAWS Load Balancer Controllerを利用可能です。そのため IngressClass TargetGroupBinding といったリソースを通じてネットワークを構築できます。

https://docs.aws.amazon.com/eks/latest/userguide/auto-configure-alb.html

その他

Auto Modeがリリースして2週間後にNode Auto-Repairという機能がリリースされました。

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/node-health-monitoring-auto-repair-amazon-eks/

この機能はAuto Modeにも備わっています。今後はAuto Modeの機能拡張もいろいろ入ってくると思うので、楽しみです。

https://github.com/aws/containers-roadmap/issues?q=is%3Aissue+is%3Aopen+eks+auto+mode+

参考ドキュメント

Discussion