AKSをTerraformでセットアップするとDefault node poolを設定しなければいけません。
システムを運用し始めて、VMのサイズを変更する必要があることも出てきます。
resource "azurerm_kubernetes_cluster" "example" {
name = "example-aks1"
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
dns_prefix = "exampleaks1"
default_node_pool {
name = "default"
node_count = 1
vm_size = "Standard_D2_v2"
os_disk_size_gb =
}
...
}
vm_size - (Required) The size of the Virtual Machine, such as Standard_DS2_v2. Changing this forces a new resource to be created.
こちらに書かれている通り、Sizeの変更をすると新しいリソースが作られます。このまま変更を実行するとNodeが作り変えられるので、その間はダウンタイムとなります。本番環境ではこれは受け入れられません。
ダウンタイムなしでデフォルトのノードプールを変更するには、以下の方法で行えます。
-
新しいノードプールの追加
AKSは少なくとも1つのシステムノードプールが必要ですので、追加するノードプールのモードはシステムとします。 -
古いノードをCordonする
kubectl cordon aks-default-1111-vmss000000
-
Deploymentなどのリスタート
kubectl -n my-app rollout restart deployment my-app
kubectl -n my-app get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-app-e4dfd 1/1 Running 0 1d 172.40.6.11 aks-default-1111-vmss000000 <none> <none>
my-app-se15b 1/1 Running 0 1h 172.40.6.12 aks-newpool-1111-vmss000001 <none> <none>
これで、アプリケーションが新しく作られたノードプールにデプロイされます。
-
古いノードをDrainする
kubectl drain aks-default-1111-vmss000000 --ignore-daemonsets --delete-emptydir-data
-
古いノードプールを削除
Drainが完了すれは、ノードプールを削除します。ポータルからもできますし、コマンドで行う場合は以下のような感じです。
az aks nodepool delete --name <ノードプール名> --cluster-name <クラスター名> --resource-group <リソースグループ>
-
Terraformの編集
最後にTerraformの編集です。
terraform plan
で変更箇所を確認して、Terrformのコードに変更をかけます。サイズだけ変更した場合は、name
とvm_size
だけかもしくは、os_disk_size_gb
を設定していた場合はそれも変更がかかる可能性があります。
resource "azurerm_kubernetes_cluster" "example" {
name = "example-aks1"
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
dns_prefix = "exampleaks1"
default_node_pool {
name = "newpool" # <=====
node_count = 2
vm_size = "Standard_D2_v3" # <=====
}
...
}
再度terraform plan
で変更箇所が出てこなければ完了です。
この方法で行うと、システムのダウンタイムを避けながらTerraformの編集後はTerraformでの管理も続行できます。
実際のノードプールの入れ替えは手作業ですが、VMのサイズを頻繁に変更することもないと思われますので十分有効的な手段かと思います。