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

K8sをTerraformで管理してみた

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 K8sをTerraformで管理してみた

Avatar for SHIFT EVOLVE

SHIFT EVOLVE PRO

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に統一することによる恩恵があまりない