チュートリアル:Azure Kubernetes Service で Application Gateway イングレス コントローラーを作成するTutorial: Create an Application Gateway ingress controller in Azure Kubernetes Service

Azure Kubernetes Service (AKS) では、ホストされている Kubernetes 環境を管理します。Azure Kubernetes Service (AKS) manages your hosted Kubernetes environment. AKS では、コンテナー オーケストレーションの専門知識がなくても、コンテナー化されたアプリケーションを迅速かつ簡単にデプロイして管理できます。AKS makes it quick and easy to deploy and manage containerized applications without container orchestration expertise. また、AKS を使用すると、運用タスクや保守タスクのためにアプリケーションをオフラインにする負担もなくなります。AKS also eliminates the burden of taking applications offline for operational and maintenance tasks. AKS を使用すると、リソースのプロビジョニング、アップグレード、スケーリングなどのタスクをオンデマンドで実行できます。Using AKS, these tasks - including provisioning, upgrading and scaling resources - can be accomplished on-demand.

イングレス コントローラーは、Kubernetes サービスのさまざまな機能を提供します。An ingress controller provides various features for Kubernetes services. これらの機能には、リバース プロキシ、構成可能なトラフィック ルーティング、TLS などがあります。These features include reverse proxy, configurable traffic routing, and TLS termination. 個別の Kubernetes サービスのイングレス ルールを構成するには、Kubernetes イングレス リソースが使われます。Kubernetes ingress resources are used to configure the ingress rules for individual Kubernetes services. イングレス コントローラーとイングレス ルールによって、1 つの IP アドレスで Kubernetes クラスター内の複数のサービスにトラフィックをルーティングできます。Using an ingress controller and ingress rules, a single IP address can route traffic to multiple services in a Kubernetes cluster. この機能はすべて Azure Application Gateway で提供され、Azure 上の Kubernetes に最適なイングレス コントローラーになります。All this functionality is provided by Azure Application Gateway, making it an ideal Ingress controller for Kubernetes on Azure.

このチュートリアルでは、次のタスクを実施する方法について説明します。In this tutorial, you learn how to do the following tasks:

  • AKS を使用してイングレス コントローラーとしての Application Gateway を備えた Kubernetes クラスターを作成する。Create a Kubernetes cluster using AKS with Application Gateway as Ingress Controller.
  • HCL (HashiCorp 言語) を使用して Kubernetes クラスターを定義する。Use HCL (HashiCorp Language) to define a Kubernetes cluster.
  • Terraform を使用して Application Gateway リソースを作成する。Use Terraform to create Application Gateway resource.
  • 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.

  • Terraform の構成:Terraform および Azure へのアクセスの構成に関する記事の指示に従ってくださいConfigure Terraform: Follow the directions in the article, Terraform and configure access to Azure

  • Azure リソース グループ:デモに使用する Azure リソース グループがない場合は、Azure リソース グループを作成してくださいAzure resource group: If you don't have an Azure resource group to use for the demo, create an Azure resource group. リソース グループの名前と場所がデモで使用されるため、それらの値をメモしてください。Take note of the resource group name and location as those values are used in the demo.

  • Azure サービス プリンシパル:「Azure CLI で Azure サービス プリンシパルを作成する」の「サービス プリンシパルを作成する」セクションの指示に従ってください。Azure service principal: Follow the directions in the section of the Create the service principal section in the article, Create an Azure service principal with Azure CLI. appId、displayName、および password の値を書き留めます。Take note of the values for the appId, displayName, and password.

  • サービス プリンシパル オブジェクト ID を取得する:Cloud Shell で次のコマンドを実行します。az ad sp list --display-name <displayName>Obtain the Service Principal Object ID: Run the following command in Cloud Shell: az ad sp list --display-name <displayName>

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

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

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

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

    cd terraform-aks-appgw-ingress
    

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).

入力変数を定義するDefine input variables

