Help us understand the problem. What is going on with this article?

AKS で asp.net core アプリケーション : 自動スケール - クラスターのスケール

前回の記事でポッドの水平スケールを見ていきました。今回はノード側でリソースが不足した場合のノードの自動スケールを見ていきます。

クラスターオートスケーラー

現在のクラスタでホストしきれない数のポッド要求があった場合、AKS ではクラスタノードを自動的に追加することができます。また逆に不要になった場合は自動で縮小します。


参考: クラスターオートスケーラー

ノードプールの追加

今回は既存のクラスタに Web アプリ用のオートスケールするノードプールを追加することにしました。

1. Standard_A1 サイズのノードを追加。

  • 最小台数 1、最大台数 5
  • オートスケールを有効にする
  • Taints として kind=app:NoSchedule を指定
  • 既定のラベルを指定する機能はまだない模様
az aks nodepool add -g netcoresample --cluster-name myaks -n nodepool3 -c 1 --node-vm-size Standard_A1 --enable-cluster-autoscaler --min-count 1 --max-count 5 --node-taints kind=app:NoSchedule

2. ノードプール 1 の台数を縮小。

az aks nodepool scale -g netcoresample --cluster-name myaks --name nodepool1 -c 1

3. ノードプール 1 のノードからラベルとテイントを削除。

kubectl label node aks-nodepool1-23705949-vmss000000 kind-
kubectl taints node aks-nodepool1-23705949-vmss000000 kind-

4. ノードプール 3 のノードの Labels と Taints を確認。

>kubectl describe node aks-nodepool3-23705949-vmss000000
Name:               aks-nodepool3-23705949-vmss000000
Roles:              agent
Labels:             agentpool=nodepool3
                    beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/instance-type=Standard_A1
                    beta.kubernetes.io/os=linux
                    failure-domain.beta.kubernetes.io/region=japaneast
                    failure-domain.beta.kubernetes.io/zone=0
                    kubernetes.azure.com/cluster=MC_netcoresample_myaks_japaneast
                    kubernetes.azure.com/role=agent
                    kubernetes.io/hostname=aks-nodepool3-23705949-vmss000000
                    kubernetes.io/role=agent
                    node-role.kubernetes.io/agent=
                    storageprofile=managed
                    storagetier=Standard_LRS
Annotations:        node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Sun, 24 Nov 2019 23:29:40 +0900
Taints:             kind=app:NoSchedule

5. webapp のポッドが配置待ちになっていることを確認。

>kubectl get pods
NAME                                READY   STATUS              RESTARTS   AGE
core3webapp-b599bd5d-b4ngm          0/1     MatchNodeSelector   0          17d
core3webapp-b599bd5d-g7rqq          0/1     Pending             0          30m
core3webapp-b599bd5d-gwvsc          0/1     MatchNodeSelector   0          17d
core3webapp-b599bd5d-m4ddz          0/1     Pending             0          30m
core3webapp-b599bd5d-qwwth          0/1     Pending             0          30m
core3webapp-b599bd5d-rmm84          0/1     MatchNodeSelector   0          17d
core3webapp-b599bd5d-szgx6          0/1     MatchNodeSelector   0          17d
core3webapp-b599bd5d-wtblp          0/1     Pending             0          30m
mssql-deployment-749f664d67-mv8r4   1/1     Running             1          16d

6. 現在のノードを確認。

>kubectl get nodes
NAME                                STATUS   ROLES   AGE   VERSION
aks-nodepool1-23705949-vmss000000   Ready    agent   23d   v1.13.11
aks-nodepool2-23705949-vmss000000   Ready    agent   23d   v1.13.11
aks-nodepool3-23705949-vmss000000   Ready    agent   21m   v1.13.11

アプリケーションの更新

現在 webapp は selector がマッチするノードがいないため配置できません。こちらを変更します。
また既定のラベルを指定できなかったので、agentpool=nodepool3 を利用します。

1. myapp.yaml の core3webapp デプロイだけ以下のように変更。

  • nodeSelector で agentpool: nodepool3 を指定
  • メモリの最低値を 256 MB に変更
apiVersion: apps/v1
kind: Deployment
metadata:
  name: core3webapp
  labels:
    app: core3webapp
spec:
  replicas: 4
  selector:
    matchLabels:
        app: core3webapp
  template:
    metadata:
      name: core3webapp
      labels:
        app: core3webapp
    spec:
      containers:
      - name: core3webapp
        image: kenakamuacr.azurecr.io/core3webapp:20191029043926
        resources: 
          requests:
            cpu: "250m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "1Gi"
        imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      tolerations:
      - key: "kind"
        operator: "Equal"
        value: "app"
        effect: "NoSchedule"
      nodeSelector:
         agentpool: nodepool3

2. デプロイを実行。

