- 印刷する
- PDF
Cluster Autoscaler ご利用ガイド
- 印刷する
- PDF
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 Version | CA Version |
---|---|
1.17.11 | Not supported |
1.12.7 | 1.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サーバの起動および表示から負荷増加まで行います。
負荷テストを実施すると、以下のように 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