Cluster Autoscaler ご利用ガイド
    • PDF

    Cluster Autoscaler ご利用ガイド

    • PDF

    Article Summary

    Classic環境で利用できます。

    始める前に

    参考

    現在サポートバージョンは Betaバージョンで、機能に次のような制限があります。

    • Multi Node poolは未対応
    • Cluster Autoscaler Versionの自動 Upgradeは未対応
    • Helmを通じたインストールのみ対応

    Kubernetesでは、次の機能によってクラスタを自動で拡張したり、縮小できます。

    Horizontal Pod Autoscalerは、現在 Podが使用中のリソースによって必要な Pod数を増減します。

    Cluster Autoscalerは、クラスタの使用可能なリソースと Podがリクエストするリソース量を比較し、Nodeを増減します。

    2種類の Autoscalerを使用すると、クラスタの負荷に応じて Pod、Node数を自動調整できます。

    このガイドでは、Cluster Autoscalerに関する説明とインストール方法について説明します。

    Cluster Autoscaler

    自動調整方式

    • ユーザーがリクエストした Podのリソース量より現在の Clusterのリソースが不足している場合、ノードが増加
    • 一定時間特定ノードの使用率が低い場合、当該ノードが減少

    Cluster Autoscalerは、現在使用中のリソースベースでは動作しません。
    したがって、Podの負荷がどんなに高くても、リクエストしたリソース量がないと Nodeは増加しません。

    ノード減少の例外

    以下のような場合、ノードの利用率が低くても当該ノードは縮小されません。

    • Controller(例: Deployment StatefulSet ..)によって制御されない場合
    • Local Storageが設定されている場合
    • 他のノードに Podが移動できない場合
    • Annotation "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"が設定されている場合

    より詳しい例外状況については、リンクをご参照ください。

    適用する

    Helmのインストール

    現在のバージョンで Cluster Autoscalerのインストールは Helmを通したインストールのみサポートしているので、Helmがインストールされていない場合は Helmインストールガイドに従って Helmをインストールします。

    Ncloud Repositoryの追加

    Cluster Autoscalerをインストールするために Ncloud Repositoryを追加します。

    $ helm repo add ncloud https://navercloudplatformdeveloper.github.io/helm-charts
    

    Cluster Autoscalerのインストール

    参考

    このガイドは Classic環境で Cluster Autoscalerをインストールする方法を説明します。VPC環境では Ncloud Kubernetes Service(VPC)ガイドをご参照ください。

    注意

    このガイドで提供する Cluster Autoscalerは Classic環境の Ncloud Kubernetes Serviceでのみ使用できます。

    Cluster Autoscalerのインストール時、--versionパラメータを必ず使用して、現在インストールする Clusterのバージョンに合わせてインストールする必要があります。
    Kubernetes Version別にサポートするバージョンは、次の通りです。

    Kubernetes VersionCA Version
    1.17.11Not supported
    1.12.71.12.7-beta-202004200000

    追加で--setオプションを使用してインストールオプションを指定できます。
    現在の Helmにインストールする際にサポートするオプションは、次の通りです。

    オプション説明デフォルト値
    min最小ノード数1
    max最大ノード数3
    $ helm --kubeconfig=$KUBE_CONFIG install ncloud/autoscaler \
    --set min=1 \
    --set max=3 \
    --version [Cluster Autoscaler Version]
    

    正常動作確認

    インストールが正常に完了すると、ConfigMapで現在の Cluster Autoscalerの状態を確認できます。

    $ kubectl --kubeconfig $KUBE_CONFIG get cm cluster-autoscaler-status -o yaml -n kube-system
    
    apiVersion: v1
    data:
      status: |+
        Cluster-autoscaler status at 2019-09-03 08:59:53.84165088 +0000 UTC:
        Cluster-wide:
          Health:      Healthy (ready=1 unready=0 notStarted=0 longNotStarted=0 registered=1 longUnregistered=0)
                       LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                       LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787
          ScaleUp:     NoActivity (ready=1 registered=1)
                       LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                       LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787
          ScaleDown:   NoCandidates (candidates=0)
                       LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                       LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787
    
        NodeGroups:
          Name:        k8s-default-group
          Health:      Healthy (ready=1 unready=0 notStarted=0 longNotStarted=0 registered=1 longUnregistered=0 cloudProviderTarget=1 (minSize=1, maxSize=5))
                       LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                       LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787
          ScaleUp:     NoActivity (ready=1 cloudProviderTarget=1)
                       LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                       LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787
          ScaleDown:   NoCandidates (candidates=0)
                       LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                       LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787
    
    kind: ConfigMap
    metadata:
      annotations:
        cluster-autoscaler.kubernetes.io/last-updated: 2019-09-03 08:59:53.84165088 +0000
          UTC
      creationTimestamp: 2019-09-03T08:59:31Z
      name: cluster-autoscaler-status
      namespace: kube-system
      resourceVersion: "426558451"
      selfLink: /api/v1/namespaces/kube-system/configmaps/cluster-autoscaler-status
      uid: 248a8014-ce29-11e9-8a51-f220cd8c2e67
    

    使用例

    Horizontal Pod Autoscalerと Cluster Autoscalerがインストールされた Clusterに負荷テストを実行して Podと Nodeが増える様子を確認してみましょう。

    Clusterの準備と Metric Serverの正常有無確認

    Nodeが1個の Clusterを作成します。

    $ kubectl --kubeconfig $KUBE_CONFIG get nodes
    
    NAME             STATUS    ROLES     AGE       VERSION
    nks-worker-5uh   Ready     node      3h        v1.12.7
    

    Metrics Serverが正常に動作しているか確認します。

    Metric情報収集まで少し時間がかかることがあります。

    $ kubectl --kubeconfig $KUBE_CONFIG top node
    
    NAME                  CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%
    nks-worker-5uh   94m          4%        1330Mi          36%
    

    適用するを参照して Cluster Autoscalerをインストールします。

    HPA設定と負荷テスト

    HPAの設定や負荷テストは、下記のリンクを参照して php-apacheサーバの起動および表示から負荷増加まで行います。

    Horizontal Pod Autoscalerの練習

    負荷テストを実施すると、以下のように Pod数が自動で増加したことを確認できます。

    例で使用した Clusterの Nodeリソース使用量がすべての Podのリクエスト量より少ないため、まだ Nodeは増加しません。

    参考

    Clusterインストール時に指定した Nodeの仕様によって結果が異なる場合があります。

    $ kubectl --kubeconfig $KUBE_CONFIG get hpa
    
    NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    php-apache   Deployment/php-apache   46%/50%   1         10        5          28m
    
    $ kubectl --kubeconfig $KUBE_CONFIG get pods
    
    NAME                               READY     STATUS    RESTARTS   AGE
    php-apache-f67db78b-2lvww          1/1       Running   0          28m
    php-apache-f67db78b-hbc86          1/1       Running   0          2m
    php-apache-f67db78b-mppcl          1/1       Running   0          2m
    php-apache-f67db78b-pctkv          1/1       Running   0          2m
    php-apache-f67db78b-wr5dh          1/1       Running   0          2m
    

    HPAの設定変更

    Horizontal Pod Autoscalerの cpu上限値を50から20に変更します。

    $ kubectl --kubeconfig $KUBE_CONFIG patch hpa php-apache --patch '{"spec":{"targetCPUUtilizationPercentage":20}}'
    

    Nodeの空き容量が Podのリソースリクエスト量より少ないため、Pending状態の Podが増加します。

    $ kubectl --kubeconfig $KUBE_CONFIG get pods
    
    NAME                               READY     STATUS    RESTARTS   AGE
    php-apache-f67db78b-nz6zq          0/1       Pending   0          3m
    php-apache-f67db78b-x2gr9          0/1       Pending   0          3m
    php-apache-f67db78b-2lvww          1/1       Running   0          41m
    php-apache-f67db78b-hbc86          1/1       Running   0          15m
    php-apache-f67db78b-mppcl          1/1       Running   0          15m
    php-apache-f67db78b-p2q6r          1/1       Running   0          3m
    php-apache-f67db78b-pctkv          1/1       Running   0          15m
    php-apache-f67db78b-r8whp          1/1       Running   0          3m
    php-apache-f67db78b-sjrh7          1/1       Running   0          3m
    php-apache-f67db78b-wr5dh          1/1       Running   0          15m
    

    Node増加

    「ユーザーがリクエストした Podのリソース量より現在の Clusterのリソースが少ない場合、ノードが増加」の条件を満たすことで

    Cluster Autoscalerが動作して現在の Podの追加リクエスト量に応じて必要な Node数 cloudProviderTargetを判断し、現在の Clusterでは追加で必要な Nodeを1台と判断し、全体 Node数を2に増やすようにリクエストします。

    ConfigMapで現在の目標数 cloudProviderTargetを確認できます。

    $ kubectl --kubeconfig $KUBE_CONFIG get cm cluster-autoscaler-status -o yaml -n kube-system
    
    apiVersion: v1
    data:
      status: |+
        Cluster-autoscaler status at 2019-09-03 09:53:35.841671859 +0000 UTC:
        Cluster-wide:
          Health:      Healthy (ready=1 unready=0 notStarted=0 longNotStarted=0 registered=1 longUnregistered=0)
                       LastProbeTime:      2019-09-03 09:53:35.645663163 +0000 UTC m=+276.303106480
                       LastTransitionTime: 2019-09-03 09:49:29.11931241 +0000 UTC m=+29.776755835
          ScaleUp:     InProgress (ready=1 registered=1)
                       LastProbeTime:      2019-09-03 09:53:35.645663163 +0000 UTC m=+276.303106480
                       LastTransitionTime: 2019-09-03 09:50:20.028647773 +0000 UTC m=+80.686091197
          ScaleDown:   NoCandidates (candidates=0)
                       LastProbeTime:      2019-09-03 09:53:35.645663163 +0000 UTC m=+276.303106480
                       LastTransitionTime: 2019-09-03 09:49:29.11931241 +0000 UTC m=+29.776755835
    
        NodeGroups:
          Name:        k8s-default-group
          Health:      Healthy (ready=1 unready=0 notStarted=0 longNotStarted=0 registered=1 longUnregistered=0 cloudProviderTarget=2 (minSize=1, maxSize=5))
                       LastProbeTime:      2019-09-03 09:53:35.645663163 +0000 UTC m=+276.303106480
                       LastTransitionTime: 2019-09-03 09:49:29.11931241 +0000 UTC m=+29.776755835
          ScaleUp:     InProgress (ready=1 cloudProviderTarget=2)
                       LastProbeTime:      2019-09-03 09:53:35.645663163 +0000 UTC m=+276.303106480
                       LastTransitionTime: 2019-09-03 09:50:20.028647773 +0000 UTC m=+80.686091197
          ScaleDown:   NoCandidates (candidates=0)
                       LastProbeTime:      2019-09-03 09:53:35.645663163 +0000 UTC m=+276.303106480
                       LastTransitionTime: 2019-09-03 09:49:29.11931241 +0000 UTC m=+29.776755835
    
    kind: ConfigMap
    metadata:
      annotations:
        cluster-autoscaler.kubernetes.io/last-updated: 2019-09-03 09:53:35.841671859 +0000
          UTC
      creationTimestamp: 2019-09-03T08:59:31Z
      name: cluster-autoscaler-status
      namespace: kube-system
      resourceVersion: "426684212"
      selfLink: /api/v1/namespaces/kube-system/configmaps/cluster-autoscaler-status
      uid: 248a8014-ce29-11e9-8a51-f220cd8c2e67
    

    追加タスクが完了すると、追加された Nodeを確認できます。

    $kubectl --kubeconfig $KUBE_CONFIG get nodes
    
    NAME             STATUS    ROLES     AGE       VERSION
    nks-worker-5uh   Ready     node      3h        v1.12.7
    nks-worker-5ad   Ready     node      32s       v1.12.7
    

    この記事は役に立ちましたか?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.