LoginSignup
0
0

TerraformでセットアップされたAKSのVMサイズをダウンタイムなしで変更する方法

Last updated at Posted at 2022-11-12

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が作り変えられるので、その間はダウンタイムとなります。本番環境ではこれは受け入れられません。

ダウンタイムなしでデフォルトのノードプールを変更するには、以下の方法で行えます。

  • 新しいノードプールの追加
    image.png
    image.png
    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のコードに変更をかけます。サイズだけ変更した場合は、namevm_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のサイズを頻繁に変更することもないと思われますので十分有効的な手段かと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0