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. K8sをTerraformで管理してみた
    開発支援プロダクト推進部
    CAT開発 小田柿 敦士

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. 【機能】
    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

    View full-size slide

  5. 【実装】
    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に変換

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide