次の方法で共有


クイックスタート: Terraform を使用して AKS クラスター用の Azure Linux コンテナー ホストをデプロイする

Azure Linux コンテナー ホスト クラスターをデプロイするために、Terraform を使用する Azure Linux コンテナー ホストの使用を開始します。 前提条件をインストールしたら、Terraform コードを実装し、Terraform を初期化し、Terraform 実行プランを作成して適用します。

Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、およびデプロイを行うことができます。 Terraform では、HCL 構文を使用して構成ファイルを作成します。 HCL 構文を使用すると、クラウド プロバイダーと、クラウド インフラストラクチャを構成する要素を指定できます。 構成ファイルを作成したら、"実行プラン" を作成します。これにより、インフラストラクチャの変更をデプロイ前にプレビューすることができます。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。

注意

この記事のコード例は、Microsoft Terraform GitHub リポジトリにあります。

前提条件

SSH キー ペアの作成

AKS ノードにアクセスするには、ssh-keygen コマンドを使用して生成する SSH キーの組 (公開および秘密) を使用して接続します。 既定では、これらのファイルは ~/.ssh ディレクトリに作成されます。 ssh-keygen コマンドを実行すると、指定した場所に同じ名前の SSH キーの組が既に存在する場合は上書きされます。

  1. https://shell.azure.com にアクセスし、お使いのブラウザーで Cloud Shell を開きます。

  2. ssh-keygen コマンドを実行します。 次の例では、RSA 暗号化と 4096 ビット長を使用して SSH キーの組が作成されます。

    ssh-keygen -t rsa -b 4096
    

SSH キーの作成の詳細については、Azure での認証用の SSH キーの作成と管理に関するページを参照してください。

Terraform コードを実装する

  1. サンプルの Terraform コードをテストするディレクトリを作成し、それを現在のディレクトリにします。

  2. providers.tf という名前のファイルを作成し、次のコードを挿入します。

        terraform {
          required_version = ">=1.0"
    
          required_providers {
            azurerm = {
              source  = "hashicorp/azurerm"
              version = "~>3.0"
            }
            random = {
              source  = "hashicorp/random"
              version = "~>3.0"
            }
          }
        }
    
        provider "azurerm" {
          features {}
        }
    
  3. main.tf という名前のファイルを作成し、次のコードを挿入します。

        # Generate random resource group name
        resource "random_pet" "rg_name" {
          prefix = var.resource_group_name_prefix
        }
    
        resource "azurerm_resource_group" "rg" {
          location = var.resource_group_location
          name     = random_pet.rg_name.id
        }
    
        resource "random_id" "log_analytics_workspace_name_suffix" {
          byte_length = 8
        }
    
        resource "azurerm_log_analytics_workspace" "test" {
          location            = var.log_analytics_workspace_location
          # The WorkSpace name has to be unique across the whole of azure;
          # not just the current subscription/tenant.
          name                = "${var.log_analytics_workspace_name}-${random_id.log_analytics_workspace_name_suffix.dec}"
          resource_group_name = azurerm_resource_group.rg.name
          sku                 = var.log_analytics_workspace_sku
        }
    
        resource "azurerm_log_analytics_solution" "test" {
          location              = azurerm_log_analytics_workspace.test.location
          resource_group_name   = azurerm_resource_group.rg.name
          solution_name         = "ContainerInsights"
          workspace_name        = azurerm_log_analytics_workspace.test.name
          workspace_resource_id = azurerm_log_analytics_workspace.test.id
    
          plan {
            product   = "OMSGallery/ContainerInsights"
            publisher = "Microsoft"
          }
        }
    
        resource "azurerm_kubernetes_cluster" "k8s" {
          location            = azurerm_resource_group.rg.location
          name                = var.cluster_name
          resource_group_name = azurerm_resource_group.rg.name
          dns_prefix          = var.dns_prefix
          tags                = {
            Environment = "Development"
          }
    
          default_node_pool {
            name       = "azurelinuxpool"
            vm_size    = "Standard_D2_v2"
            node_count = var.agent_count
            os_sku = "AzureLinux"
          }
          linux_profile {
            admin_username = "azurelinux"
    
            ssh_key {
              key_data = file(var.ssh_public_key)
            }
          }
          network_profile {
            network_plugin    = "kubenet"
            load_balancer_sku = "standard"
          }
          service_principal {
            client_id     = var.aks_service_principal_app_id
            client_secret = var.aks_service_principal_client_secret
          }
        }
    

    同様に、azurerm_kubernetes_cluster_node_pool で Azure Linux os_sku を指定することもできます。

  4. variables.tf という名前のファイルを作成し、次のコードを挿入します。

        variable "agent_count" {
            default = 3
        }
    
        # The following two variable declarations are placeholder references.
        # Set the values for these variable in terraform.tfvars
        variable "aks_service_principal_app_id" {
          default = ""
        }
    
        variable "aks_service_principal_client_secret" {
          default = ""
        }
    
        variable "cluster_name" {
          default = "k8stest"
        }
    
        variable "dns_prefix" {
          default = "k8stest"
        }
    
        # Refer to https://azure.microsoft.com/global-infrastructure/services/?products=monitor for available Log Analytics regions.
        variable "log_analytics_workspace_location" {
          default = "eastus"
        }
    
        variable "log_analytics_workspace_name" {
          default = "testLogAnalyticsWorkspaceName"
        }
    
        # Refer to https://azure.microsoft.com/pricing/details/monitor/ for Log Analytics pricing
        variable "log_analytics_workspace_sku" {
          default = "PerGB2018"
        }
    
        variable "resource_group_location" {
          default     = "eastus"
          description = "Location of the resource group."
        }
    
        variable "resource_group_name_prefix" {
          default     = "rg"
          description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
        }
    
        variable "ssh_public_key" {
          default = "~/.ssh/id_rsa.pub"
        }
    
  5. outputs.tf という名前のファイルを作成し、次のコードを挿入します。

        output "client_certificate" {
          value     = azurerm_kubernetes_cluster.k8s.kube_config[0].client_certificate
          sensitive = true
        }
    
        output "client_key" {
          value     = azurerm_kubernetes_cluster.k8s.kube_config[0].client_key
          sensitive = true
        }
    
        output "cluster_ca_certificate" {
          value     = azurerm_kubernetes_cluster.k8s.kube_config[0].cluster_ca_certificate
          sensitive = true
        }
    
        output "cluster_password" {
          value     = azurerm_kubernetes_cluster.k8s.kube_config[0].password
          sensitive = true
        }
    
        output "cluster_username" {
          value     = azurerm_kubernetes_cluster.k8s.kube_config[0].username
          sensitive = true
        }
    
        output "host" {
          value     = azurerm_kubernetes_cluster.k8s.kube_config[0].host
          sensitive = true
        }
    
        output "kube_config" {
          value     = azurerm_kubernetes_cluster.k8s.kube_config_raw
          sensitive = true
        }
    
        output "resource_group_name" {
          value = azurerm_resource_group.rg.name
        }
    
  6. terraform.tfvars という名前のファイルを作成し、次のコードを挿入します。

        aks_service_principal_app_id = "<service_principal_app_id>"
        aks_service_principal_client_secret = "<service_principal_password>"
    

Terraform を初期化して実行プランを作成する

  1. Terraform を初期化し、terraform init コマンドを使用して Azure リソースを管理するために必要な Azure モジュールをダウンロードします。

    terraform init
    
  2. terraform plan コマンドを使用して Terraform 実行プランを作成します。

    terraform plan -out main.tfplan
    

    terraform plan コマンドは、実行プランを作成しますが、実行はしません。 代わりに、構成ファイルに指定された構成を作成するために必要なアクションを決定します。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが自分の想定と一致しているかどうかを確認できます。

    省略可能な -out パラメーターを使用すると、プランの出力ファイルを指定できます。 -out パラメーターを使用すると、レビューしたプランが適用内容とまったく同じであることが確実になります。

    永続的な実行プランとセキュリティの詳細について確認するには、「セキュリティの警告」を参照してください。

  3. terraform apply コマンドを使用して Terraform 実行プランを適用します。

    terraform apply main.tfplan
    

    上記の terraform apply コマンドは、以前に terraform plan -out main.tfplan が実行されていることを想定しています。 -out パラメーターに別のファイル名を指定した場合は、terraform apply への呼び出しで同じファイル名を使用します。 -out パラメーターを使用しなかった場合は、パラメーターを指定せずに terraform apply を呼び出します。

