Cluster Autoscaler - Amazon EKS

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

Cluster Autoscaler

Kubernetes Cluster Autoscaler は、リソース不足が原因でポッドが起動できなかった場合、またはクラスター内のノードの利用率が低く、そのポッドをクラスター内の他のノードに再スケジュールできる場合に、クラスター内のノードの数を自動的に調整します。

このトピックでは、Cluster Autoscaler を Amazon EKS クラスターに デプロイする方法と Amazon EC2 Auto Scaling グループを変更するために設定する方法について説明します。Cluster Autoscaler は、より多くのリソースが必要な場合はスケールアウトし、リソース使用率が低い場合はスケールインするようにノードグループを変更します。

Amazon EKS クラスターを作成する

このセクションでは、クラスターおよびノードグループを作成できます。クラスターがすでに存在する場合は、Cluster Autoscaler ノードグループの考慮事項 に進んでください。

Amazon EBS ボリュームによってバックアップされ、Kubernetes Cluster Autoscaler を使用する複数のアベイラビリティーゾーンにわたってステートフルアプリケーションを実行している場合、それぞれが単一のアベイラビリティーゾーンにスコープされる複数のノードグループを設定する必要があります。また、--balance-similar-node-groups 機能を有効にする必要があります。しない場合は、複数のアベイラビリティーゾーンにまたがる 1 つのノードグループを作成できます。

次のいずれかのクラスター作成手順のステップを実行します。

[複数の にまたがる 1 つのマネージド型グループを持つクラスターを作成するには]アベイラビリティーゾーン

  • 次の eksctl コマンドを使用して、単一のマネージド型ノードグループを持つ Amazon EKS クラスターを作成します。詳細については、を参照してください Amazon EKS クラスターの作成。<variable text>は独自の値に置き換えてください。

    eksctl create cluster --name <my-cluster> --version <1.18> --managed --asg-access

    アベイラビリティーゾーン を示す出力部分:

    ... [ℹ] using region <region-code> [ℹ] setting availability zones to [<region-code>a <region-code>b <region-code>c] [ℹ] subnets for <region-code>a - public:192.168.0.0/19 private:192.168.96.0/19 [ℹ] subnets for <region-code>b - public:192.168.32.0/19 private:192.168.128.0/19 [ℹ] subnets for <region-code>c - public:192.168.64.0/19 private:192.168.160.0/19 ... [ℹ] nodegroup "ng-6bcca56a" has 2 node(s) [ℹ] node "ip-192-168-28-68.<region-code>.compute.internal" is ready [ℹ] node "ip-192-168-61-153.<region-code>.compute.internal" is ready [ℹ] waiting for at least 2 node(s) to become ready in "ng-6bcca56a" [ℹ] nodegroup "ng-6bcca56a" has 2 node(s) [ℹ] node "ip-192-168-28-68.<region-code>.compute.internal" is ready [ℹ] node "ip-192-168-61-153.<region-code>.compute.internal" is ready ... [✔] EKS cluster "my-cluster" in "<region-code>" region-code is ready

