2021/03/03

 Terraformを使ってGKEクラスタを作成する。

はじめに

VietnamLabブログのTerraform – Infrastructure as Codeブログでは TerraformツールとInfrastructure as Codeの概念について基本的な知識を研究しました。クラウドに各サービスを展開することがますます一般になっている傾向では、インフラの管理とインフラ展開自動化の問題は大事なことになっています。その問題を解決する為に、TerraformとInfrastructure as Codeが開発されました本ブログでは、簡単なKubernetesクラスターを初期化するために、Terraform とGoogle Kubernetes Engineの使い方について紹介します。

必要な設定

基本的なステップ

  • Terraformを設定する。
  • Google Cloudのアカウントを作成する。 (新しいアカウントはGoogleから1年間使用できる300ドルのクレジットをもらうため、Google Cloudを使用しても費用はかかりません。)
  • Google Cloud SDKをインストールする。

Google Cloud SDKの設定

Google Cloudのサービスを使用するには、まず、アカウントを作成した後、Google Cloudの管理ページに遷移し、Billingを選択してクレジットカード番号を入力する必要があります(実際の使用コストが発生した場合のみにお金が差し引かれます)。

次に、新しいプロジェクトを作成する必要があります。これは、Google Cloudに関連するすべての操作がプロジェクトで行われるためです。

Google Cloud SDKがインストールされると、gcloudコマンドがシステムに存在します。 次のコマンドを実行して、Google CloudSDKの設定を行います。

$ gloud init

このコマンドを実行すると、ブラウザが開き、ログインしてGoogleアカウントで認証できるようになります。認証が完了した後、コマンドはCloud SDKがやり取りするデフォルトのプロジェクトを選択するようにガイドします。作成したプロジェクトを選択するか、新しいプロジェクトを作成して、選択したプロジェクトのCompute zoneを選択できます。

次のステップでは、以下の必要なAPIを有効にします。

$ gcloud services enable container.googleapis.com

$ gcloud services enable cloudresourcemanager.googleapis.com

$ gcloud services enable storage-api.googleapis.com

$ gcloud services enable iam.googleapis.com

TerraformがGoogle Cloudとやり取りするには、サービスアカウントを作成し、このサービスアカウントの権限を設定する必要があります。

$ gcloud iam service-accounts create [service_account_name] # service_account_nameは任意です。

$ gcloud projects add-iam-policy-binding [project_name] “serviceAccount:[service_account_name]@[project_name].iam.gserviceaccount.com” –role “roles/editor” # project_nameは作成したプロジェクト名です。

次に、Terraformが使用するキーファイルを生成します(注:このキーファイルを使用してGoogle Cloudと直接やり取りできるため、公開ではなく秘密にする必要があります)。

$ gcloud iam service-accounts keys create key.json –iam-account [service_account_name]@[project_name].iam.gserviceaccount.com

Cloud Storage Bucketを初期化して、Terraform stateを保存する

インフラストラクチャの現在の状態は、Terraformによってstateファイルに保存されます。デフォルト値を使用する場合、ローカルに保存され、このローカル装置のみがシステムの現在のstateにアクセスし、作成されたインフラストラクチャと操作できます。

stateファイルへのアクセスを共有するには、stateをクラウドに保存するようにTerraformを設定する必要があります。この記事では、Google Cloud Storageを使用します。

以下のgsutilコマンド(Google Cloud SDKのインストール時に使用可能)は、Cloud Storage bucketを初期化し、バージョン管理機能を設定します(Terraformのドキュメントで推奨されています)。

 

$ gsutil mb gs://[bucket_id] # bucket_idは任意で、ユニークです。

$ gsutil versioning set on gs://[bucket_id]

Terraformの設定

まず、Terraform設定ファイルを格納するフォルダーを作成し、以下の内容の.gitignoreファイルを追加します。

#  Local .terraform directories

**/.terraform/*

 

# .tfstate files

*.tfstate

*.tfstate.*

 

# secret .tfvars files

secret.tfvars

 

# account file

*key.json

次に、以下のようにmain.tf ファイルを作成します。このファイルでは、Terraform がGoogle Cloud Storeを使用してstateを保存するように設定し、同時にTerraform がGoogle Cloudとやり取りできるように設定しました。

terraform {

backend “gcs” {}

}

 

provider “google” {

credentials = file(“key.json”)

project = var.project

region = var.region

}

次に、使用する変数とその値を宣言します。デフォルトでは、Terraformはterraformコマンド実行フォルダーのterraform.tfvars または*.auto.tfvars ファイルから変数の値を読み込みます。また、コマンドラインから値を渡すか、Terraform が-var-file オプションで他のファイルを使用するように設定することもできます(staging.tfvars、 dev.tfvarsなどの環境用に各ファイルを作成できます)。

  • 変数を宣言する。
  • # variables.tf
  • variable “project” {
  • type = string
  • }
  • variable “region” {
  • type = string
  • }
  • variable “general_machine_type” {
  • type = string
  • }
  • variable “min_node_count” {
  • type = number
  • }
  • variable “max_node_count” {
  • type = number
  • }
  • variable “is_preemptible” {
  • type = bool
  • }
  • 値を宣言する。
  • # terraform.tfvars
  • project = “[project_name]”
  • region = “asia-southeast1”
  • general_machine_type = “n1-standard-1”
  • min_node_count = 1
  • max_node_count = 2
  • is_preemptible = true

最後に、クラスタをcluster.tf ファイルに設定します(この記事では、費用を削減するためにpremptible nodeのみを使用します)。

resource “google_container_cluster” “main” {

name     = “${var.project}-cluster”

location = var.region

 

 

remove_default_node_pool = true

initial_node_count       = 1

 

master_auth {

username = “”

password = “”

}

}

 

resource “google_container_node_pool” “main” {

name       = “${var.project}-main”

location   = var.region

cluster    = google_container_cluster.main.name

node_count = 1

 

management {

auto_repair  = true

auto_upgrade = true

}

 

autoscaling {

min_node_count = var.min_node_count

max_node_count = var.max_node_count

}

 

node_config {

preemptible  = var.is_preemptible

machine_type = var.general_machine_type

 

metadata = {

disable-legacy-endpoints = true

}

 

oauth_scopes = [

“https://www.googleapis.com/auth/logging.write”,

“https://www.googleapis.com/auth/monitoring”,

“https://www.googleapis.com/auth/devstorage.read_only”

]

}

}

次に、Terraformが必要なプラグインをダウンロードするようにterraform init コマンドを実行し、同時にGoogle Cloud Storage bucketに関する情報を提供してstateを保存します。

$ terraform init -backend-config=bucket=[bucket_id] -backend-config=credentials=key.json

今、設定の妥当性をチェックし、Terraformをセットアップする時に何をするかをプレビューできます。

$ terraform validate

$ terraform plan

その後、短いコマンドで少し待つだけで、Kubernetesクラスタの準備ができました。

$ terraform apply

クラスタの状態は、次のコマンドで確認できます。

$ gcloud container clusters list

まとめ

この記事では、Terraformを使用してGoogleCloud上にKubernetesクラスターを作成する簡単な方法を紹介しました。ただし、ネットワーク、ストレージ、セキュリティなど、本番環境用にクラスタを設定するにはまだ多くの問題があります。

オフショア開発サービスとAIソリューションの詳細については、以下にお問い合わせください。

メール:

info@runsystem.net

電話番号:

84-24-3772-4304