このデプロイに必要なすべての変数をリストした Terraform 構成ファイルを作成します。Create the Terraform configuration file that lists all the variables required for this deployment.

  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 "resource_group_name" {
      description = "Name of the resource group."
    }
    
    variable "location" {
      description = "Location of the cluster."
    }
    
    variable "aks_service_principal_app_id" {
      description = "Application ID/Client ID  of the service principal. Used by AKS to manage AKS related resources on Azure like vms, subnets."
    }
    
    variable "aks_service_principal_client_secret" {
      description = "Secret of the service principal. Used by AKS to manage Azure."
    }
    
    variable "aks_service_principal_object_id" {
      description = "Object ID of the service principal."
    }
    
    variable "virtual_network_name" {
      description = "Virtual network name"
      default     = "aksVirtualNetwork"
    }
    
    variable "virtual_network_address_prefix" {
      description = "Containers DNS server IP address."
      default     = "15.0.0.0/8"
    }
    
    variable "aks_subnet_name" {
      description = "AKS Subnet Name."
      default     = "kubesubnet"
    }
    
    variable "aks_subnet_address_prefix" {
      description = "Containers DNS server IP address."
      default     = "15.0.0.0/16"
    }
    
    variable "app_gateway_subnet_address_prefix" {
      description = "Containers DNS server IP address."
      default     = "15.1.0.0/16"
    }
    
    variable "app_gateway_name" {
      description = "Name of the Application Gateway."
      default = "ApplicationGateway1"
    }
    
    variable "app_gateway_sku" {
      description = "Name of the Application Gateway SKU."
      default = "Standard_v2"
    }
    
    variable "app_gateway_tier" {
      description = "Tier of the Application Gateway SKU."
      default = "Standard_v2"
    }
    
    variable "aks_name" {
      description = "Name of the AKS cluster."
      default     = "aks-cluster1"
    }
    variable "aks_dns_prefix" {
      description = "Optional DNS prefix to use with hosted Kubernetes API server FQDN."
      default     = "aks"
    }
    
    variable "aks_agent_os_disk_size" {
      description = "Disk size (in GB) to provision for each of the agent pool nodes. This value ranges from 0 to 1023. Specifying 0 applies the default disk size for that agentVMSize."
      default     = 40
    }
    
    variable "aks_agent_count" {
      description = "The number of agent nodes for the cluster."
      default     = 3
    }
    
    variable "aks_agent_vm_size" {
      description = "The size of the Virtual Machine."
      default     = "Standard_D3_v2"
    }
    
    variable "kubernetes_version" {
      description = "The version of Kubernetes."
      default     = "1.11.5"
    }
    
    variable "aks_service_cidr" {
      description = "A CIDR notation IP range from which to assign service cluster IPs."
      default     = "10.0.0.0/16"
    }
    
    variable "aks_dns_service_ip" {
      description = "Containers DNS server IP address."
      default     = "10.0.0.10"
    }
    
    variable "aks_docker_bridge_cidr" {
      description = "A CIDR notation IP for Docker bridge."
      default     = "172.17.0.1/16"
    }
    
    variable "aks_enable_rbac" {
      description = "Enable RBAC on the AKS cluster. Defaults to false."
      default     = "false"
    }
    
    variable "vm_user_name" {
      description = "User name for the VM"
      default     = "vmuser1"
    }
    
    variable "public_ssh_key_path" {
      description = "Public key path for SSH."
      default     = "~/.ssh/id_rsa.pub"
    }
    
    variable "tags" {
      type = "map"
    
      default = {
        source = "terraform"
      }
    }
    
  3. ファイルを保存し ( <Ctrl> + S キー)、エディターを終了します ( <Ctrl> + Q キー)。Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

リソースを定義するDefine the resources