[ 各 について専用のマネージド型ノードグループを持つクラスターを作成するにはアベイラビリティーゾーン

  1. eksctl 次のコマンドを使用して、ノードグループなしで Amazon EKS クラスターを作成します。詳細については、を参照してください Amazon EKS クラスターの作成。クラスターが作成されたアベイラビリティーゾーンを書き留めます。これらのアベイラビリティーゾーンは、ノードグループを作成するときに使用します。赤い変数テキストは独自の値に置き換えてください。

    eksctl create cluster --name <my-cluster> --version <1.18> --without-nodegroup

    アベイラビリティーゾーン を示す出力部分:

    ... [ℹ] using region <region-code> [ℹ] setting availability zones to [<region-code>a <region-code>c <region-code>b] [ℹ] subnets for <region-code>a - public:192.168.0.0/19 private:192.168.96.0/19 [ℹ] subnets for <region-code>c - public:192.168.32.0/19 private:192.168.128.0/19 [ℹ] subnets for <region-code>b - public:192.168.64.0/19 private:192.168.160.0/19 ... [✔] EKS cluster "my-cluster" in "<region-code>" region is ready

    このクラスターは<region-code>、次の アベイラビリティーゾーン で作成されました: a、<region-code>c、<region-code>b。

  2. クラスター内のアベイラビリティーゾーンごとに、次の eksctl コマンドを使用してノードグループを作成します。<variable text>は独自の値に置き換えてください。このコマンドは、最小数が 1、最大数が 10 の Auto Scaling グループを作成します。

    eksctl create nodegroup --cluster <my-cluster> --node-zones <<region-code>a> --name <<region-code>a> --asg-access --nodes-min <1> --nodes <5> --nodes-max <10> --managed

Cluster Autoscaler ノードグループの考慮事項

Cluster Autoscaler には、このセクションで説明する追加の IAM およびリソースタグ付けに関する考慮事項が必要です。

ノードグループ IAM ポリシー

Cluster Autoscaler では、ユーザーに代わって を呼び出すために、以下のIAMアクセス許可が必要です。AWSAPIs

前述のeksctlコマンドを使用してノードグループを作成した場合、これらのアクセス許可は自動的に提供され、ノードIAMロールにアタッチされます。を使用しなかった場合は、次の ドキュメントを含む eksctl ポリシーを作成し、ノードIAMロールにアタッチする必要があります。IAM詳細については、次のガイドの「ロールの変更」を参照してくださいIAM ユーザーガイド

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "autoscaling:DescribeAutoScalingGroups", "autoscaling:DescribeAutoScalingInstances", "autoscaling:DescribeLaunchConfigurations", "autoscaling:DescribeTags", "autoscaling:SetDesiredCapacity", "autoscaling:TerminateInstanceInAutoScalingGroup", "ec2:DescribeLaunchTemplateVersions" ], "Resource": "*", "Effect": "Allow" } ] }

Auto Scaling グループタグ

Cluster Auto Scaling では、自動検出できるように、ノードグループ Auto Scaling グループに以下のタグが必要です。

前述の eksctl コマンドを使用してノードグループを作成した場合、これらのタグは自動的に適用されます。そうでない場合は、Auto Scaling グループに以下のタグを手動でタグ付けする必要があります。詳細については、次のガイドの「Amazon EC2 リソースにタグを付ける」を参照してくださいLinux インスタンス用 Amazon EC2 ユーザーガイド

キー

k8s.io/cluster-autoscaler/<cluster-name>

owned

k8s.io/cluster-autoscaler/enabled

true

Cluster Auto Scaling をデプロイする

