Upgrade to Pro — share decks privately, control downloads, hide ads and more …

K8sをTerraformで管理してみた

 K8sをTerraformで管理してみた

SHIFT EVOLVE

July 26, 2021
Tweet

More Decks by SHIFT EVOLVE

Other Decks in Business

Transcript

  1. Terraformでもk8s上のアプリ管理ができ るって知ってました? ◦ クラウドリソースの管理 ◦ ネットワーク(VPC/サブネット) ◦ コントロールプレーン(EKS) ◦ ワーカーノード(EC2/Autoscaling

    Group) ◦ etc. ◦ ⇒ これらがTerraformで管理できるのは普通に分かる ◦ K8s上のアプリのインストール・更新・削除 ◦ ⇒ 実はこれもTerraformで実行できます
  2. 【本番運用課題】 K8sマニフェストのテンプレート化ツール選定 候補ツール 事前調査結果 Helm • Helmチャートを自分で作るのは敷居が高そう(学習コスト高そう) • 複雑なことができそう(OSS公開するなら必須のようだ、、、) Kustomize

    • 学習コスト低そう • kubectlコマンドの付随してくるので利用の敷居も低そう Terraform • クラウドリソース管理と併せて管理を一元化できる • ベトナムメンバーFooさんイチ押し ⇒ 採用 ◦ 実際の運用では dev/stg/prod で構成や設定値が異なる ◦ テンプレートと設定ファイルを分けて、環境ごとの差分だけ設定値として管理したい ◦ ⇒ K8sマニフェストのテンプレート化ツールが必要
  3. 【機能】 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
  4. 【実装】 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に変換
  5. 【問題点】 積極的に勧められない理由 ◦ Terraform公式ドキュメント以外にHCLでのマニフェスト例 がほぼない ◦ ⇒ 調べたマニフェストYAMLをHCLに変換する作業が頻発 ◦ ⇒

    HCLの書き方も都度調べることになり学習コストが増大 ◦ K8s:宣言的構成管理が売りだが… ◦ ⇒ Terraformを挟むとTfstate(状態)管理が発生 ◦ ⇒ 管理コストはさほどでもないが何か違和感。。。 ◦ AWSリソースとk8s上のアプリでは更新頻度も管理体系も そもそも別 ◦ ⇒ Terraformに統一することによる恩恵があまりない