ご利用の前に

制限事項

現在、対応可能なバージョンは、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をインストール

Cluster Autoscalerをインストールする際、現在インストールしようとするClusterのバージョンに合わせてインストールを行う必要があります。 Kubernetes Version別に対応するバージョンは、次の通りです。

Kubernetes Version CA Version
1.17.11 Not supported
1.12.7 1.12.7-beta-201909190000

更に、--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

に対する検索結果は~件です。 ""

    に対する検索結果がありません。 ""

    処理中...