Cluster Auto Scaling をデプロイするには

  1. クラスターがあるリージョンに該当するオプションを入力して、クラスターにマニフェストを適用します。

    • 中国 (寧夏)または 以外のすべてのリージョン中国 (北京)

      kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
    • [中国 (寧夏)] または [中国 (北京)]

      1. 次のコマンドを使って、 マニフェストをダウンロードします。

        curl -o cluster-autoscaler-autodiscover.yaml https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
      2. マニフェストを変更します。

        1. ダウンロードしたマニフェストファイルを表示し、イメージの名前をメモします。以下のコマンドを使用して、イメージをローカルにダウンロードします。

          docker pull image:<tag>
        2. 以下のコマンドを使用して、中国の Amazon Elastic Container Registry リポジトリにプッシュするイメージにタグを付けます。

          docker tag image:<tag> <aws_account_id>.dkr.ecr.<cn-north-1>.amazonaws.com/image:<tag>
        3. 以下のコマンドを使用して、中国の Amazon ECR リポジトリにイメージをプッシュします。

          docker push image:<tag> <aws_account_id>.dkr.ecr.<cn-north-1>.amazonaws.com/image:<tag>
        4. お客様のリージョンの Amazon ECR イメージ URL を参照するように、Kubernetes マニフェストファイルを更新します。

      3. マニフェストを適用します。

        kubectl apply -f cluster-autoscaler-autodiscover.yaml
  2. 次のコマンドを使用して、デプロイに cluster-autoscaler.kubernetes.io/safe-to-evict 注釈を追加します。

    kubectl -n kube-system annotate deployment.apps/cluster-autoscaler cluster-autoscaler.kubernetes.io/safe-to-evict="false"
  3. 次のコマンドを使用して Cluster Autoscaler デプロイを編集します。

    kubectl -n kube-system edit deployment.apps/cluster-autoscaler

    cluster-autoscaler コンテナコマンドを編集して、<YOUR CLUSTER NAME> をクラスターの名前に置き換え、以下のオプションを追加します。

    • <--balance-similar-node-groups>

    • <--skip-nodes-with-system-pods=false>

    spec: containers: - command: - ./cluster-autoscaler - --v=4 - --stderrthreshold=info - --cloud-provider=aws - --skip-nodes-with-local-storage=false - --expander=least-waste - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/<<YOUR CLUSTER NAME>> - <--balance-similar-node-groups> - <--skip-nodes-with-system-pods=false>

    ファイルを保存して閉じ、変更を適用します。

  4. ウェブブラウザで Cluster Autoscaler リリースページを開き、クラスターの Kubernetes メジャーバージョンとマイナーバージョンに一致する最新の Cluster Autoscaler バージョンを見つけます。たとえば、クラスターの Kubernetes バージョンが 1.18 である場合、1.18 で始まる最新の Cluster Autoscaler リリースを見つけます。次のステップで使用するために、そのリリースのセマンティックバージョン番号 (1.18.<n>) を記録します。

  5. 次のコマンドを使用して、Cluster Autoscaler イメージタグを、前のステップで書き留めたバージョンに設定します。1.15.n独自の値に置き換えます。us は、asia または eu に置き換えることができます。

    kubectl -n kube-system set image deployment.apps/cluster-autoscaler cluster-autoscaler=<us>.gcr.io/k8s-artifacts-prod/autoscaling/cluster-autoscaler:v<1.15.n>
    注記

    必要とするバージョンによっては、以前のアドレスを gcr.io/google-containers/cluster-autoscaler:v1.<n.n> に変更する必要があります。イメージアドレスは、リリースページに一覧表示されています。

Cluster Autoscaler ログを表示する

Cluster Autoscaler をデプロイしたら、ログを表示してクラスターの負荷をモニタリングしていることを確認できます。

次のコマンドを使用して Cluster Autoscaler ログを表示します。

kubectl -n kube-system logs -f deployment.apps/cluster-autoscaler

出力:

I0926 23:15:55.165842 1 static_autoscaler.go:138] Starting main loop I0926 23:15:55.166279 1 utils.go:595] No pod using affinity / antiaffinity found in cluster, disabling affinity predicate for this loop I0926 23:15:55.166293 1 static_autoscaler.go:294] Filtering out schedulables I0926 23:15:55.166330 1 static_autoscaler.go:311] No schedulable pods I0926 23:15:55.166338 1 static_autoscaler.go:319] No unschedulable pods I0926 23:15:55.166345 1 static_autoscaler.go:366] Calculating unneeded nodes I0926 23:15:55.166357 1 utils.go:552] Skipping ip-192-168-3-111.<region-code>.compute.internal - node group min size reached I0926 23:15:55.166365 1 utils.go:552] Skipping ip-192-168-71-83.<region-code>.compute.internal - node group min size reached I0926 23:15:55.166373 1 utils.go:552] Skipping ip-192-168-60-191.<region-code>.compute.internal - node group min size reached I0926 23:15:55.166435 1 static_autoscaler.go:393] Scale down status: unneededOnly=false lastScaleUpTime=2019-09-26 21:42:40.908059094 ... I0926 23:15:55.166458 1 static_autoscaler.go:403] Starting scale down I0926 23:15:55.166488 1 scale_down.go:706] No candidates for scale down