TerraformでKubernetes関連の管理ができるリソースは大きく分けて以下の2つがあります.

  • GCPプロバイダーの提供するgoogle_container_cluster(いわゆるGKE)
  • Kubernetesプロバイダー

前者はGCP上でKubernetesクラスタ自体を構築する用途に利用でき,後者はKubernetes上のリソースの管理をするために利用できます.
つまり前者と後者を合わせて使えば最強なわけです.特にKubernetesのConfigMapを管理できれば,Terraformで行ったインフラの変更にともなうアプリ実行時のの環境変数の変化を自動で行えてとても嬉しいです.

ただ、google_container_clusterで作成したクラスタをKubernetesプロバイダーに認識させる方法が公式ドキュメント上には特に乗っておらず、検索してもなかなか欲しい情報が出てこなくて苦戦してしまいました.
色々探し回った挙句,一応こちらのissueに参考になる情報はあったのですが,Closeされてるし探し難いしで辛かったのでこちらに残しておこうかと思った次第です.

設定例

そしてこちらがその設定です.


resource "google_container_cluster" "kluster" {
  name = "kluster"

  master_auth {
    username = "${var.cluster_user}"
    password = "${var.cluster_password}"
  }

  .......

}

provider "kubernetes" {
  host                   = "${google_container_cluster.kluster.endpoint}"
  username               = "${var.cluster_user}"
  password               = "${var.cluster_password}"
  client_certificate     = "${base64decode(google_container_cluster.kluster.master_auth.0.client_certificate)}"
  client_key             = "${base64decode(google_container_cluster.kluster.master_auth.0.client_key)}"
  cluster_ca_certificate = "${base64decode(google_container_cluster.kluster.master_auth.0.cluster_ca_certificate)}"
  }

こちらの設定を行うことでGKEのクラスタ上のリソースをKubernetesプロバイダーで作成することができるようになりました.

ハマってたポイントは以下.

master_authの後ろに .0 をつけないといけない

google_container_clusterのドキュメント 見ても特にそれらしいこと書いてないんですが何故か配列らしい

base64decodeが必要

こちらに関しては実はgoogle_container_clusterのドキュメント にヒントが書かれています.
client_certificate, client_key, cluster_ca_certificate の3つはすべてbase64エンコードされた状態で得られます.
ただし,Kubernetesプロバイダーの方はbase64エンコードされた状態では受け付けてくれないのでbase64decodeを噛ませてやる必要があります.

以上の設定によりめでたくリソースの連携ができるようになりました. それにしても日本語の情報少ない気がしてつらい.