zaki work log

作業ログやら生活ログやらなんやら

[Azure / AKS] ノードのスケーリング

B2sの2ノード構成のクラスタのノードを増やしたり、B2msインスタンスタイプのノードを追加したり。

$ az aks create \
  --resource-group sample-rg \
  --name sample-cluster \
  --node-count 2 \
  --node-vm-size Standard_B2s \
  --generate-ssh-keys

こんなんで作ったクラスタ

[zaki@cloud-dev ~]$ kc get node
NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-27260109-vmss000000   Ready    agent   4m45s   v1.16.13
aks-nodepool1-27260109-vmss000001   Ready    agent   4m42s   v1.16.13
[zaki@cloud-dev ~]$ kc describe node | grep -A7 Allocatable:
Allocatable:
  attachable-volumes-azure-disk:  4
  cpu:                            1900m
  ephemeral-storage:              119716768775
  hugepages-1Gi:                  0
  hugepages-2Mi:                  0
  memory:                         2200492Ki
  pods:                           110
--
Allocatable:
  attachable-volumes-azure-disk:  4
  cpu:                            1900m
  ephemeral-storage:              119716768775
  hugepages-1Gi:                  0
  hugepages-2Mi:                  0
  memory:                         2200496Ki
  pods:                           110

B2MS自体はメモリ4GBなんだけど、クラスタで使用できるメモリは半分くらいなんだよね。

ノードのスケールアウト

docs.microsoft.com

ノードプール名を取得

az aks show --resource-group myResourceGroup --name myAKSCluster --query agentPoolProfiles

実行例

[zaki@cloud-dev ~]$ az aks show --resource-group sample-rg --name sample-cluster --query agentPoolProfiles
[
  {
    "availabilityZones": null,
    "count": 2,
    "enableAutoScaling": null,
    "enableNodePublicIp": false,
    "maxCount": null,
    "maxPods": 110,
    "minCount": null,
    "mode": "System",
    "name": "nodepool1",
    "nodeLabels": {},
    "nodeTaints": null,
    "orchestratorVersion": "1.16.13",
    "osDiskSizeGb": 128,
    "osType": "Linux",
    "provisioningState": "Succeeded",
    "scaleSetEvictionPolicy": null,
    "scaleSetPriority": null,
    "spotMaxPrice": null,
    "tags": null,
    "type": "VirtualMachineScaleSets",
    "vmSize": "Standard_B2s"
  }
]

1個しか無いんで、nameまで指定して一発で取ろうと思えば取れる。
複数ある場合はリスト出力される。

[zaki@cloud-dev ~]$ az aks show --resource-group sample-rg --name sample-cluster --query agentPoolProfiles[].name
[
  "nodepool1"
]

スケーリング

リソースグループ名、クラスタ名、ノードプール名を指定して実行

az aks scale --resource-group myResourceGroup --name myAKSCluster --node-count 1 --nodepool-name <your node pool name>

実行例