すべてのリソースを作成する Terraform 構成ファイルを作成します。Create Terraform configuration file that creates all the resources.

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

    code resources.tf
    
  2. 次のコード ブロックを貼り付けて、計算された変数を再利用するローカル ブロックを作成します。Paste the following code block to create a locals block for computed variables to reuse:

    # # Locals block for hardcoded names. 
    locals {
        backend_address_pool_name      = "${azurerm_virtual_network.test.name}-beap"
        frontend_port_name             = "${azurerm_virtual_network.test.name}-feport"
        frontend_ip_configuration_name = "${azurerm_virtual_network.test.name}-feip"
        http_setting_name              = "${azurerm_virtual_network.test.name}-be-htst"
        listener_name                  = "${azurerm_virtual_network.test.name}-httplstn"
        request_routing_rule_name      = "${azurerm_virtual_network.test.name}-rqrt"
        app_gateway_subnet_name = "appgwsubnet"
    }
    
  3. 次のコード ブロックを貼り付けて、リソース グループと新しいユーザー ID のデータ ソースを作成します。Paste the following code block to create a data source for Resource group, new User identity:

    data "azurerm_resource_group" "rg" {
      name = var.resource_group_name
    }
    
    # User Assigned Identities 
    resource "azurerm_user_assigned_identity" "testIdentity" {
      resource_group_name = data.azurerm_resource_group.rg.name
      location            = data.azurerm_resource_group.rg.location
    
      name = "identity1"
    
      tags = var.tags
    }
    
  4. 次のコード ブロックを貼り付けて、基本となるネットワーク リソースを作成します。Paste the following code block to create base networking resources:

    resource "azurerm_virtual_network" "test" {
      name                = var.virtual_network_name
      location            = data.azurerm_resource_group.rg.location
      resource_group_name = data.azurerm_resource_group.rg.name
      address_space       = [var.virtual_network_address_prefix]
    
      subnet {
        name           = var.aks_subnet_name
        address_prefix = var.aks_subnet_address_prefix
      }
    
      subnet {
        name           = "appgwsubnet"
        address_prefix = var.app_gateway_subnet_address_prefix
      }
    
      tags = var.tags
    }
    
    data "azurerm_subnet" "kubesubnet" {
      name                 = var.aks_subnet_name
      virtual_network_name = azurerm_virtual_network.test.name
      resource_group_name  = data.azurerm_resource_group.rg.name
    }
    
    data "azurerm_subnet" "appgwsubnet" {
      name                 = "appgwsubnet"
      virtual_network_name = azurerm_virtual_network.test.name
      resource_group_name  = data.azurerm_resource_group.rg.name
    }
    
    # Public Ip 
    resource "azurerm_public_ip" "test" {
      name                         = "publicIp1"
      location                     = data.azurerm_resource_group.rg.location
      resource_group_name          = data.azurerm_resource_group.rg.name
      allocation_method            = "Static"
      sku                          = "Standard"
    
      tags = var.tags
    }
    
  5. 次のコード ブロックを貼り付けて、Application Gateway リソースを作成します。Paste the following code block to create Application Gateway resource:

    resource "azurerm_application_gateway" "network" {
      name                = var.app_gateway_name
      resource_group_name = data.azurerm_resource_group.rg.name
      location            = data.azurerm_resource_group.rg.location
    
      sku {
        name     = var.app_gateway_sku
        tier     = "Standard_v2"
        capacity = 2
      }
    
      gateway_ip_configuration {
        name      = "appGatewayIpConfig"
        subnet_id = data.azurerm_subnet.appgwsubnet.id
      }
    
      frontend_port {
        name = local.frontend_port_name
        port = 80
      }
    
      frontend_port {
        name = "httpsPort"
        port = 443
      }
    
      frontend_ip_configuration {
        name                 = local.frontend_ip_configuration_name
        public_ip_address_id = azurerm_public_ip.test.id
      }
    
      backend_address_pool {
        name = local.backend_address_pool_name
      }
    
      backend_http_settings {
        name                  = local.http_setting_name
        cookie_based_affinity = "Disabled"
        port                  = 80
        protocol              = "Http"
        request_timeout       = 1
      }
    
      http_listener {
        name                           = local.listener_name
        frontend_ip_configuration_name = local.frontend_ip_configuration_name
        frontend_port_name             = local.frontend_port_name
        protocol                       = "Http"
      }
    
      request_routing_rule {
        name                       = local.request_routing_rule_name
        rule_type                  = "Basic"
        http_listener_name         = local.listener_name
        backend_address_pool_name  = local.backend_address_pool_name
        backend_http_settings_name = local.http_setting_name
      }
    
      tags = var.tags
    
      depends_on = ["azurerm_virtual_network.test", "azurerm_public_ip.test"]
    }
    
  6. 次のコード ブロックを貼り付けて、ロールの割り当てを作成します。Paste the following code block to create role assignments:

    resource "azurerm_role_assignment" "ra1" {
      scope                = data.azurerm_subnet.kubesubnet.id
      role_definition_name = "Network Contributor"
      principal_id         = var.aks_service_principal_object_id 
    
      depends_on = ["azurerm_virtual_network.test"]
    }
    
    resource "azurerm_role_assignment" "ra2" {
      scope                = azurerm_user_assigned_identity.testIdentity.id
      role_definition_name = "Managed Identity Operator"
      principal_id         = var.aks_service_principal_object_id
      depends_on           = ["azurerm_user_assigned_identity.testIdentity"]
    }
    
    resource "azurerm_role_assignment" "ra3" {
      scope                = azurerm_application_gateway.network.id
      role_definition_name = "Contributor"
      principal_id         = azurerm_user_assigned_identity.testIdentity.principal_id
      depends_on           = ["azurerm_user_assigned_identity.testIdentity", "azurerm_application_gateway.network"]
    }
    
    resource "azurerm_role_assignment" "ra4" {
      scope                = data.azurerm_resource_group.rg.id
      role_definition_name = "Reader"
      principal_id         = azurerm_user_assigned_identity.testIdentity.principal_id
      depends_on           = ["azurerm_user_assigned_identity.testIdentity", "azurerm_application_gateway.network"]
    }
    
  7. 次のコード ブロックを貼り付けて、Kubernetes クラスターを作成します。Paste the following code block to create the Kubernetes cluster:

    resource "azurerm_kubernetes_cluster" "k8s" {
      name       = var.aks_name
      location   = data.azurerm_resource_group.rg.location
      dns_prefix = var.aks_dns_prefix
    
      resource_group_name = data.azurerm_resource_group.rg.name
    
      linux_profile {
        admin_username = var.vm_user_name
    
        ssh_key {
          key_data = file(var.public_ssh_key_path)
        }
      }
    
      addon_profile {
        http_application_routing {
          enabled = false
        }
      }
    
      default_node_pool {
        name            = "agentpool"
        node_count      = var.aks_agent_count
        vm_size         = var.aks_agent_vm_size
        os_disk_size_gb = var.aks_agent_os_disk_size
        vnet_subnet_id  = data.azurerm_subnet.kubesubnet.id
      }
    
      service_principal {
        client_id     = var.aks_service_principal_app_id
        client_secret = var.aks_service_principal_client_secret
      }
    
      network_profile {
        network_plugin     = "azure"
        dns_service_ip     = var.aks_dns_service_ip
        docker_bridge_cidr = var.aks_docker_bridge_cidr
        service_cidr       = var.aks_service_cidr
      }
    
      depends_on = ["azurerm_virtual_network.test", "azurerm_application_gateway.network"]
      tags       = var.tags
    }
    
    
  8. ファイルを保存し ( <Ctrl> + S キー)、エディターを終了します ( <Ctrl> + Q キー)。Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

