helm
kubernetes
Terraform

terraformを使ってhelmをコードで管理する

はじめに

この記事はKubernetes Advent Calendar 2017の18日目の記事です。

helm便利ですよね。各種アプリケーションをコマンド一発でk8sクラスタにデプロイできます。
でもhelm installでリソースデプロイしてるとちょっと不安になってきませんか。
IaC的にも何のhelm chartをデプロイしているかコードで管理したくなります。

そこでhelmをコードで管理する方法を探したところ

というものがありました。

この記事ではterraform-provider-helmの使いかたについて説明します。
helmfileの方がスター数はあったんですが、やはりTerraformによるワークフロー抽象化の流れに組み込めるってのは魅力かなと思います。
なお、helm自体やterraform-provider-helmのpluginのインストールについては割愛します。

使用バージョン

  • kubernetes: 1.7.7
  • helm: 2.6.1
  • terraform: v0.11.0
  • terraform-provider-helm: v0.3.2

helm providorの設定

providerの設定ですが、概ね3通りの設定方法があります。

何も設定しない

provider "helm" {
}

providorに何も設定しないと~/.kube/configのcurent_contxtのクラスタに対してhelm chartがデプロイされます。楽ですが、複数クラスタを運用していると事故の元なので明示的にクラスタを指定する以後の方法が良いと思います。

クラスタのconfigを指定する / contextを指定する

provider "helm" {
    kubernetes {
        config_path = "~/.kube/config-cluster-a-1"
    }
}

or

provider "helm" {
    kubernetes {
        # 省略可能
        config_path = "~/.kube/config"

        config_context = "config-cluster-b-1"
    }
}

クラスタの個別の接続情報を指定する、あるいは~/.kube/configから接続情報を読んでコンテキストを明示的に指定する方法です。この方法なら複数クラスタ環境配下でも現在のコンテキストに依存せず、デプロイできます。

接続設定を全部書く

provider "helm" {
    kubernetes {
        host     = "https://104.196.242.174"
        username = "ClusterMaster"
        password = "MindTheGap"

        client_certificate     = "${file("~/.kube/client-cert.pem")}"
        client_key             = "${file("~/.kube/client-key.pem")}"
        cluster_ca_certificate = "${file("~/.kube/cluster-ca-cert.pem")}"
    }
}

接続情報をTerraformに全部載せることも可能みたいです。

helm_chartリソースの設定

helm_chartリソースが実際にデプロイするhelm chartの定義になります。
nginx-ingressをデプロイする例です。

resource "helm_chart" "nginx_ingress" {
    name      = "nginx-ingress"
    chart     = "stable/nginx-ingress"
    namespace = "nginx-ingress"

    set {
        name = "controller.ingressClass"
        value = "ingress-1"
    }

    set {
        name = "controller.kind"
        value = "DaemonSet"
    }

    set {
        name = "controller.service.externalTrafficPolicy"
        value = "Local"
    }
}

helm charに渡すパラメータはset内にkvとして渡せます。

また、普通のchatsと同様にvaluesキーにvalues.yamlのファイルパスを渡してファイルからパラメータを設定することも可能そうです。

終わりに

ざっくりとした使い方の説明は終わりですが、最後に1点だけ。
terraform-provider-helmはまだ安定していないのか、普通に使ってるとunexpected EOFが頻発してして上手くapplyplanができなくなります。
こちらに該当のissueが上がっており、-parallelism=1をつけると回避できるそうです。
terraform-provider-helmを使用する際はしばらくは基本的につけておいた方が良いと思います。

以上terraform-provider-helmの紹介でした。
Terraformでデプロイするhelm chartの定義をコード化しておけば、クラスタ作り直す際も楽で良いです。