結果を確認する

  1. 次の echo コマンドを使用してリソース グループ名を取得します。

    echo "$(terraform output resource_group_name)"
    
  2. Azure ポータルにアクセスします。

  3. Azure サービス[リソース グループ] を選択し、新しいリソース グループを見つけて、このデモで作成された次のリソースを確認します。

    • ソリューション: 既定で、デモではこのソリューションに ContainerInsights という名前が付けられます。 ポータルには、ソリューションのワークスペース名が括弧で囲まれて表示されます。
    • Kubernetes サービス: 既定で、デモではこのサービス k8stest という名前が付けられます。 (マネージド Kubernetes クラスターは、Azure Kubernetes Service または AKS とも呼ばれます。)
    • Log Analytics ワークスペース: 既定で、デモでは、このワークスペースに TestLogAnalyticsWorkspaceName というプレフィックスに乱数を続けた名前を付けます。
  4. Terraform の状態から Kubernetes 構成を取得し、次の echo コマンドを使用して kubectl が読み取れるファイルに保存します。

    echo "$(terraform output kube_config)" > ./azurek8s
    
  5. 次の cat コマンドを使用して、前のコマンドで ASCII EOT 文字が追加されなかったことを確認します。

    cat ./azurek8s
    

    先頭に << EOT、末尾に EOT が表示される場合、ファイルからこれらの文字を削除します。 そうしないと、次のエラー メッセージが表示される場合があります: error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context

  6. 次の export コマンドを使用して kubectl が正しい構成を取得できるように環境変数を設定します。

    export KUBECONFIG=./azurek8s
    
  7. kubectl get nodes コマンドを使用してクラスターの正常性を確認します。

    kubectl get nodes
    

    Azure Linux コンテナー ホスト クラスターが作成されたとき、クラスター ノードとポッドの両方の正常性メトリックをキャプチャするための監視が有効になりました。 これらの正常性メトリックは、Azure portal で利用できます。 コンテナーの正常性の監視の詳細については、Azure Kubernetes Service の正常性の監視に関するページを参照してください。

    Terraform 実行プランを適用したときに、いくつかのキー値が出力されました。 たとえば、ホスト アドレス、Azure Linux コンテナー ホスト クラスターのユーザー名、Azure Linux コンテナー ホスト クラスターのパスワードが出力されます。

    すべての出力値を表示するには、terraform output を実行します。 特定の出力値を表示するには、echo "$(terraform output <output_value_name>)" を実行します。

リソースをクリーンアップする

AKS リソースを削除する

Terraform を使用して作成されたリソースが不要になった場合は、次の手順を使用して削除できます。

  1. terraform plan コマンドを実行し destroy フラグを指定します。

    terraform plan -destroy -out main.destroy.tfplan
    
  2. terraform apply コマンドを使用して実行プランを削除します。

    terraform apply main.destroy.tfplan
    

サービス プリンシパルを削除する

注意事項

このデモで使用したサービス プリンシパルは、他で使用しない場合にのみ削除してください。

  1. az ad sp list コマンドを使用してサービス プリンシパルのオブジェクト ID を取得します

    az ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":id}" --output table
    
  2. az ad sp delete コマンドを使用してサービス プリンシパルを削除します。

    az ad sp delete --id <service_principal_object_id>
    

Azure での Terraform のトラブルシューティング

Azure で Terraform を使用する場合の一般的な問題のトラブルシューティング

次のステップ

このクイックスタートでは、Azure Linux コンテナー ホスト クラスターをデプロイしました。 Azure Linux コンテナー ホストの詳細を確認し、完全なクラスターのデプロイと管理の例を確認するには、続けて Azure Linux コンテナー ホストのチュートリアルに進んでください。