[zaki@cloud-dev ~]$ az aks scale --resource-group sample-rg --name sample-cluster --node-count 3 --nodepool-name nodepool1
{- Finished ..
  "aadProfile": null,
  "addonProfiles": {
    "KubeDashboard": {
      "config": null,
      "enabled": true,
      "identity": null
    }
  },
  "agentPoolProfiles": [
    {
      "availabilityZones": null,
      "count": 3,
      "enableAutoScaling": null,
      "enableNodePublicIp": false,
      "maxCount": null,

:
:
[zaki@cloud-dev ~]$ kc get node
NAME                                STATUS   ROLES   AGE   VERSION
aks-nodepool1-27260109-vmss000000   Ready    agent   17m   v1.16.13
aks-nodepool1-27260109-vmss000001   Ready    agent   17m   v1.16.13
aks-nodepool1-27260109-vmss000002   Ready    agent   85s   v1.16.13

3ノードになりました。

ノードのスケールアップ

は出来ないというか、クラスタに参加済みのノード自体のインスタンスタイプを変更は出来ないので、「ご所望のインスタンスタイプのノードプールを新規追加」する。EKSと一緒ですね。

今、1ノード2GB強のメモリが使用できるB2sの3ノード構成なので、例えばrequest 2GiBなpodだと乗せるのが困難なので、B2msのノードを追加してみる。

docs.microsoft.com

ノードプールの追加

B2msタイプの1ノードのノードプールを追加する。

az aks nodepool add \
    --resource-group sample-rg \
    --cluster-name sample-cluster \
    --name b2msng \
    --node-count 1 \
    --node-vm-size Standard_B2ms
[zaki@cloud-dev ~]$ kc get node
NAME                                STATUS   ROLES   AGE   VERSION
aks-b2msng-27260109-vmss000000      Ready    agent   39s   v1.16.13
aks-nodepool1-27260109-vmss000000   Ready    agent   32m   v1.16.13
aks-nodepool1-27260109-vmss000001   Ready    agent   32m   v1.16.13
aks-nodepool1-27260109-vmss000002   Ready    agent   16m   v1.16.13

この通り。

[zaki@cloud-dev ~]$ kc describe node | grep -A7 Allocatable:
Allocatable:
  attachable-volumes-azure-disk:  4
  cpu:                            1900m
  ephemeral-storage:              119716768775
  hugepages-1Gi:                  0
  hugepages-2Mi:                  0
  memory:                         5490608Ki
  pods:                           110
--
Allocatable:
  attachable-volumes-azure-disk:  4
  cpu:                            1900m
  ephemeral-storage:              119716768775
  hugepages-1Gi:                  0
  hugepages-2Mi:                  0
  memory:                         2200492Ki
  pods:                           110
--
Allocatable:
  attachable-volumes-azure-disk:  4
  cpu:                            1900m
  ephemeral-storage:              119716768775
  hugepages-1Gi:                  0
  hugepages-2Mi:                  0
  memory:                         2200496Ki
  pods:                           110
--
Allocatable:
  attachable-volumes-azure-disk:  4
  cpu:                            1900m
  ephemeral-storage:              119716768775
  hugepages-1Gi:                  0
  hugepages-2Mi:                  0
  memory:                         2200496Ki
  pods:                           110

(参考)VMインスタンスタイプ

zaki-hmkc.hatenablog.com

[zaki@cloud-dev ~]$ az vm list-sizes --location eastus --query '[].name'
[
  "Standard_B1ls",
  "Standard_B1ms",
  "Standard_B1s",
  "Standard_B2ms",
  "Standard_B2s",
  "Standard_B4ms",

ノードプールの削除 (失敗)

というわけで今、B2sのnodepool1と、B2msのb2msngの2プールがある状態。

[zaki@cloud-dev ~]$ az aks show --resource-group sample-rg --name sample-cluster --query agentPoolProfiles[].name
[
  "b2msng",
  "nodepool1"
]
[zaki@cloud-dev ~]$ az aks nodepool list --cluster-name sample-cluster --resource-group sample-rg --query '[].name'
[
  "b2msng",
  "nodepool1"
]

B2msを残してB2s(nodepool1)を削除するにはaz aks nodepool deleteを実行

[zaki@cloud-dev ~]$ az aks nodepool delete --resource-group sample-rg --cluster-name sample-cluster --name nodepool1
Operation failed with status: 'Bad Request'. Details: There has to be at least one system agent pool.

おや、、、

[zaki@cloud-dev ~]$ az aks nodepool add --help

Command
    az aks nodepool add : Add a node pool to the managed Kubernetes cluster.

Arguments

[...]

    --mode                            : The mode for a node pool which defines a node pool's primary
                                        function. If set as "System", AKS prefers system pods
                                        scheduling to node pools with mode `System`. Learn more at
                                        https://aka.ms/aks/nodepool/mode.  Allowed values: System,
                                        User.  Default: User.

なるほど、これか!

つまり、デフォルトで作成されたnodepool1はSystemノードプールで、追加で作成したb2msngは(未指定なので)Userノードプール。
そして、クラスタ上には最低一つのSystemノードプールが必要なので、現在唯一Systemノードプールであるnodepool1は削除できない、と。

[zaki@cloud-dev ~]$ az aks nodepool list --cluster-name sample-cluster --resource-group sample-rg --query '[].[name,mode]'
[
  [
    "b2msng",
    "User"
  ],
  [
    "nodepool1",
    "System"
  ]
]

ノードプールのモード変更

[zaki@cloud-dev ~]$ az aks nodepool update --resource-group sample-rg --cluster-name sample-cluster --name b2msng --mode System
{- Finished ..
  "agentPoolType": "VirtualMachineScaleSets",
  "availabilityZones": null,
  "count": 1,
  "enableAutoScaling": null,
  "enableNodePublicIp": false,
  "id": "/subscriptions/****-****/resourcegroups/sample-rg/providers/Microsoft.ContainerService/managedClusters/sample-cluster/agentPools/b2msng",
  "maxCount": null,
  "maxPods": 110,
  "minCount": null,
  "mode": "System",
  "name": "b2msng",
  "nodeLabels": {},
  "nodeTaints": null,
  "orchestratorVersion": "1.16.13",
  "osDiskSizeGb": 128,
  "osType": "Linux",
  "provisioningState": "Succeeded",
  "resourceGroup": "sample-rg",
  "scaleSetEvictionPolicy": null,
  "scaleSetPriority": null,
  "spotMaxPrice": null,
  "tags": null,
  "type": "Microsoft.ContainerService/managedClusters/agentPools",
  "vmSize": "Standard_B2ms",
  "vnetSubnetId": null
}

この通り、systemノードプールに変更された。

[zaki@cloud-dev ~]$ az aks nodepool list --cluster-name sample-cluster --resource-group sample-rg --query '[].[name,mode]'
[
  [
    "b2msng",
    "System"
  ],
  [
    "nodepool1",
    "System"
  ]
]

ノードプール削除

[zaki@cloud-dev ~]$ az aks nodepool delete --resource-group sample-rg --cluster-name sample-cluster --name nodepool1
[zaki@cloud-dev ~]$ kc get node
NAME                             STATUS   ROLES   AGE   VERSION
aks-b2msng-27260109-vmss000000   Ready    agent   26m   v1.16.13

B2sのノードプールであるnodepool1が削除され、B2msノードのみになりました。


AKSクラスタの作成はこちら。

zaki-hmkc.hatenablog.com