Slide 1

Slide 1 text

K8sをTerraformで管理してみた 開発支援プロダクト推進部 CAT開発 小田柿 敦士

Slide 2

Slide 2 text

Terraformでもk8s上のアプリ管理ができ るって知ってました? ◦ クラウドリソースの管理 ◦ ネットワーク(VPC/サブネット) ◦ コントロールプレーン(EKS) ◦ ワーカーノード(EC2/Autoscaling Group) ◦ etc. ◦ ⇒ これらがTerraformで管理できるのは普通に分かる ◦ K8s上のアプリのインストール・更新・削除 ◦ ⇒ 実はこれもTerraformで実行できます

Slide 3

Slide 3 text

【本番運用課題】 K8sマニフェストのテンプレート化ツール選定 候補ツール 事前調査結果 Helm • Helmチャートを自分で作るのは敷居が高そう(学習コスト高そう) • 複雑なことができそう(OSS公開するなら必須のようだ、、、) Kustomize • 学習コスト低そう • kubectlコマンドの付随してくるので利用の敷居も低そう Terraform • クラウドリソース管理と併せて管理を一元化できる • ベトナムメンバーFooさんイチ押し ⇒ 採用 ◦ 実際の運用では dev/stg/prod で構成や設定値が異なる ◦ テンプレートと設定ファイルを分けて、環境ごとの差分だけ設定値として管理したい ◦ ⇒ K8sマニフェストのテンプレート化ツールが必要

Slide 4

Slide 4 text

【機能】 k8sアプリ管理でTerraformができること ◦ K8sマニフェストのテンプレート化&適用 ◦ プロバイダ: kubernetes provider ◦ 参考 https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs ◦ リソース: kubernetes_xxx (k8sオブジェクトの種類ごと) ◦ kubernetes_deployment, kubernetes_service, kubernetes_config_map, kubernetes_secret, ◦ kubernetes_daemonset, kubernetes_job, kubernetes_ingress, … ◦ Helmリポジトリに公開されているアプリの導入・更新 ◦ プロバイダ: helm provider ◦ リソース: helm_release (helmコマンドの代替) ◦ 参考 https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release

Slide 5

Slide 5 text

【実装】 K8sマニフェストのテンプレート化&適用 通常のマニフェストYAML resource "kubernetes_deployment" "nginx" { metadata { name = "nginx-deployment" labels = { app = "nginx" } } spec { replicas = 3 selector { match_labels = { app = "nginx" } } template { metadata { labels = { app = "nginx" } } spec { container { image = "nginx:1.14.2" name = "nginx" port { container_port = 80 } } } } } } ② 変数定義埋め込み ⇒ テンプレート化 ③ Terraform実行 → 適用 HCL = HashiCorp configuration language = JSONぽい?Terraform独自記法 ※YAMLを単純に変換できないのがハマりどころ HCL形式のマニフェスト この例では分かりにくいが、配列の表現形式が違う のが厄介(都度ドキュメントの確認が必要なレベル) ① HCLに変換

Slide 6

Slide 6 text

【実装】 Helmリポジトリ公開アプリインストール URL・チャート名・バージョンを指定 設定ファイル指定: 通常の設定用YAMLファイルが指定可 設定値の上書き定義作成 ここにTerraformの変数定義を適用する ⇒ 設定YAMLファイルが簡単にテンプレート化できる HCL化不要で とても簡単! ② Terraform実行 一連のhelmコマンドが実行される ① Terraformコード作成(helm_release)

Slide 7

Slide 7 text

【感想】 実際導入してみて… ◦ 慣れれば問題なく使える ◦ クラウドリソースのエンドポイント等をTfstateから取得し て利用できるのでアプリ-リソース間連携設定は容易 ◦ Helmリポジトリ上の公開アプリインストールはまあ便利 ◦ が、特段おすすめするほどでもない

Slide 8

Slide 8 text

【問題点】 積極的に勧められない理由 ◦ Terraform公式ドキュメント以外にHCLでのマニフェスト例 がほぼない ◦ ⇒ 調べたマニフェストYAMLをHCLに変換する作業が頻発 ◦ ⇒ HCLの書き方も都度調べることになり学習コストが増大 ◦ K8s:宣言的構成管理が売りだが… ◦ ⇒ Terraformを挟むとTfstate(状態)管理が発生 ◦ ⇒ 管理コストはさほどでもないが何か違和感。。。 ◦ AWSリソースとk8s上のアプリでは更新頻度も管理体系も そもそも別 ◦ ⇒ Terraformに統一することによる恩恵があまりない