K8sをTerraformで管理してみた開発支援プロダクト推進部CAT開発 小田柿 敦士
View Slide
Terraformでもk8s上のアプリ管理ができるって知ってました?◦ クラウドリソースの管理◦ ネットワーク(VPC/サブネット)◦ コントロールプレーン(EKS)◦ ワーカーノード(EC2/Autoscaling Group)◦ etc.◦ ⇒ これらがTerraformで管理できるのは普通に分かる◦ K8s上のアプリのインストール・更新・削除◦ ⇒ 実はこれもTerraformで実行できます
【本番運用課題】K8sマニフェストのテンプレート化ツール選定候補ツール 事前調査結果Helm • Helmチャートを自分で作るのは敷居が高そう(学習コスト高そう)• 複雑なことができそう(OSS公開するなら必須のようだ、、、)Kustomize • 学習コスト低そう• kubectlコマンドの付随してくるので利用の敷居も低そうTerraform • クラウドリソース管理と併せて管理を一元化できる• ベトナムメンバーFooさんイチ押し ⇒ 採用◦ 実際の運用では dev/stg/prod で構成や設定値が異なる◦ テンプレートと設定ファイルを分けて、環境ごとの差分だけ設定値として管理したい◦ ⇒ K8sマニフェストのテンプレート化ツールが必要
【機能】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
【実装】K8sマニフェストのテンプレート化&適用通常のマニフェストYAMLresource "kubernetes_deployment" "nginx" {metadata {name = "nginx-deployment"labels = {app = "nginx"}}spec {replicas = 3selector {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に変換
【実装】Helmリポジトリ公開アプリインストールURL・チャート名・バージョンを指定設定ファイル指定: 通常の設定用YAMLファイルが指定可設定値の上書き定義作成ここにTerraformの変数定義を適用する⇒ 設定YAMLファイルが簡単にテンプレート化できるHCL化不要でとても簡単!② Terraform実行一連のhelmコマンドが実行される① Terraformコード作成(helm_release)
【感想】実際導入してみて…◦ 慣れれば問題なく使える◦ クラウドリソースのエンドポイント等をTfstateから取得して利用できるのでアプリ-リソース間連携設定は容易◦ Helmリポジトリ上の公開アプリインストールはまあ便利◦ が、特段おすすめするほどでもない
【問題点】積極的に勧められない理由◦ Terraform公式ドキュメント以外にHCLでのマニフェスト例がほぼない◦ ⇒ 調べたマニフェストYAMLをHCLに変換する作業が頻発◦ ⇒ HCLの書き方も都度調べることになり学習コストが増大◦ K8s:宣言的構成管理が売りだが…◦ ⇒ Terraformを挟むとTfstate(状態)管理が発生◦ ⇒ 管理コストはさほどでもないが何か違和感。。。◦ AWSリソースとk8s上のアプリでは更新頻度も管理体系もそもそも別◦ ⇒ Terraformに統一することによる恩恵があまりない