このセクションに示されているコードでは、クラスター、場所、および resource_group_name を設定します。The code presented in this section sets the name of the cluster, location, and the resource_group_name. クラスターへのアクセスに使用される完全修飾ドメイン名 (FQDN) の一部を形成する dns_prefix 値が設定されます。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 record には、作成するワーカー ノードの数とワーカー ノードの種類が含まれます。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.

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

Terraform 出力によって、Terraform がプランを適用するときユーザーに対して強調表示される値を定義できます。これは、terraform output コマンドを使用してクエリできます。Terraform outputs allow you to define values that are 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
    }
    
    output "identity_resource_id" {
        value = azurerm_user_assigned_identity.testIdentity.id
    }
    
    output "identity_client_id" {
        value = azurerm_user_assigned_identity.testIdentity.client_id
    }
    
  3. ファイルを保存し ( <Ctrl> + S キー)、エディターを終了します ( <Ctrl> + Q キー)。Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Terraform 状態を保存する Azure Storage を構成するConfigure 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 ストレージを利用してサーバー上で状態を追跡する必要があります。However, in a more practical multi-person environment, you need to track state on the server using Azure storage. このセクションでは、必要なストレージ アカウント情報を取得し、ストレージ コンテナーを作成する方法について説明します。In this section, you learn to retrieve the necessary storage account information and create a storage container. そのコンテナーに Terraform の状態情報が格納されます。The Terraform state information is then stored in that container.

  1. Azure portal の [Azure サービス] で、 [ストレージ アカウント] を選択します。In the Azure portal, under Azure services, select Storage accounts. ( [ストレージ アカウント] オプションがメイン ページに表示されていない場合は、 [その他のサービス] を選択し、それを見つけて選択します。)(If the Storage accounts option isn't visible on the main page, select More services and then locate and select it.)

  2. [ストレージ アカウント] ページで、Terraform が状態を格納するストレージ アカウントの名前を選択します。On the Storage accounts page, 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, as you need it later.

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

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

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

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

  5. Cloud Shell で、Azure ストレージ アカウントでコンテナーを作成します。In Cloud Shell, create a container in your Azure storage account. プレースホルダーを、ご使用の Azure ストレージ アカウントの適切な値に置き換えます。Replace the 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 を初期化します。In Cloud Shell, initialize Terraform. プレースホルダーを、ご使用の Azure ストレージ アカウントの適切な値に置き換えます。Replace the 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 plug-in:

    "terraform init" の結果例

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

    code terraform.tfvars
    
  3. 以前に作成した次の変数をエディターに貼り付けます。Paste the following variables created earlier into the editor. ご使用の環境の場所の値を取得するには、az account list-locations を使用します。To get the location value for your environment, use az account list-locations.

    resource_group_name = "<Name of the Resource Group already created>"
    
    location = "<Location of the Resource Group>"
    
    aks_service_principal_app_id = "<Service Principal AppId>"
    
    aks_service_principal_client_secret = "<Service Principal Client Secret>"
    
    aks_service_principal_object_id = "<Service Principal Object Id>"
    
    
  4. ファイルを保存し ( <Ctrl> + S キー)、エディターを終了します ( <Ctrl> + Q キー)。Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

  5. 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 are created when you run the terraform apply command:

    "terraform plan" の結果例

  6. 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" の結果例

  7. Azure portal 上で、左側のメニューの [リソース グループ] を選択すると、選択されたリソース グループ内の新しい Kubernetese クラスターに対して作成されたリソースが表示されます。In the Azure portal, select Resource Groups in the left menu to see the resources created for your new Kubernetes cluster in the selected resource group.

    Cloud Shell のプロンプト

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

Cloud Shell セッションがタイムアウトした場合は、次の手順を使用して復旧できます。If the Cloud Shell session times out, you can use 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 クラスターの正常性を確認できる

Azure AD ポッド ID をインストールするInstall Azure AD Pod Identity

Azure Active Directory ポッド ID は、Azure Resource Manager へのトークンベースのアクセスを提供します。Azure Active Directory Pod Identity provides token-based access to Azure Resource Manager.

Azure AD ポッド ID によって、次のコンポーネントが Kubernetes クラスターに追加されます。Azure AD Pod Identity adds the following components to your Kubernetes cluster:

RBAC が有効な場合は、次のコマンドを実行して Azure AD ポッド ID をクラスターにインストールします。If RBAC is enabled, run the following command to install Azure AD Pod Identity to your cluster:

kubectl create -f https://raw.githubusercontent.com/Azure/aad-pod-identity/master/deploy/infra/deployment-rbac.yaml

RBAC が無効な場合は、次のコマンドを実行して Azure AD ポッド ID をクラスターにインストールします。If RBAC is disabled, run the following command to install Azure AD Pod Identity to your cluster:

kubectl create -f https://raw.githubusercontent.com/Azure/aad-pod-identity/master/deploy/infra/deployment.yaml

Helm のインストールInstall Helm

このセクションのコードでは、Helm (Kubernetes パッケージ マネージャー) を使用して application-gateway-kubernetes-ingress パッケージをインストールします。The code in this section uses Helm - Kubernetes package manager - to install the application-gateway-kubernetes-ingress package:

  1. RBAC が有効な場合は、次の一連のコマンドを実行して、Helm のインストールと構成を行います。If RBAC is enabled, run the following set of commands to install and configure Helm:

    kubectl create serviceaccount --namespace kube-system tiller-sa
    kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller-sa
    helm init --tiller-namespace kube-system --service-account tiller-sa
    
  2. RBAC が無効な場合は、次のコマンドを実行して、Helm のインストールと構成を行います。If RBAC is disabled, run the following command to install and configure Helm:

    helm init
    
  3. AGIC Helm リポジトリを追加します。Add the AGIC Helm repository:

    helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
    helm repo update
    

イングレス コントローラーの Helm Chart をインストールするInstall Ingress Controller Helm Chart

  1. helm-config.yaml をダウンロードして AGIC を構成します。Download helm-config.yaml to configure AGIC:

    wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/sample-helm-config.yaml -O helm-config.yaml
    
  2. helm-config.yaml を編集し、appgw セクションと armAuth セクションに適切な値を入力します。Edit the helm-config.yaml and enter appropriate values for appgw and armAuth sections.

    code helm-config.yaml
    

    次のように値を記述します。The values are described as follows:

    • verbosityLevel:AGIC ログ インフラストラクチャの詳細レベルを設定します。verbosityLevel: Sets the verbosity level of the AGIC logging infrastructure. 使用できる値については、「ログ レベル」を参照してください。See Logging Levels for possible values.
    • appgw.subscriptionId:App Gateway の Azure サブスクリプション ID。appgw.subscriptionId: The Azure Subscription ID for the App Gateway. 例: a123b234-a3b4-557d-b2df-a0bc12de1234Example: a123b234-a3b4-557d-b2df-a0bc12de1234
    • appgw.resourceGroup:App Gateway が作成された Azure リソース グループの名前。appgw.resourceGroup: Name of the Azure Resource Group in which App Gateway was created.
    • appgw.name:Application Gateway の名前。appgw.name: Name of the Application Gateway. 例: applicationgateway1.Example: applicationgateway1.
    • appgw.shared:このブール型のフラグは、既定で false に設定する必要があります。appgw.shared: This boolean flag should be defaulted to false. Shared App Gateway が必要な場合は、true に設定します。Set to true should you need a Shared App Gateway.
    • kubernetes.watchNamespace:AGIC で監視する名前空間を指定します。kubernetes.watchNamespace: Specify the name space, which AGIC should watch. 名前空間には、単一の文字列値、または名前空間のコンマ区切り一覧を指定できます。The namespace can be a single string value, or a comma-separated list of namespaces. この変数をコメント アウトしたままにするか、空白または空の文字列に設定すると、イングレス コントローラーによって、アクセス可能なすべての名前空間が監視されます。Leaving this variable commented out, or setting it to blank or empty string results in Ingress Controller observing all accessible namespaces.
    • armAuth.type:aadPodIdentity または servicePrincipal のいずれかの値です。armAuth.type: A value of either aadPodIdentity or servicePrincipal.
    • armAuth.identityResourceID:マネージド ID のリソース ID。armAuth.identityResourceID: Resource ID of the managed identity.
    • armAuth.identityClientId:ID のクライアント ID。armAuth.identityClientId: The Client ID of the Identity.
    • armAuth.secretJSON:サービス プリンシパル シークレットの種類を選択した場合にのみ必要です (armAuth.typeservicePrincipal に設定されている場合)。armAuth.secretJSON: Only needed when Service Principal Secret type is chosen (when armAuth.type has been set to servicePrincipal).

    重要事項:Key notes:

    • identityResourceID の値は terraform スクリプトで作成され、echo "$(terraform output identity_resource_id)" を実行して確認できます。The identityResourceID value is created in the terraform script and can be found by running: echo "$(terraform output identity_resource_id)".
    • identityClientID の値は terraform スクリプトで作成され、echo "$(terraform output identity_client_id)" を実行して確認できます。The identityClientID value is created in the terraform script and can be found by running: echo "$(terraform output identity_client_id)".
    • <resource-group> の値は App Gateway のリソース グループです。The <resource-group> value is the resource group of your App Gateway.
    • <identity-name> の値は作成された ID の名前です。The <identity-name> value is the name of the created identity.
    • 特定のサブスクリプションのすべての ID は、az identity list を使用して一覧表示できます。All identities for a given subscription can be listed using: az identity list.
  3. Application Gateway イングレス コントローラー パッケージをインストールします。Install the Application Gateway ingress controller package:

    helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure
    

サンプル アプリをインストールするInstall a sample app

App Gateway、AKS、AGIC をインストールしたら、Azure Cloud Shell を使用してサンプル アプリをインストールできます。Once you have the App Gateway, AKS, and AGIC installed, you can install a sample app via Azure Cloud Shell:

  1. curl コマンドを使用して YAML ファイルをダウンロードします。Use the curl command to download the YAML file:

    curl https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/aspnetapp.yaml -o aspnetapp.yaml
    
  2. YAML ファイルを適用します。Apply the YAML file:

    kubectl apply -f aspnetapp.yaml
    

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

この記事で作成したリソースが不要になったら、削除してください。When no longer needed, delete the resources created in this article.

プレースホルダーは適切な値に置き換えてください。Replace the placeholder with the appropriate value. 指定したリソース グループ内のすべてのリソースが削除されます。All resources within the specified resource group will be deleted.

az group delete -n <resource-group>

次のステップNext steps