JAWS-UG コンテナ支部 ✖️ DE&I 合同! Amazon EKS Auto Mode ワークショップを開催しました!
イベント概要
AWSコンテナHeroのJuliaとAWS Modern Compute Community責任者のFarrrahがAWS Summit参加前にJAWS-UGへ初参加してくださいました。
それに伴い、 JAWS-UG コンテナ支部と合同でAmazon EKS Auto Mode に関するワークショップを開催しましたのでご紹介です。
※私は事前準備完全お任せ状態で、当日のお手伝い担当でございました。Workshop Studioに全員がログインできるように奔走することが私の使命
Julia
JuliaさんはAWSコンテナHeroだけでなく、CNCFアンバサダー、Google Women Techmakers アンバサダーなど、複数のアンバサダーの役割を通じてコミュニティ活動や技術普及に積極的に取り組んでいる方です。
自己紹介文が可愛くて笑顔になりました。
Juliaが紹介してくれた、Amazon EKS Auto Modeをworkshopで試せる会です。
EKS Auto Modeとは
従来のEKS運用
- ノードグループを手動で作成・管理
- スケーリングポリシーを自分で設定
- アップグレード時は計画的にノードを入れ替え
- ストレージやロードバランサーの設定も個別に管理
EKS Auto Mode
- ノードは自動で起動・管理される
- アプリの要求に応じて最適なインスタンスを選択
- アップグレードも自動化
- 必要な機能が統合されている
Kubernetesユーザーではない私ですが、約4ヶ月ごとにマイナーバージョンがリリースされ、各バージョンのサポート期間が約1年という速いペースでのバージョンアップにネガティブイメージを持っていたためです。
インフラエンジニアとしては頻繁にアップデート対応を行わないといけない環境は自分の首を絞めてしまうなと。それをAutoで対応してくれる機能になるようです。(勿論、動作が問題ないかは事前検証が必要です)
また、ノードの自動起動・管理による快適な構築作業をworkshopで体験させていただきました。
- Auto Modeを有効化
Workshop studioで環境をご用意いただいているので、demo-clusterが存在しています。
$ kubectx arn:aws:eks:${AWS_REGION}:${AWS_ACCOUNT_ID}:cluster/demo-cluster
Switched to context "arn:aws:eks:us-west-2:123456789:cluster/demo-cluster".
ただし、クラスター内のポッドやノードは存在していません。
$ kubectl get nodes
No resources found
$ kubectl get pods --all-namespaces
No resources found
下記コマンドAuto Modeを有効化
※4分ほど待ち時間が必要です
※クラスターロールにこのIAMポリシーを追加 (AmazonEKSComputePolicy , AmazonEKSBlockStoragePolicy , AmazonEKSNetworkingPolicy , AmazonEKSLoadBalancingPolicy)
$ aws eks update-cluster-config \
--name ${DEMO_CLUSTER_NAME} \
--compute-config enabled=true,nodeRoleArn=${DEMO_CLUSTER_NODE_ROLE_ARN},nodePools=system,general-purpose \
--kubernetes-network-config '{"elasticLoadBalancing":{"enabled": true}}' \
--storage-config '{"blockStorage":{"enabled": true}}'
Auto Modeを有効化することでポッドやノードは存在しないままですが、以下のCRDが追加されたことを確認できます。
$ kubectl get crd | grep eks.amazonaws.com
cninodes.eks.amazonaws.com 2025-01-22T12:25:06Z
ingressclassparams.eks.amazonaws.com 2025-01-22T12:25:02Z
nodeclasses.eks.amazonaws.com 2025-01-22T12:25:02Z
nodediagnostics.eks.amazonaws.com 2025-01-22T12:25:02Z
targetgroupbindings.eks.amazonaws.com 2025-01-22T12:25:02Z
- サンプルアプリケーションをデプロイ
下記コマンドを実施したところ、ポッドが作成されていました。
$ cat << EOF > ~/environment/values-ui.yaml
app:
theme: default
endpoints:
catalog: http://retail-store-app-catalog:80
carts: http://retail-store-app-carts:80
checkout: http://retail-store-app-checkout:80
orders: http://retail-store-app-orders:80
EOF
helm upgrade -i retail-store-app-catalog oci://public.ecr.aws/aws-containers/retail-store-sample-catalog-chart --version ${RETAIL_STORE_APP_HELM_CHART_VERSION} --hide-notes
helm upgrade -i retail-store-app-orders oci://public.ecr.aws/aws-containers/retail-store-sample-orders-chart --version ${RETAIL_STORE_APP_HELM_CHART_VERSION} --hide-notes
helm upgrade -i retail-store-app-carts oci://public.ecr.aws/aws-containers/retail-store-sample-cart-chart --version ${RETAIL_STORE_APP_HELM_CHART_VERSION} --hide-notes
helm upgrade -i retail-store-app-checkout oci://public.ecr.aws/aws-containers/retail-store-sample-checkout-chart --version ${RETAIL_STORE_APP_HELM_CHART_VERSION} --hide-notes
helm upgrade -i retail-store-app-ui oci://public.ecr.aws/aws-containers/retail-store-sample-ui-chart --version ${RETAIL_STORE_APP_HELM_CHART_VERSION} -f ~/environment/values-ui.yaml --hide-notes
$ kubectl wait --for=condition=Ready nodes --all
node/i-0123456789abcdefa condition met
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
retail-store-app-carts-5f5b7449f-tgscs 1/1 Running 0 91s
retail-store-app-catalog-dcb5d8d4c-5ftp9 1/1 Running 0 94s
retail-store-app-checkout-f5bb5c5bb-pkgg7 1/1 Running 0 90s
retail-store-app-orders-5fbb6b8576-x6vs9 1/1 Running 0 93s
retail-store-app-ui-7b7c8f6b94-2ltrs 1/1 Running 0 88s
サンプルアプリケーションをデプロイしてからこの表示を確認できるまで数分だったのですが、本来であれば下記手順が必要です。
- ノードグループを作成
- インスタンスタイプを選択
- 必要な台数を指定
- 起動を待つ
これを完全自動化してくれ、アプリケーションの要求リソースを見て、最適なインスタンスタイプを選んでくれる体験ができました。
- 優秀なAuto Scaling
EKS Auto Modeでは下記のようにAuto Scalingが行われます。
アプリへの影響を最小限にしつつ、コスト削減を意識してくれる仕組みです。
主なポイント
- EKS Auto Modeは内部でKarpenterを使用してノードのスケーリングとディスラプションを管理
- ディスラプションは主にコスト削減のためのスケールダウンや最大有効期限到達時に発生
統合メカニズム
- ノードとポッドの使用率を継続的に監視
- 十分に活用されていないノードを検出すると最適化プロセスを開始
- アイドルノードの削除、既存ノードへのポッドの効率的な配置、アプリケーションの可用性を保ちながらの優雅なノード退避を実行
シナリオでは手動でスケールもさせてみましたが、爆速でした。
$ kubectl scale --replicas=12 deployment/retail-store-app-ui
deployment.apps/retail-store-app-ui scaled
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
i-0123456789abcdefb Ready <none> 17s v1.32.3-eks-3c20087
i-0123456789abcdefc Ready <none> 10m v1.32.3-eks-3c20087
さらに、Pod Topology Spread Constraintsを設定すると、複数のAZに自動的にPodを分散配置してくれます。
- ゼロタッチアップグレード
下記コマンドを実施すると、クラスターのアップグレードが可能です。
下記の通り、クラスターをKubernetes 1.32から1.33にアップグレードしました。
$ aws eks update-cluster-version --name $DEMO_CLUSTER_NAME --kubernetes-version 1.33
これにより、ワーカーノードも自動的にアップグレードされます
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
i-0123456789abcdefd Ready <none> 6m33s v1.33.0-eks-987fa8d
これは下記手順が省略されています。
- ノードを1台ずつドレイン
- 新しいノードを起動
- Podを移動
- 古いノードを削除
さらに、Pod Disruption Budgetを考慮して、アプリケーションの可用性を保ちながらアップグレードしてくれているとのことでした。
その他、Gravitonへの切り替えやALBの自動作成の体験などをさせていただきましたが、あまりにもEKSの挙動が早すぎて下記のような出来事が発生しました。
- amd→armへ切り替わったことに気づけずシナリオを右往左往する
- Ingressを追加するだけでALBが自動作成されるが、ALBの起動には時間がかかるのでテーブル内で雑談会が始まる
EKSの爆速さ故で、これも含めてとても良い体験ができました。
私が感じたEKS Auto Modeのメリットは以下です。
- ノードグループの設定が完全不要
- スケーリングでも最適なインスタンスを自動選択され、マルチAZ配置も自動
- Spot活用やインスタンスタイプ変更が容易
- アップグレードの心配なし - ゼロタッチで更新
後半二つは起動させるアプリケーションにも依存すると思いますが、インフラエンジニアが貼り付かなくても良い仕様になっていると感じました。
私以外にも初めてKubernetesを触る方がたくさんいらっしゃったこともあり、EKSチャレンジの良い機会になったのではないかと思います。
Farrrahさんもたくさんのタンブラーや飲み物を差し入れてくださり、良い時間を過ごせました!
当日、補足情報として記事を共有いただいたので、以下貼らせていただきます。
Discussion