はじめに
この記事は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
が頻発してして上手くapply
やplan
ができなくなります。
こちらに該当のissueが上がっており、-parallelism=1
をつけると回避できるそうです。
terraform-provider-helm
を使用する際はしばらくは基本的につけておいた方が良いと思います。
以上terraform-provider-helm
の紹介でした。
Terraformでデプロイするhelm chartの定義をコード化しておけば、クラスタ作り直す際も楽で良いです。