開発基盤ツールのHelm charts
開発基盤ツールをKubernetesで運用する時に使えるHelm chartsを調べたのでまとめました。開発支援ツールやDevOpsツールという言い方もあるかもしれません。
Atlassian JIRA Software
オフィシャルのHelm chartやDockerイメージはありません。検索したところ以下のHelm chartがあります。
- devops-kompose/atlassian-jira-software at master · int128/devops-kompose · GitHub (拙作です)
- helm-charts/jira at master · seibert-media/helm-charts · GitHub
- helm-charts/jira at master · linkyard/helm-charts · GitHub
Atlassian Confluence
AtlassianオフィシャルのDockerイメージが公開されています。
オフィシャルのHelm chartはありません。検索したところ以下のHelm chartがあります。
- devops-kompose/atlassian-confluence at master · int128/devops-kompose · GitHub (拙作です)
- helm-charts/confluence at master · seibert-media/helm-charts · GitHub
- helm-charts/confluence at master · linkyard/helm-charts · GitHub
Nextcloud / ownCloud
ownCloudはオフィシャルのHelm chartがあります。
NextcloudのHelm chartですが、以下のPull Requestがレビュー中なので近日中に使えるようになると思います。
Mattermost
オフィシャルのHelm chartがありますが、まだstableではないようです。
GitLab
オフィシャルのHelm chartが公開されています。OmnibusとCloud Native Chartの2種類があります。
今のところCloud Native Chartはアルファ版なので、Omnibusを使う方がよさそうです。ただし、OmnibusはコンテナレジストリやMattermostなども付いてきます。私の環境では上記のHelm chartを使わず、公式のDockerイメージを使っています。
Jenkins
オフィシャルのHelm chartがあります。Jenkins MasterとJenkins Agentが提供されています。
SonarQube
オフィシャルのHelm chartがあります。
Nexus
オフィシャルのHelm chartがあります。
- 作者: Kelsey Hightower,Brendan Burns,Joe Beda,松浦隼人
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/03/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
チーム開発実践入門 ~共同作業を円滑に行うツール・メソッド (WEB+DB PRESS plus)
- 作者: 池田尚史,藤倉和明,井上史彰
- 出版社/メーカー: 技術評論社
- 発売日: 2014/04/16
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (11件) を見る
Helmfile supports inlined values in YAML
HelmfileはKubernetesクラスタのHelm releasesを管理するツールです。 helmfile.yaml
にデプロイしたいHelm chartを書いて helmfile sync
を実行するだけでインストールやアップグレードを冪等にやってくれるので便利です。
例えば、Kubernetes DashboardとHeapsterをクラスタに配置したい場合は以下のYAMLを書くだけでOKです。
releases: - name: kubernetes-dashboard namespace: kube-system chart: stable/kubernetes-dashboard - name: heapster namespace: kube-system chart: stable/heapster values: - rbac: create: true
設定値を変更したい場合はYAMLを変更して helmfile sync
を実行すると反映されます。
これまで、Helm chartに設定値を渡したい場合は設定値をkey=valueの形式で記述する必要がありました。Helmコマンドは設定値をYAMLで書けるのに、Helmfileではkey=valueのリストで書く必要がありました。例えばこんな感じです。
releases: - name: kubernetes-dashboard-proxy namespace: kube-system chart: int128.github.io/kubernetes-dashboard-proxy set: - name: ingress.enabled value: true - name: ingress.hosts[0] value: {{ requiredEnv "KUBE_DASHBOARD_DOMAIN" }}
Helmfile 0.16.0から設定値をインラインで書けるようになりました。これによりYAMLの可読性が大きく改善しました。
releases: - name: kubernetes-dashboard-proxy namespace: kube-system chart: int128.github.io/kubernetes-dashboard-proxy values: - ingress: enabled: true hosts: - {{ requiredEnv "KUBE_DASHBOARD_DOMAIN" }}
もしHelmコマンドとvalues.yamlファイルで構成管理を行っている場合、それらを1つの helmfile.yaml
にまとめると管理しやすくなります。ぜひ試してみてください。
See also
- GitHub - roboll/helmfile: Deploy Kubernetes Helm Charts
- Inline values support by int128 · Pull Request #139 · roboll/helmfile · GitHub
- Read dynamic type values from YAML in Golang - @int128
- 作者: Kelsey Hightower,Brendan Burns,Joe Beda,松浦隼人
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/03/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
Read dynamic type values from YAML in Golang
GolangでYAMLを読み込む際、要素の型が実行時に決まる場合を考えます。例えば、以下のYAMLでは values
で数値、文字列、マップの値が列挙されています。
values: - 100 - foo - key: value
このようなYAMLを読み込む場合、型宣言を interface{}
にすると実行時に型をチェックして値を処理できます。
type Spec struct { Values []interface{} `yaml:"values"` } func main() { spec := Spec{} yaml.NewDecoder(file).Decode(&spec) for _, value := range spec.Values { switch typedValue := value.(type) { case string: // 文字列を表示する fmt.Printf("string=%s\n", typedValue) case int: // 数値を表示する fmt.Printf("int=%d\n", typedValue) case map[interface{}]interface{}: // マップに含まれる key の値を表示する fmt.Printf("key=%+v\n", typedValue["key"]) } } }
この方法を応用するとYAMLの部分木を出力することも可能です。先ほどのYAMLに対して以下を実行すると key: value
が表示されます。
for _, value := range spec.Values { case map[interface{}]interface{}: // 部分木を表示する e := yaml.NewEncoder(os.Stdout) defer e.Close() e.Encode(typedValue) }
Full example
package main import ( "fmt" "os" "gopkg.in/yaml.v2" ) type Spec struct { Values []interface{} `yaml:"values"` } func main() { file, err := os.Open("fixture.yaml") if err != nil { panic(err) } spec := Spec{} yaml.NewDecoder(file).Decode(&spec) for _, value := range spec.Values { switch typedValue := value.(type) { case string: fmt.Printf("string=%s\n", typedValue) case int: fmt.Printf("int=%d\n", typedValue) case map[interface{}]interface{}: e := yaml.NewEncoder(os.Stdout) defer e.Close() e.Encode(typedValue) } } }