クイックスタート: Terraform を使用して AKS クラスター用の Azure Linux コンテナー ホストをデプロイする
Azure Linux コンテナー ホスト クラスターをデプロイするために、Terraform を使用する Azure Linux コンテナー ホストの使用を開始します。 前提条件をインストールしたら、Terraform コードを実装し、Terraform を初期化し、Terraform 実行プランを作成して適用します。
Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、およびデプロイを行うことができます。 Terraform では、HCL 構文を使用して構成ファイルを作成します。 HCL 構文を使用すると、クラウド プロバイダーと、クラウド インフラストラクチャを構成する要素を指定できます。 構成ファイルを作成したら、"実行プラン" を作成します。これにより、インフラストラクチャの変更をデプロイ前にプレビューすることができます。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。
注意
この記事のコード例は、Microsoft Terraform GitHub リポジトリにあります。
前提条件
-
Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。
Terraform をまだ構成していない場合は、次のいずれかのオプションを使用して構成できます。
Azure サービス プリンシパルがない場合は、サービス プリンシパルを作成します。
appId
、display_name
、password
、tenant
を書き留めておきます。Kubernetes コマンド ライン ツール
kubectl
が必要です。 お持ちでない場合は、kubectl をダウンロードしてください。
SSH キー ペアの作成
AKS ノードにアクセスするには、ssh-keygen
コマンドを使用して生成する SSH キーの組 (公開および秘密) を使用して接続します。 既定では、これらのファイルは ~/.ssh ディレクトリに作成されます。 ssh-keygen
コマンドを実行すると、指定した場所に同じ名前の SSH キーの組が既に存在する場合は上書きされます。
https://shell.azure.com にアクセスし、お使いのブラウザーで Cloud Shell を開きます。
ssh-keygen
コマンドを実行します。 次の例では、RSA 暗号化と 4096 ビット長を使用して SSH キーの組が作成されます。ssh-keygen -t rsa -b 4096
SSH キーの作成の詳細については、Azure での認証用の SSH キーの作成と管理に関するページを参照してください。
Terraform コードを実装する
サンプルの Terraform コードをテストするディレクトリを作成し、それを現在のディレクトリにします。
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 {} }
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
を指定することもできます。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" }
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 }
terraform.tfvars
という名前のファイルを作成し、次のコードを挿入します。aks_service_principal_app_id = "<service_principal_app_id>" aks_service_principal_client_secret = "<service_principal_password>"
Terraform を初期化して実行プランを作成する
Terraform を初期化し、
terraform init
コマンドを使用して Azure リソースを管理するために必要な Azure モジュールをダウンロードします。terraform init
terraform plan
コマンドを使用して Terraform 実行プランを作成します。terraform plan -out main.tfplan
terraform plan
コマンドは、実行プランを作成しますが、実行はしません。 代わりに、構成ファイルに指定された構成を作成するために必要なアクションを決定します。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが自分の想定と一致しているかどうかを確認できます。省略可能な
-out
パラメーターを使用すると、プランの出力ファイルを指定できます。-out
パラメーターを使用すると、レビューしたプランが適用内容とまったく同じであることが確実になります。永続的な実行プランとセキュリティの詳細について確認するには、「セキュリティの警告」を参照してください。
terraform apply
コマンドを使用して Terraform 実行プランを適用します。terraform apply main.tfplan
上記の
terraform apply
コマンドは、以前にterraform plan -out main.tfplan
が実行されていることを想定しています。-out
パラメーターに別のファイル名を指定した場合は、terraform apply
への呼び出しで同じファイル名を使用します。-out
パラメーターを使用しなかった場合は、パラメーターを指定せずにterraform apply
を呼び出します。
結果を確認する
次の
echo
コマンドを使用してリソース グループ名を取得します。echo "$(terraform output resource_group_name)"
Azure ポータルにアクセスします。
Azure サービスで [リソース グループ] を選択し、新しいリソース グループを見つけて、このデモで作成された次のリソースを確認します。
- ソリューション: 既定で、デモではこのソリューションに ContainerInsights という名前が付けられます。 ポータルには、ソリューションのワークスペース名が括弧で囲まれて表示されます。
- Kubernetes サービス: 既定で、デモではこのサービス k8stest という名前が付けられます。 (マネージド Kubernetes クラスターは、Azure Kubernetes Service または AKS とも呼ばれます。)
- Log Analytics ワークスペース: 既定で、デモでは、このワークスペースに TestLogAnalyticsWorkspaceName というプレフィックスに乱数を続けた名前を付けます。
Terraform の状態から Kubernetes 構成を取得し、次の
echo
コマンドを使用して kubectl が読み取れるファイルに保存します。echo "$(terraform output kube_config)" > ./azurek8s
次の
cat
コマンドを使用して、前のコマンドで ASCII EOT 文字が追加されなかったことを確認します。cat ./azurek8s
先頭に
<< EOT
、末尾にEOT
が表示される場合、ファイルからこれらの文字を削除します。 そうしないと、次のエラー メッセージが表示される場合があります:error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
。次の
export
コマンドを使用して kubectl が正しい構成を取得できるように環境変数を設定します。export KUBECONFIG=./azurek8s
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 を使用して作成されたリソースが不要になった場合は、次の手順を使用して削除できます。
terraform plan
コマンドを実行しdestroy
フラグを指定します。terraform plan -destroy -out main.destroy.tfplan
terraform apply
コマンドを使用して実行プランを削除します。terraform apply main.destroy.tfplan
サービス プリンシパルを削除する
注意事項
このデモで使用したサービス プリンシパルは、他で使用しない場合にのみ削除してください。
az ad sp list
コマンドを使用してサービス プリンシパルのオブジェクト ID を取得しますaz ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":id}" --output table
az ad sp delete
コマンドを使用してサービス プリンシパルを削除します。az ad sp delete --id <service_principal_object_id>
Azure での Terraform のトラブルシューティング
Azure で Terraform を使用する場合の一般的な問題のトラブルシューティング。
次のステップ
このクイックスタートでは、Azure Linux コンテナー ホスト クラスターをデプロイしました。 Azure Linux コンテナー ホストの詳細を確認し、完全なクラスターのデプロイと管理の例を確認するには、続けて Azure Linux コンテナー ホストのチュートリアルに進んでください。