$30 off During Our Annual Pro Sale. View details »

Karpenterを試してみた

yuki_N
June 28, 2022

 Karpenterを試してみた

2022/6/27(月) AWS好きエンジニア LT会 vol.2 #3

yuki_N

June 28, 2022
Tweet

Other Decks in Programming

Transcript

  1. 札幌オフィス 〒060-0004 北海道札幌市中央区北4条西6-1 毎日札幌会館9F ベトナムオフィス 7th Floor, Mercury Building, No.444

    Hoang Hoa Tham Street, Thuy Khue ward, Tay Ho District, Hanoi city 西日本オフィス 〒530-0001 大阪府大阪市北区梅田2-2-2 ヒルトンプラザウエストオフィスタワー19F シリコンバレーインキュベーションセンター 3350 Scott Blvd. #29 Santa Clara, CA 95054 東京オフィス(本社) 〒108-0073 東京都港区三田3-13-16 三田43MTビル12F 株式会社ビッグツリーテクノロジー&コンサルティング Karpenterを試してみた 2022年06月27日
  2. 2 Copyright © 2022 BTC Corporation All Rights Reserved. LTの流れ

    1.自己紹介 2.Karpenterとは 3.Karpenter vs Cluster Autoscaler (CA) 4.Karpenterの導入 5.Karpenterの検証
  3. 3 Copyright © 2022 BTC Corporation All Rights Reserved. 自己紹介

    ▪2019年4月BTCに新卒で入社 ▪クラウドエンジニアとして、パブリッククラウドの設計・構築・運用まで 幅広く担当 ▪好きなAWSサービスはEKS ▪【保有資格】 Speaker’s profile 中山 友貴 ( なかやま ゆうき) 2019年4月入社 シニアアソシエイト
  4. 4 Copyright © 2022 BTC Corporation All Rights Reserved. Karpenterとは

    Kubernetes クラスターにおけるノードレベルのオートスケーリングツール • 柔軟で高パフォーマンスなクラスターオートスケーラー • アプリケーションの負荷の変化に応じて適切なサイズのコンピューティングリソースをプロビジョニング インスタンスタイプ、ゾーン、さらにインスタンスの購入オプション(スポット、リザーブ等)など柔軟な選択が可能 • AWSにおいては、Auto Scaling Group(ASG)経由ではなく、直接NodeとなるEC2インスタンスを プロビジョニングさせるため、現在のCluster Autoscalerと比較して、スケール速度が向上 • Kubernetesノード運用におけるオーバーヘッドを削減 • Karpenterはノードグループを使用せずに、各インスタンスを直接管理 • AutoScalingグループの作成が不要 • オープンソースプロジェクトとしてGitHubで公開 • 2021年11月21日にGA aws.「AWS Karpenter v0.5 の一般提供を開始」. https://aws.amazon.com/jp/about-aws/whats-new/2021/11/aws-karpenter-v0-5/, (2021/11/21)
  5. 5 Copyright © 2022 BTC Corporation All Rights Reserved. Karpenterとは

    Kubernetes クラスターにおけるノードレベルのオートスケーリングツール • KarpenterはスケジュールされていないPodのリクエストを監視し、プロバイダーのコンピューティングサービス (AWS EC2等)と直接連携し、Podを実行するために必要最小限のコンピューティングリソースを起動 Karpenter.「Karpenter」. https://karpenter.sh/
  6. 6 Copyright © 2022 BTC Corporation All Rights Reserved. Karpenter

    vs Cluster Autoscaler (CA) KarpenterはCAに比べて迅速、柔軟、高パフォーマンス • Cluster Autoscaler (CA) – CAは”node group”という抽象的なリソース単位でスケーリングを実施 – Auto Scaling Group(ASG)に対するスケールアウトになるため、起動するノードはASGの設定に依存 • インスタンスタイプやAZなど、ワークロードで必要となるNodeを起動するため、事前にASGを作成しておく 必要がある • Karpenter – Karpenterは”instance”という抽象的な単位でスケーリングを実施(AWSの場合はEC2) – アプリケーションの要件に応じてプロビジョニングする”instance”を選定 • CPU/MemoryやAZなどPodを配置可能な条件を算出し、要件を満たすEC2をEC2フリートにより起動す る • 要件に応じて必要なEC2フリートを作成するため、ASGなどの事前作成は不要
  7. 7 Copyright © 2022 BTC Corporation All Rights Reserved. Karpenterの導入

    今回は、EKSクラスタにKarpenterを導入し、 機能の確認をしたいと思います。
  8. 8 Copyright © 2022 BTC Corporation All Rights Reserved. Karpenterの導入

    前提条件 • VPCおよびネットワークリソース、EKSクラスターは作成済み • EKSの作業環境としてはCloud9を使用 • Cloud9には以下のツールを導入済み AWSCLI、kubectl、helm 導入手順 1. サブネット、セキュリティグループへのタグ付け、IAMロールの作成などAWSリソースのセットアップ • Karpenterが使用するサブネットを認識できるように、サブネット、セキュリティグループに以下のタグ付けを実施 "Key=karpenter.sh/discovery,Value=${CLUSTER_NAME}" • Karpenterによりプロビジョニングされるノード用のIAMロールを作成 • Karpenter controllerが新しいインスタンスをプロビジョニングするために使用するIAMロールを作成 • aws-auth ConfigMap を更新し、作成したIAMロールがクラスタで使用できるように設定 2. Karpenterのデプロイ(Helm) • 次ページ以降に手順を記載 3. “Provisioner” Custom Resource (CR) の作成 • 次ページ以降に手順を記載
  9. 9 Copyright © 2022 BTC Corporation All Rights Reserved. Karpenterの導入

    2. Karpenterのデプロイ(Helm) • Cloud9から下記のコマンドを実行し、Karpenterをクラスターにデプロイ • Karpenter関連のリソースが一通り作成されていることを確認 helm upgrade --install karpenter karpenter/karpenter --namespace karpenter ¥ --create-namespace --set serviceAccount.create=true --version ${KARPENTER_VERSION} ¥ --set serviceAccount.annotations.eks¥¥.amazonaws¥¥.com/role-arn=${IAM_ROLE_ARN} ¥ --set controller.clusterName=${CLUSTER_NAME} ¥ --set controller.clusterEndpoint=$(aws eks describe-cluster --name ${CLUSTER_NAME} --region ${REGION} --profile ${AWS_PROFILE} -- query "cluster.endpoint" --output json) --wait $ kubectl get all -n karpenter NAME READY STATUS RESTARTS AGE pod/karpenter-d9d5674d5-7hvjk 2/2 Running 0 38s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/karpenter ClusterIP 172.x.x.x <none> 8080/TCP,443/TCP 38s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/karpenter 1/1 1 1 39s NAME DESIRED CURRENT READY AGE replicaset.apps/karpenter-d9d5674d5 1 1 1 39s
  10. 10 Copyright © 2022 BTC Corporation All Rights Reserved. Karpenterの導入

    3. “Provisioner” Custom Resource (CR) の作成 • Cloud9上から下記のコマンドを実行し、Provisionerリソースを作成 apiVersion: karpenter.sh/v1alpha5 kind: Provisioner metadata: name: default spec: requirements: - key: karpenter.sh/capacity-type operator: In values: ['on-demand'] - key: 'node.kubernetes.io/instance-type' operator: In values: [ 'r5.large', ] limits: resources: cpu: 10 memory: 80Gi provider: subnetSelector: karpenter.sh/discovery: sample-cluster securityGroupSelector: karpenter.sh/discovery: sample-cluster ttlSecondsAfterEmpty: 30 ttlSecondsUntilExpired: 600 $ kubectl apply -f karpenter-provitioner.yaml provisioner.karpenter.sh/default created $ kubectl get provisioners NAME AGE default 30s Karpenterが構築するインスタンスのスペックやタイプを 指定可能
  11. 11 Copyright © 2022 BTC Corporation All Rights Reserved. Karpenterの検証

    サンプルPodをデプロイし、Karpenterを介してどのようにスケーリングするかを確認 • まずはサンプルPodを1台起動、この時点ではノードはデフォルトの3台 kind: Deployment apiVersion: apps/v1 metadata: name: app labels: app.kubernetes.io/name: app spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: app template: metadata: name: app labels: app.kubernetes.io/name: app spec: containers: - name: app image: alpine:latest command: [sh, -c, "sleep infinity"] resources: requests: cpu: 1 memory: 2048Mi App.yaml $ kubectl apply -f App.yaml deployment.apps/app created $ kubectl get pod NAME READY STATUS RESTARTS AGE app-6f57fc7d5c-rcw8t 1/1 Running 0 85s $ kubectl get node NAME STATUS ROLES AGE VERSION ip-XX-XX-13-40.ap-northeast-1.compute.internal Ready <none> 42d v1.22.6-eks-b18cdc9 ip-XX-XX-17-198.ap-northeast-1.compute.internal Ready <none> 42d v1.22.6-eks-b18cdc9 ip-XX-XX-22-103.ap-northeast-1.compute.internal Ready <none> 42d v1.22.6-eks-b18cdc9
  12. 12 Copyright © 2022 BTC Corporation All Rights Reserved. Karpenterの検証

    サンプルPodをデプロイし、Karpenterを介してどのようにスケーリングするかを確認 • サンプルPodを1台起動させた時点ではノードのスペックは足りているので、デフォルトの3台のまま
  13. 13 Copyright © 2022 BTC Corporation All Rights Reserved. Karpenterの検証

    サンプルPodをデプロイし、Karpenterを介してどのようにスケーリングするかを確認 • サンプルPodを5台に変更する • 上記コマンドを実行後、2台のPodがpendingになっていた • 1分16秒ほど経過したところでノードが新たに3台起動していることが確認できた • その後すぐに、Pendingになっていた2台のPodも起動した $ kubectl scale deploy app --replicas 5 deployment.apps/app scaled $ kubectl get pod NAME READY STATUS RESTARTS AGE app-6f57fc7d5c-6gs6x 1/1 Running 0 13s app-6f57fc7d5c-fwlsw 1/1 Running 0 2m21s app-6f57fc7d5c-lht75 1/1 Running 0 13s app-6f57fc7d5c-sppfz 0/1 Pending 0 13s app-6f57fc7d5c-wm4nw 0/1 Pending 0 13s $ kubectl get node NAME STATUS ROLES AGE VERSION ip-10-99-13-40.ap-northeast-1.compute.internal Ready <none> 42d v1.22.6-eks-b18cdc9 ip-10-99-14-91.ap-northeast-1.compute.internal Ready <none> 2m6s v1.22.6-eks-7d68063 ip-10-99-17-162.ap-northeast-1.compute.internal Ready <none> 2m6s v1.22.6-eks-7d68063 ip-10-99-17-198.ap-northeast-1.compute.internal Ready <none> 42d v1.22.6-eks-b18cdc9 ip-10-99-22-103.ap-northeast-1.compute.internal Ready <none> 42d v1.22.6-eks-b18cdc9 ip-10-99-22-66.ap-northeast-1.compute.internal Ready <none> 2m6s v1.22.6-eks-7d68063
  14. 14 Copyright © 2022 BTC Corporation All Rights Reserved. Karpenterの検証

    サンプルPodをデプロイし、Karpenterを介してどのようにスケーリングするかを確認 • サンプルPodを5台起動させた時点でノードのスペックが足りなくなるため、スケールアウトを実施 • およそ1分16秒でノードが起動することを確認 Cluster Autoscalerを用いて、同様の条件でスケールアウトを実施した際 のノードの起動時間はおよそ1分31秒
  15. 15 Copyright © 2022 BTC Corporation All Rights Reserved. まとめ

    • Karpenterの導入は比較的簡単 • 公式の手順が分かりやすい↓ https://karpenter.sh/v0.12.0/getting-started/migrating-from-cas/ • 1、2時間あれば導入可能 • Cluster Autoscalerと比較して、Nodeの追加時間が短い • Nodeを1台追加するのに要する時間 • Cluster Autoscaler:1分31秒 • karpenter:1分16秒 • Node管理が柔軟で便利 • 複数種類のインスタンスタイプから最適なタイプを自動判断し、 Nodeを追加することが可能
  16. 16 Copyright © 2022 BTC Corporation All Rights Reserved. おしまい

    ご清聴ありがとうございました! [出典]https://aws.amazon.com/jp/architecture/icons/