Terraform を使用して Azure Kubernetes Service で Kubernetes クラスターを作成するCreate a Kubernetes cluster with Azure Kubernetes Service using Terraform

Azure Kubernetes Service (AKS) では、ホストされている Kubernetes 環境を管理します。Azure Kubernetes Service (AKS) manages your hosted Kubernetes environment. AKS では、コンテナー オーケストレーションの専門知識がなくても、コンテナー化されたアプリケーションをデプロイして管理できます。AKS allows you to deploy and manage containerized applications without container orchestration expertise. また、AKS を使用すると、アプリをオフラインにすることなく、多くの一般的なメンテナンス操作を実行できます。AKS also enables you to do many common maintenance operations without taking your app offline. これらの操作には、必要に応じたリソースのプロビジョニング、アップグレード、スケーリングなどが含まれます。These operations include provisioning, upgrading, and scaling resources on demand.

この記事では、次のタスクを行う方法について説明します。In this article, you learn how to do the following tasks:

  • HCL (HashiCorp 言語) を使用した Kubernetes クラスターの定義Use HCL (HashiCorp Language) to define a Kubernetes cluster
  • AKS と Terraform を使用した Kubernetes クラスターの作成Use Terraform and AKS to create a Kubernetes cluster
  • kubectl ツールを使用した Kubernetes クラスターの可用性のテストUse the kubectl tool to test the availability of a Kubernetes cluster

前提条件Prerequisites

  • Azure サブスクリプション: Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。Azure subscription: If you don't have an Azure subscription, create a free account before you begin.

ディレクトリ構造を作成するCreate the directory structure

最初の手順では、演習のために、Terraform 構成ファイルを保持するディレクトリを作成します。The first step is to create the directory that holds your Terraform configuration files for the exercise.

  1. Azure ポータルにアクセスします。Browse to the Azure portal.

  2. Azure Cloud Shell を開きます。Open Azure Cloud Shell. 前に環境を選択しなかった場合、環境として Bash を選択します。If you didn't select an environment previously, select Bash as your environment.

    Cloud Shell のプロンプト

  3. ディレクトリを clouddrive ディレクトリに変更します。Change directories to the clouddrive directory.

    cd clouddrive
    
  4. terraform-aks-k8s という名前のディレクトリを作成します。Create a directory named terraform-aks-k8s.

    mkdir terraform-aks-k8s
    
  5. 新しいディレクトリに移動します。Change directories to the new directory:

    cd terraform-aks-k8s
    

Azure プロバイダーを宣言するDeclare the Azure provider

Azure プロバイダーを宣言する Terraform 構成ファイルを作成します。Create the Terraform configuration file that declares the Azure provider.

  1. Cloud Shell で、main.tf という名前のファイルを作成します。In Cloud Shell, create a file named main.tf.

    code main.tf
    
  2. 以下のコードをエディターに貼り付けます。Paste the following code into the editor:

    provider "azurerm" {
        # The "feature" block is required for AzureRM provider 2.x. 
        # If you are using version 1.x, the "features" block is not allowed.
        version = "~>2.0"
        features {}
    }
    
    terraform {
        backend "azurerm" {}
    }
    
  3. ファイルを保存し ( <Ctrl> + S キー)、エディターを終了します ( <Ctrl> + Q キー)。Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Kubernetes クラスターを定義するDefine a Kubernetes cluster

Kubernetes クラスターのリソースを宣言する Terraform 構成ファイルを作成します。Create the Terraform configuration file that declares the resources for the Kubernetes cluster.

  1. Cloud Shell で、k8s.tf という名前のファイルを作成します。In Cloud Shell, create a file named k8s.tf.

    code k8s.tf
    
  2. 以下のコードをエディターに貼り付けます。Paste the following code into the editor:

    resource "azurerm_resource_group" "k8s" {
        name     = var.resource_group_name
        location = var.location
    }
    
    resource "random_id" "log_analytics_workspace_name_suffix" {
        byte_length = 8
    }
    
    resource "azurerm_log_analytics_workspace" "test" {
        # 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}"
        location            = var.log_analytics_workspace_location
        resource_group_name = azurerm_resource_group.k8s.name
        sku                 = var.log_analytics_workspace_sku
    }
    
    resource "azurerm_log_analytics_solution" "test" {
        solution_name         = "ContainerInsights"
        location              = azurerm_log_analytics_workspace.test.location
        resource_group_name   = azurerm_resource_group.k8s.name
        workspace_resource_id = azurerm_log_analytics_workspace.test.id
        workspace_name        = azurerm_log_analytics_workspace.test.name
    
        plan {
            publisher = "Microsoft"
            product   = "OMSGallery/ContainerInsights"
        }
    }
    
    resource "azurerm_kubernetes_cluster" "k8s" {
        name                = var.cluster_name
        location            = azurerm_resource_group.k8s.location
        resource_group_name = azurerm_resource_group.k8s.name
        dns_prefix          = var.dns_prefix
    
        linux_profile {
            admin_username = "ubuntu"
    
            ssh_key {
                key_data = file(var.ssh_public_key)
            }
        }
    
        default_node_pool {
            name            = "agentpool"
            node_count      = var.agent_count
            vm_size         = "Standard_D2_v2"
        }
    
        service_principal {
            client_id     = var.client_id
            client_secret = var.client_secret
        }
    
        addon_profile {
            oms_agent {
            enabled                    = true
            log_analytics_workspace_id = azurerm_log_analytics_workspace.test.id
            }
        }
    
        network_profile {
        load_balancer_sku = "Standard"
        network_plugin = "kubenet"
        }
    
        tags = {
            Environment = "Development"
        }
    }
    

    上記のコードでは、クラスター名前、場所、およびリソース グループ名が設定されます。The preceding code sets the name of the cluster, location, and the resource group name. 完全修飾ドメイン名 (FQDN) のプレフィックスも設定されます。The prefix for the fully qualified domain name (FQDN) is also set. FQDN は、クラスターへのアクセスに使用されます。The FQDN is used to access the cluster.

    linux_profile レコードを使用すると、SSH を使用してワーカー ノードにサインインできる設定を構成できます。The linux_profile record allows you to configure the settings that enable signing into the worker nodes using SSH.

    AKS では、ワーカー ノードのみについて課金されます。With AKS, you pay only for the worker nodes. default_node_pool レコードでは、これらのワーカー ノードの詳細を構成します。The default_node_pool record configures the details for these worker nodes. default_node_pool record には、作成するワーカー ノードの数とワーカー ノードの種類が含まれます。The default_node_pool record includes the number of worker nodes to create and the type of worker nodes. 将来、クラスターをスケールアップまたはスケールダウンする必要がある場合は、このレコードの count 値を変更します。If you need to scale up or scale down the cluster in the future, you modify the count value in this record.

  3. ファイルを保存し ( <Ctrl> + S キー)、エディターを終了します ( <Ctrl> + Q キー)。Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

変数を宣言するDeclare the variables

  1. Cloud Shell で、variables.tf という名前のファイルを作成します。In Cloud Shell, create a file named variables.tf.

    code variables.tf
    
  2. 以下のコードをエディターに貼り付けます。Paste the following code into the editor:

    variable "client_id" {}
    variable "client_secret" {}
    
    variable "agent_count" {
        default = 3
    }
    
    variable "ssh_public_key" {
        default = "~/.ssh/id_rsa.pub"
    }
    
    variable "dns_prefix" {
        default = "k8stest"
    }
    
    variable cluster_name {
        default = "k8stest"
    }
    
    variable resource_group_name {
        default = "azure-k8stest"
    }
    
    variable location {
        default = "Central US"
    }
    
    variable log_analytics_workspace_name {
        default = "testLogAnalyticsWorkspaceName"
    }
    
    # refer https://azure.microsoft.com/global-infrastructure/services/?products=monitor for log analytics available regions
    variable log_analytics_workspace_location {
        default = "eastus"
    }
    
    # refer https://azure.microsoft.com/pricing/details/monitor/ for log analytics pricing 
    variable log_analytics_workspace_sku {
        default = "PerGB2018"
    }
    
  3. ファイルを保存し ( <Ctrl> + S キー)、エディターを終了します ( <Ctrl> + Q キー)。Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Terraform 出力ファイルを作成するCreate a Terraform output file

Terraform 出力によって、Terraform がプランを適用するときユーザーに対して強調表示される値を定義できます。これは、terraform output コマンドを使用してクエリできます。Terraform outputs allow you to define values that will be highlighted to the user when Terraform applies a plan, and can be queried using the terraform output command. このセクションでは、kubectl を使用したクラスターへのアクセスを許可する出力ファイルを作成します。In this section, you create an output file that allows access to the cluster with kubectl.

  1. Cloud Shell で、output.tf という名前のファイルを作成します。In Cloud Shell, create a file named output.tf.

    code output.tf
    
  2. 以下のコードをエディターに貼り付けます。Paste the following code into the editor:

    output "client_key" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.client_key
    }
    
    output "client_certificate" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.client_certificate
    }
    
    output "cluster_ca_certificate" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.cluster_ca_certificate
    }
    
    output "cluster_username" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.username
    }
    
    output "cluster_password" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.password
    }
    
    output "kube_config" {
        value = azurerm_kubernetes_cluster.k8s.kube_config_raw
    }
    
    output "host" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.host
    }
    
  3. ファイルを保存し ( <Ctrl> + S キー)、エディターを終了します ( <Ctrl> + Q キー)。Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Terraform 状態を保存する Azure Storage をセットアップするSet up Azure storage to store Terraform state

Terraform は terraform.tfstate ファイルを介して状態をローカルで追跡します。Terraform tracks state locally via the terraform.tfstate file. このパターンは 1 名の環境に適しています。This pattern works well in a single-person environment. マルチユーザー環境では、状態の追跡に Azure ストレージが使用されます。In a multi-person environment, Azure storage is used to track state.

このセクションでは、次のタスクを実行する方法を説明します。In this section, you see how to do the following tasks:

  • ストレージ アカウント情報 (アカウント名とアカウント キー) を取得しますRetrieve storage account information (account name and account key)
  • Terraform 状態の情報を格納するストレージ コンテナーを作成します。Create a storage container into which Terraform state information will be stored.
  1. Azure Portal の左側のメニューで [すべてのサービス] を選択します。In the Azure portal, select All services in the left menu.

  2. [ストレージ アカウント] を選択します。Select Storage accounts.

  3. [ストレージ アカウント] タブで、Terraform が状態を格納するストレージ アカウントの名前を選択します。On the Storage accounts tab, select the name of the storage account into which Terraform is to store state. たとえば、最初に Cloud Shell を開いたときに作成したストレージ アカウントを使用できます。For example, you can use the storage account created when you opened Cloud Shell the first time. 通常、Cloud Shell によって作成されたストレージ アカウント名は、cs の後に数字と文字のランダムな文字列が続きます。The storage account name created by Cloud Shell typically starts with cs followed by a random string of numbers and letters. 選択したストレージ アカウントをメモしておきます。Take note of the storage account you select. この値は後で必要になります。This value is needed later.

  4. [ストレージ アカウント] タブで [アクセス キー] を選択します。On the storage account tab, select Access keys.

    ストレージ アカウント メニュー

  5. key1[キー] 値をメモします。Make note of the key1 key value. (キーの右側にあるアイコンを選択すると、値がクリップボードにコピーされます。)(Selecting the icon to the right of the key copies the value to the clipboard.)

    ストレージ アカウントのアクセス キー

  6. Cloud Shell で、Azure ストレージ アカウントでコンテナーを作成します。In Cloud Shell, create a container in your Azure storage account. プレースホルダーをご使用の環境の適切な値に置き換えます。Replace the placeholders with appropriate values for your environment.

    az storage container create -n tfstate --account-name <YourAzureStorageAccountName> --account-key <YourAzureStorageAccountKey>
    

Kubernetes クラスターを作成するCreate the Kubernetes cluster

このセクションでは、terraform init コマンドを使用して、前のセクションで作成した構成ファイルに定義されているリソースを作成する方法を学びます。In this section, you see how to use the terraform init command to create the resources defined in the configuration files you created in the previous sections.

  1. Cloud Shell で、Terraform を初期化します。In Cloud Shell, initialize Terraform. プレースホルダーをご使用の環境の適切な値に置き換えます。Replace the placeholders with appropriate values for your environment.

    terraform init -backend-config="storage_account_name=<YourAzureStorageAccountName>" -backend-config="container_name=tfstate" -backend-config="access_key=<YourStorageAccountAccessKey>" -backend-config="key=codelab.microsoft.tfstate" 
    

    terraform init コマンドによって、バックエンドおよびプロバイダー プラグインの初期化が成功したことが示されます。The terraform init command displays the success of initializing the backend and provider plug-in:

    "terraform init" の結果例

  2. サービス プリンシパルの資格情報をエクスポートします。Export your service principal credentials. プレースホルダーをご使用のサービス プリンシパルの適切な値に置き換えます。Replace the placeholders with appropriate values from your service principal.

    export TF_VAR_client_id=<service-principal-appid>
    export TF_VAR_client_secret=<service-principal-password>
    
  3. terraform plan コマンドを実行して、インフラストラクチャ要素を定義する Terraform プランを作成します。Run the terraform plan command to create the Terraform plan that defines the infrastructure elements.

    terraform plan -out out.plan
    

    terraform plan コマンドによって、terraform apply コマンドを実行したときに作成されるリソースが表示されます。The terraform plan command displays the resources that will be created when you run the terraform apply command:

    "terraform plan" の結果例

  4. terraform apply コマンドを実行して、プランを適用し、Kubernetes クラスターを作成します。Run the terraform apply command to apply the plan to create the Kubernetes cluster. Kubernetes クラスターを作成するプロセスに数分間かかり、Cloud Shell セッションがタイムアウトになる場合があります。Cloud Shell セッションがタイムアウトした場合は、「Cloud Shell タイムアウトから復旧する」セクションの手順に従ってプロセスを完了できます。The process to create a Kubernetes cluster can take several minutes, resulting in the Cloud Shell session timing out. If the Cloud Shell session times out, you can follow the steps in the section "Recover from a Cloud Shell timeout" to enable you to complete the process.

    terraform apply out.plan
    

    terraform apply コマンドによって、構成ファイルに定義されたリソースの作成結果が表示されます。The terraform apply command displays the results of creating the resources defined in your configuration files:

    "terraform apply" の結果例

  5. Azure portal で、左側のメニューの [すべてのリソース] を選択すると、新しい Kubernetes クラスターに対して作成されたリソースが表示されます。In the Azure portal, select All resources in the left menu to see the resources created for your new Kubernetes cluster.

    Azure portal の [すべてのリソース]

Cloud Shell タイムアウトから復旧するRecover from a Cloud Shell timeout

Cloud Shell セッションがタイムアウトした場合は、次の手順を実行して復旧できます。If the Cloud Shell session times out, you can do the following steps to recover:

  1. Cloud Shell セッションを開始します。Start a Cloud Shell session.

  2. Terraform 構成ファイルを含むディレクトリに移動します。Change to the directory containing your Terraform configuration files.

    cd /clouddrive/terraform-aks-k8s
    
  3. 次のコマンドを実行します。Run the following command:

    export KUBECONFIG=./azurek8s
    

Kubernetes クラスターをテストするTest the Kubernetes cluster

Kubernetes ツールを使用して、新しく作成したクラスターを確認できます。The Kubernetes tools can be used to verify the newly created cluster.

  1. Terraform 状態から Kubernetes 構成を取得し、kubectl が読み取れるファイルに格納します。Get the Kubernetes configuration from the Terraform state and store it in a file that kubectl can read.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  2. kubectl が正しい構成を選択できるように環境変数を設定します。Set an environment variable so that kubectl picks up the correct config.

    export KUBECONFIG=./azurek8s
    
  3. クラスターの正常性を確認します。Verify the health of the cluster.

    kubectl get nodes
    

    ワーカー ノードの詳細を確認してください。次の図のように、すべてのステータスが Ready になっている必要があります。You should see the details of your worker nodes, and they should all have a status Ready, as shown in the following image:

    kubectl ツールを使用すると Kubernetes クラスターの正常性を確認できる

正常性の監視とログMonitor health and logs

AKS クラスターが作成されたとき、クラスター ノードとポッドの両方の正常性メトリックを取得するための監視が有効になりました。When the AKS cluster was created, monitoring was enabled to capture health metrics for both the cluster nodes and pods. これらの正常性メトリックは、Azure portal で利用できます。These health metrics are available in the Azure portal. コンテナーの正常性の監視の詳細については、Azure Kubernetes Service の正常性の監視に関するページを参照してください。For more information on container health monitoring, see Monitor Azure Kubernetes Service health.

トラブルシューティングTroubleshooting

Terraform 固有のサポートについては、HashiCorp の Terraform へのコミュニティ サポート チャネルのいずれかをご利用ください。For Terraform-specific support, use one of HashiCorp's community support channels to Terraform:

次のステップNext steps