LoginSignup
6

More than 1 year has passed since last update.

TerraformでGKEを作ってVPC上に乗せる

Last updated at Posted at 2019-08-26

やりたいこと

terraformを使って、vpcとgkeを作成して、gkeをvpc上に乗せます。
以下の記事を参考にさせていただきましたので、詳細は下記をご確認ください!

ついでにこちらの本も参考にさせていただきました!

手順

  • vpcとgkeを作成
  • gke上にnginxのサンプルコンテナを配置

ソースコード

terraform

terraformでGCPを使うときの事前設定

ディレクトリ構成

→ tree
.
├── README.md
├── _provider.tf
├── _variable.tf
├── compute.tf
├── gcp_key.json
├── gke.tf
├── terraform.sh
└── tfvars
    └── sample.tfvars

provider

  • credentialsにはサービスアカウントのjsonファイルのパスを指定しています
  • projectregionはtfvarsファイルで切り替えられるようにしています
  • backendはあえて設定を省略して、コンソール上から入力できるようにしています
    • githubに上げるためやっているので、ハードコードでOKです!
_provider.tf
provider "google" {
  credentials = "${file("${var.gcp_key_path}")}"
  project     = "${var.project_id}"
  region      = "${var.region}"
  zone        = "${var.zone}"
}

terraform {
  backend "gcs" {}
}

tfvarsとvariables

sample.tfvars
project_name = "sample"
gcp_key_path = "./gcp_key.json"
region = "asia-northeast1"
zone = "asia-northeast1-a"
network = "default"
initial_node_count = "3"
description = "cluster"
min_master_version = "1.13.7-gke.8"
node_version = "1.13.7-gke.8"
machine_type = "g1-small"
disk_size = "10"
gke_cidr_block = "192.168.0.0/16"
_variable.tf
# all

variable "project_id" {}
variable "project_name" {}
variable "gcp_key_path" {}

# gke

variable "region" {}
variable "zone" {}
variable "network" {}
variable "initial_node_count" {}
variable "description" {}
variable "min_master_version" {}
variable "node_version" {}
variable "machine_type" {}
variable "disk_size" {}
variable "gke_cidr_block" {}

# local

locals {
  ws = "${terraform.workspace}"
}

vpcとglobal ip

  • google_compute_global_addressはkubernetesのingressで使う固定IPアドレスを生成しています
  • auto_create_subnetworksをtrueにすると自動でサブネットを作ってくれます
    • ちなみに以前、自分でサブネットを作ってみましたがうまく動きませんでした・・・
compute.tf
resource "google_compute_global_address" "gke" {
  name = "${var.project_name}-global-ip"
}

resource "google_compute_network" "gke" {
  name                            = "${var.project_name}-gke-vpc"
  routing_mode                    = "REGIONAL"
  auto_create_subnetworks         = "true"
  delete_default_routes_on_create = "false"
}

gkeとnode pool

  • gkeのnetworkにはvpcを指定しています
  • remove_default_node_poolはtrueにして、デフォルトで作られるnode poolを削除しています
    • node poolはgoogle_container_node_poolで追加するのでデフォルトは必要ないです
  • cluster_ipv4_cidr_blockservices_ipv4_cidr_block/20で分けています
    • cidrsubnet(var.gke_cidr_block, 8, 1)にして/24で分けてもいいです!
    • コンテナ数やクラスタ数の上限などはサービス毎に違うので、適宜考えていただけるといいかと思います
    • cidrsubnetの計算はterraform consoleを使えば簡単に確認できます!
  • preemptibleはfalseにしています
  • oauth_scopesもサービス毎に使う権限が違いますので、考慮いただけるといいかと思います
  • autoscalingでオートスケールするnode数を決めれます!
    • 今回は1〜3ノードでスケールします
gke.tf
resource "google_container_cluster" "gke" {
  name                     = "${var.project_name}"
  location                 = "${var.zone}"
  network                  = "${google_compute_network.gke.self_link}"
  initial_node_count       = "${var.initial_node_count}"
  remove_default_node_pool = true
  description              = "${var.description}"

  min_master_version = "${var.min_master_version}"
  node_version       = "${var.node_version}"

  ip_allocation_policy {
    use_ip_aliases           = true
    cluster_ipv4_cidr_block  = "${cidrsubnet(var.gke_cidr_block, 4, 1)}"
    services_ipv4_cidr_block = "${cidrsubnet(var.gke_cidr_block, 4, 2)}"
  }
}

resource "google_container_node_pool" "gke" {
  name       = "${var.project_name}-node-pool"
  location   = "${var.zone}"
  cluster    = "${google_container_cluster.gke.name}"
  node_count = "${var.initial_node_count}"

  autoscaling {
    max_node_count = 3
    min_node_count = 1
  }

  node_config {
    machine_type = "${var.machine_type}"
    disk_size_gb = "${var.disk_size}"
    preemptible  = false

    oauth_scopes = [
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
      "https://www.googleapis.com/auth/compute",
    ]
  }
}

Kubernetes

kubectlコマンドを使って適用していきます。
詳細は省略いたしますが、以下をご確認いただけるといいかと思います。

deployment

  • サンプルでnginxを動かしています
  • namespaceは事前にkubectl create namespaceで作成してください
  • readinessProbeでヘルスチェックしています
    • /で200のレスポンスを返さないコンテナの場合、readinessProbeは必須ですのでお気をつけ下さい
deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-deployment
  namespace: sample-ns
  labels:
    app: sample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sample
  template:
    metadata:
      labels:
        app: sample
    spec:
      containers:
        - name: sample-container
          image: nginx:latest
          ports:
            - containerPort: 80
          readinessProbe:
            httpGet:
              path: /
              port: 80
          resources:
            limits:
              cpu: 200m
              memory: 10Mi

ingress

  • kubernetes.io/ingress.global-static-ip-nameにはgoogle_compute_global_addressで作ったIPアドレス名を指定します
  • httpsを使う場合はannotations -> kubernetes.io/ingress.allow-httpspec -> tls -> secretNameが必要です
    • kubernetesにsecretsとして証明書の登録も必要になります
  • serviceNameservicePortにはservice.ymlで設定したリソース名を指定します
ingress.yml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: sample-ingress
  namespace: sample-ns
  annotations:
    kubernetes.io/ingress.global-static-ip-name: sample-global-ip
spec:
  backend:
    serviceName: sample-service
    servicePort: service-port

service

  • portsnameをつけて置くとingressservicePortに名前で指定できます
service.yml
apiVersion: v1
kind: Service
metadata:
  name: sample-service
  namespace: sample-ns
  labels:
    app: sample
spec:
  type: NodePort
  ports:
  - name: service-port
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: sample

確認

  • GCPで作った固定のIPアドレスにブラウザでアクセスして確認します

スクリーンショット 2019-08-27 1.24.57.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6