helmについて調べてみる

現職ではぼちぼちkubernetesに触れているが、なんとなくhelmは避けてきた。

helm.sh

以下のようなkubernetesにおけるパッケージマネージャと言われている点に不安があったからだ。 ある程度kubernetesについて理解してから使うならまだしも、あまり理解しないまま、helmを使って設定部分を隠蔽化してしまうことに不安があったのだと思う。 thinkit.co.jp

最近はkubernetesにも慣れてきて前述した不安も薄れてきたので、食わず嫌いをやめて少し調べてみる。

helmとはパッケージマネージャである、とはどういうことなのか調べてみた。 Linux OSではAPT,Yum,DNFなどパッケージマネージャを使って、ソフトウェアのインストールを行うことができる。 これらのツールは目的のソフトウェアが依存している他のソフトウェアのインストールも自動で行い、手動での依存関係の解決無しに目的のソフトウェアのインストールを簡単に行えるようにしてくれている。

この考え方をkubernetesに適用した結果できたのがhelmとのこと。 helmを使うことで、kubernetesクラスターに必要とするソフトウェアが稼働するPodおよび、Serviceなどのkubernetesリソースを作成することが簡単にできるらしい。 Linuxのパッケージマネージャと同様にレポジトリが存在し、そこからChartと呼ばれるパッケージ(前述した、ソフトウェアが稼働するPodおよび、Serviceなどのkubernetesリソースをまとめたもの)をインストールする。

https://hub.helm.sh/

Chartが依存するChartを指定でき、Linuxのパッケージマネージャと同様に依存性を解決してくれる。

helm.sh

Chart内のkubernetes設定用のyamlはGo templatesで記載できる。

helm.sh - k8s.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: deis-database
  namespace: deis
  labels:
    app.kubernetes.io/managed-by: deis
spec:
  replicas: 1
  selector:
    app.kubernetes.io/name: deis-database
  template:
    metadata:
      labels:
        app.kubernetes.io/name: deis-database
    spec:
      serviceAccount: deis-database
      containers:
        - name: deis-database
          image: {{ .Values.imageRegistry }}/postgres:{{ .Values.dockerTag }}
          imagePullPolicy: {{ .Values.pullPolicy }}
          ports:
            - containerPort: 5432
          env:
            - name: DATABASE_STORAGE
              value: {{ default "minio" .Values.storage }}

カスタマイズをhelm install実行時に変数を記載したファイルを渡すことで行える。 - values.yaml

imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "s3"

helm install --values=values.yaml

まとめ

なんとなくわかった気がする。 確かに便利だけど、インフラに基軸を置くものとしては、やっぱり多くの設定部分が隠蔽されてしまうのがなんとも気持ち悪い感じがしてしまう。 全部管理下に置いておきたい的な意味で。 アプリケーションエンジニアがサクッと動かす用途には適していそうだと感じた。