>kubectl apply -f myapp.yaml
storageclass.storage.k8s.io/azure-disk unchanged
persistentvolumeclaim/mssql-data unchanged
secret/mssql unchanged
deployment.apps/mssql-deployment unchanged
service/mssql-deployment unchanged
deployment.apps/core3webapp configured
service/core3webapp unchanged
ingress.extensions/core3webapp unchanged

クラスターオートスケールの確認

最後に、ポッドの要求を現在のノード数では満たせないため、クラスターで自動スケールが発生する様子を確認します。

1. ポッドの状況を確認。

>kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP          NODE                                NOMINATED NODE   READINESS GATES
core3webapp-55c4568d6f-btkmx        0/1     Pending   0          46s   <none>      <none>                              <none>           <none>
core3webapp-55c4568d6f-rxl4q        1/1     Running   0          78s   10.0.0.40   aks-nodepool3-23705949-vmss000000   <none>           <none>
core3webapp-55c4568d6f-thg5w        0/1     Pending   0          78s   <none>      <none>                              <none>           <none>
core3webapp-7f6cb8845-j8f4k         0/1     Pending   0          11m   <none>      <none>                              <none>           <none>
core3webapp-7f6cb8845-rjwxp         0/1     Pending   0          11m   <none>      <none>                              <none>           <none>
mssql-deployment-749f664d67-rmtst   1/1     Running   0          12m   10.0.0.79   aks-nodepool2-23705949-vmss000000   <none>           <none>

2. Azure ポータルよりノードプール 3 のインスタンス状況を確認。
image.png

3. k8s でのノードの状態を確認。クラスター自動スケールで台数が自動的に増加。

>kubectl get nodes
NAME                                STATUS   ROLES   AGE   VERSION
aks-nodepool1-23705949-vmss000000   Ready    agent   23d   v1.13.11
aks-nodepool2-23705949-vmss000000   Ready    agent   23d   v1.13.11
aks-nodepool3-23705949-vmss000000   Ready    agent   50m   v1.13.11
aks-nodepool3-23705949-vmss000001   Ready    agent   76s   v1.13.11
aks-nodepool3-23705949-vmss000002   Ready    agent   49s   v1.13.11

4. ポッドも併せて起動してくることを確認。

>kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
core3webapp-55c4568d6f-5r9r4        0/1     Pending   0          96s
core3webapp-55c4568d6f-btkmx        1/1     Running   0          5m40s
core3webapp-55c4568d6f-rxl4q        1/1     Running   0          6m12s
core3webapp-55c4568d6f-thg5w        1/1     Running   1          6m12s
mssql-deployment-749f664d67-rmtst   1/1     Running   0          17m

5. 最終的に要求したポッドが起動することを確認。

>kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
core3webapp-55c4568d6f-5r9r4        1/1     Running   0          6m7s
core3webapp-55c4568d6f-btkmx        1/1     Running   0          10m
core3webapp-55c4568d6f-rxl4q        1/1     Running   0          10m
core3webapp-55c4568d6f-thg5w        1/1     Running   1          10m
mssql-deployment-749f664d67-rmtst   1/1     Running   0          21m

6. レプリカセット数を減らした場合にノード数が自動的に縮小するか確認。

>kubectl get nodes
NAME                                STATUS     ROLES   AGE   VERSION
aks-nodepool1-23705949-vmss000000   Ready      agent   23d   v1.13.11
aks-nodepool2-23705949-vmss000000   Ready      agent   23d   v1.13.11
aks-nodepool3-23705949-vmss000000   Ready      agent   69m   v1.13.11
aks-nodepool3-23705949-vmss000001   NotReady   agent   20m   v1.13.11
aks-nodepool3-23705949-vmss000003   NotReady   agent   15m   v1.13.11

>kubectl get nodes
NAME                                STATUS   ROLES   AGE   VERSION
aks-nodepool1-23705949-vmss000000   Ready    agent   23d   v1.13.11
aks-nodepool2-23705949-vmss000000   Ready    agent   23d   v1.13.11
aks-nodepool3-23705949-vmss000000   Ready    agent   69m   v1.13.11

自動縮小しない場合

いくつかの条件下では、こちらの記事にあるとおりノードが自動で縮小しません。

  • ポッドが直接作成されており、デプロイやレプリカ セットなどのコントローラー オブジェクトによってサポートされていない。
  • Pod Disruption Budget (PDB) の制限が非常に厳しく、ポッドの数が特定のしきい値を下回ることが許可されていない。
  • ポッドが、別のノードでスケジュールされた場合に適用できないノード セレクターまたはアンチ アフィニティーを使用している。

まとめ

クラスターの自動スケールを使う場合、テイントやラベルをどうするか、また VM のサイズとスケール上限をどうするかなど考えることがいくつかありますが、管理者がわざわざ手動で設定しなくてもいい点はやはり便利です。次回はもう一つの自動スケールである Azure Container Instance (ACI) へのバーストを見ていきます。

次の記事へ
目次へ戻る

参照

参考: クラスターオートスケーラー

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした