Azure Kubernetes Service および Terraform を使用して Kubernetes クラスターを作成するCreate a Kubernetes cluster with Azure Kubernetes Service and Terraform

Azure Kubernetes Service (AKS) を使用すると、ホストされている Kubernetes 環境を管理できます。これによって、コンテナー オーケストレーションの知識がなくてもコンテナー化されたアプリケーションを迅速かつ簡単にデプロイおよび管理できるようになります。Azure Kubernetes Service (AKS) manages your hosted Kubernetes environment, making it quick and easy to deploy and manage containerized applications without container orchestration expertise. また、アプリケーションをオフラインにすることなく、要求に応じてリソースをプロビジョニング、アップグレード、スケーリングすることにより、実行中の操作およびメンテナンスの負担もなくなります。It also eliminates the burden of ongoing operations and maintenance by provisioning, upgrading, and scaling resources on demand, without taking your applications offline.

このチュートリアルでは、Terraform と AKS を使用して Kubernetes クラスターを作成する際に次のタスクを実行する方法を学びます。In this tutorial, you learn how to perform the following tasks in creating a Kubernetes cluster using Terraform and AKS:

  • 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

ディレクトリ構造を作成する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.

    vi main.tf
    
  2. I キーを選択し、挿入モードに入ります。Enter insert mode by selecting the I key.

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

    provider "azurerm" {
        version = "~>1.5"
    }
    
    terraform {
        backend "azurerm" {}
    }
    
  4. Esc キーを押して、挿入モードを終了します。Exit insert mode by selecting the Esc key.

  5. ファイルを保存し、次のコマンドを入力して vi エディターを終了します。Save the file and exit the vi editor by entering the following command:

    :wq
    

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.

    vi k8s.tf
    
  2. I キーを選択し、挿入モードに入ります。Enter insert mode by selecting the I key.

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

    resource "azurerm_resource_group" "k8s" {
        name     = "${var.resource_group_name}"
        location = "${var.location}"
    }
    
    resource "azurerm_log_analytics_workspace" "test" {
        name                = "${var.log_analytics_workspace_name}"
        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}")}"
            }
        }
    
        agent_pool_profile {
            name            = "agentpool"
            count           = "${var.agent_count}"
            vm_size         = "Standard_DS1_v2"
            os_type         = "Linux"
            os_disk_size_gb = 30
        }
    
        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}"
            }
        }
    
        tags {
            Environment = "Development"
        }
    }
    

    上記のコードでは、クラスターの name、location、resource_group_name が設定されます。The preceding code sets the name of the cluster, location, and the resource_group_name. さらに、クラスターにアクセスするために使用される完全修飾ドメイン名 (FQDN) のフォームの一部である dns_prefix 値も設定されます。In addition, the dns_prefix value - that forms part of the fully qualified domain name (FQDN) used to access the cluster - is set.

    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. agent_pool_profile レコードは、これらのワーカー ノードの詳細を構成します。The agent_pool_profile record configures the details for these worker nodes. agent_pool_profile レコードには、作成するワーカー ノードの数とワーカー ノードの種類が含まれます。The agent_pool_profile 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.

  4. Esc キーを押して、挿入モードを終了します。Exit insert mode by selecting the Esc key.

  5. ファイルを保存し、次のコマンドを入力して vi エディターを終了します。Save the file and exit the vi editor by entering the following command:

    :wq
    

変数を宣言するDeclare the variables

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

    vi variables.tf
    
  2. I キーを選択し、挿入モードに入ります。Enter insert mode by selecting the I key.

  3. 以下のコードをエディターに貼り付けます。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"
    }
    
  4. Esc キーを押して、挿入モードを終了します。Exit insert mode by selecting the Esc key.

  5. ファイルを保存し、次のコマンドを入力して vi エディターを終了します。Save the file and exit the vi editor by entering the following command:

    :wq
    

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.

    vi output.tf
    
  2. I キーを選択し、挿入モードに入ります。Enter insert mode by selecting the I key.

  3. 以下のコードをエディターに貼り付けます。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}"
    }
    
  4. Esc キーを押して、挿入モードを終了します。Exit insert mode by selecting the Esc key.

  5. ファイルを保存し、次のコマンドを入力して vi エディターを終了します。Save the file and exit the vi editor by entering the following command:

    :wq
    

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 Storage を利用してサーバー上で状態を追跡する必要があります。However, in a more practical multi-person environment, you need to track state on the server utilizing Azure storage. このセクションでは、必要なストレージ アカウント情報 (アカウント名とアカウント キー) を取得して、Terraform 状態の情報が格納されるストレージ コンテナーを作成します。In this section, you retrieve the necessary storage account information (account name and account key), and create a storage container into which the 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. 選択したストレージ アカウントの名前を覚えておいてください。後で必要になります。Remember the name of the storage account you select, as it 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 ストレージ アカウントにコンテナーを作成します (<YourAzureStorageAccountName> および <YourAzureStorageAccountAccessKey> プレースホルダーをご使用の Azure ストレージ アカウントの適切な値で置き換えます)。In Cloud Shell, create a container in your Azure storage account (replace the <YourAzureStorageAccountName> and <YourAzureStorageAccountAccessKey> placeholders with the appropriate values for your Azure storage account).

    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 the configuration files you created in the previous sections.

  1. Cloud Shell で、Terraform を初期化します (<YourAzureStorageAccountName> および <YourAzureStorageAccountAccessKey> プレースホルダーをご使用の Azure ストレージ アカウントの適切な値で置き換えます)。In Cloud Shell, initialize Terraform (replace the <YourAzureStorageAccountName> and <YourAzureStorageAccountAccessKey> placeholders with the appropriate values for your Azure storage account).

    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 plugin:

    "terraform init" の結果例

  2. サービス プリンシパルの資格情報をエクスポートします。Export your service principal credentials. <your-client-id> および <your-client-secret> プレースホルダーは、それぞれ、サービス プリンシパルに関連付けられている appId および password の値に置き換えます。Replace the <your-client-id> and <your-client-secret> placeholders with the appId and password values associated with your service principal, respectively.

    export TF_VAR_client_id=<your-client-id>
    export TF_VAR_client_secret=<your-client-secret>
    
  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 tutorial.

    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 services in the left menu to see the resources created for your new Kubernetes cluster.

    Cloud Shell のプロンプト

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

Cloud Shell セッションがタイムアウトした場合は、次の手順に従って復旧できます。If the Cloud Shell session times out, you can perform 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.

次の手順Next steps

この記事では、Terraform と AKS を使用して Kubernetes クラスターを作成する方法を学習しました。In this article, you learned how to use Terraform and AKS to create a Kubernetes cluster. Azure 上の Terraform の詳細については、次のリソースもご覧ください。Here are some additional resources to help you learn more about Terraform on Azure:

Microsoft.com の Terraform ハブTerraform Hub in Microsoft.com
Terraform Azure プロバイダーのドキュメントTerraform Azure provider documentation
Terraform Azure プロバイダーのソースTerraform Azure provider source
Terraform Azure モジュールTerraform Azure modules