Helmとは何ですか?
HelmはKubernetes cluster用のパッケージ管理ツールです。パッケージ管理ツールと聞くと、yum
やapt
のようなOSのパッケージ管理ツールを思い浮かべるのではないでしょうか?yum
やapt
のようなOSパッケージ管理ツールを使うと、ソフトウェアの依存関係をパッケージ管理ツールが解決し、インストールやアップデート、アンインストールが簡単に行えるようになります。HelmはOSパッケージ管理ツールのKubernetes版のようなものです。
kubernetes clusterのシステム(アプリケーション)をインストール、アンインストールするには、kubernetesの設定ファイルごとにkubectl applyl
やkubectl delete
を行う必要があります。しかし、設定ファイルごとにkubectl
コマンドを実行するため、一括での管理が難しくなり、コマンドの実行もれが起こる可能性もあります。Helmは、このような煩雑になりがちなKubernetes clusterのアプリケーション管理を簡単にし、Kubernetes clusterの運用の手助けをしてくれます。
HelmはオープンソースとしてGitHub上で公開されています。GitHubでは2019年5月13日現在で11,600スターを獲得していて、とても注目されているプロジェクトとなっています。HelmはCNCF (Cloud Native Computing Foudation)でメンテナンスされていて、Kubernetesエコシステムの一員でもあります。
Helmの良いところは?
簡単にKunernetesのアプリケーション管理ができる
HelmはChartと呼ばれる仕組みで、Kubernetes clusterのすべてのリソースと依存関係をパッケージ化して管理します。このChartに必要なリソースと依存関係を定義していくことで、Kubernetes clusterの煩雑な管理を簡単に行うことができるようになります。
簡単にアプリケーションのインストール、アップデート、削除ができる
Helmの機能として、インプレースアップデートやカスタムフックの仕組みがあります。インストールやアップデートにはドライランの仕組みがあり、実際にKubernetes Cluster上にリソースをデプロイする前に、どのようなリソースが実際に登録されるかを事前に確認することができます。特に初回のインストール時には間違ったリソースを登録する可能性が高いので、ドライランの機能は役に立ちます。カスタムフックは、インストールやアップデートの前後で、ファイルやデータの削除などの処理を動かすことができます。
簡単にアプリケーションの共有ができる
HelmのChartは簡単にバージョン管理ができます。パブリック、プライベートに限らず、簡単に共有を行うことができます。よく使われるパッケージ(アプリケーション)はHelmの公式Chartとして共有されています。この共有済みChartを、そのまま利用したり流用することで、複雑で面倒なKubernetesの設定ファイルの構築を簡単に行うことができます。
簡単にロールバックができる
Helmのロールバック機能を使うことで、簡単に以前のバージョンのアプリケーションにロールバックを行うことができます。アプリケーションをロールバックするときは、他のアプリケーションとのバージョンなどの依存関係も気にする必要がありますが、これらの依存関係もHelm上で管理されているため、安心してロールバックを行うことができます。
Helmの用語と説明
Helmを利用するときに必要となる用語を説明します。以下の用語説明にはHelm公式ページの用語説明を参考にしています。
Chart
Chartは、Helmにおけるパッケージフォーマットです。インストールに必要なKubernetesリソースの情報が含まれています。
ChartはChart.yaml
ファイル、テンプレート、デフォルト値を記述したvalues.yaml
ファイル、依存関係のあるパッケージで構成されますChartのディレクトリ構成は、以下のようになります。
1 2 3 4 5 6 7 8 9 |
sample_chart/ Chart.yaml LICENSE README.md requirements.yaml values.yaml charts/ templates/ templates/NOTES.txt |
Chartのディレクトリ構成は、helm create
コマンドを実行することでも作成することができます。記述例がついたサンプルファイルも作成されるので、初めてChartを作る場合の参考にすることができます。
Chart Archive
Chart Archiveは、Chartをtar & gzipでまとめたアーカイブファイルです。それぞれのChartはChart Archiveとして1ファイルにまとめられ、Helmのリポジトリで公開されます。Chart Archiveは、helm package
コマンドを実行することで作成することができます。
Chart Dependency
Chartはゼロから作成する必要はなく、ほかの公開済みのChartを参照して作成することができます。このChartの依存をChart Dependencyと呼んでいます。依存関係のあるChartは、Helm Chartの、chartsディレクトリにある必要があります。依存関係は、requirements.yaml
ファイルに記述します。helm dependency
コマンドを実行することで、依存関係のあるChartをchartsディレクトリに格納することができます。
Chart Version
Chart Versionは、Chartのバージョンです。Chart.yamlファイルでバージョンを指定します。すべてのChartでバージョンは必須の項目です。バージョンはSemantic Versioning 2.0.0のフォーマットである必要があります。
Chart.yaml
Chart.yamlは、Chartの情報を記述したyamlファイルです。すべてのchartで必須のファイルです。Chart.yamlファイルは以下のような形式となっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
apiVersion: "v1"(v1で固定、必須) name: Chartの名前(必須) version: Chartのバージョン (Semantic Versioning 2のフォーマット、必須) KubeVersion: 互換性のあるKubernetesバージョン (オプション) description: このプロジェクトの説明 (オプション) keywords: - このプロジェクトのキーワードのリスト。パッケージ検索のときに利用される。 (オプション) home: このプロジェクトのホームページURL (オプション) sources: - このプロジェクトのソースコードのURLリスト (オプション) maintainers: (オプション) - name: メンテナーの名前 (必須) - email: メンテナーのemail (オプション) - url: メンテナーのURL (オプション) engine: テンプレートエンジンの名前 (オプション、デフォルトはgotpl) icon: アイコンイメージのURL (オプション、SVGもしはPNG) appVersion: このChartが含まれるアプリケーションのバージョン (オプション、Semantic Versioning 2のフォーマットでなくてもよい) deprecated: このChartが廃止予定かどうか (オプション、boolean) tillerVersion: このChartの実行に必要なTillerのバージョン (オプション) |
Chartのバージョン管理に影響をあたえるのは、version
の項目です。appVersion
の項目はオプションで、Chartのバージョンではないことに注意してください。appVersion
はChartのバージョン管理に何も影響を与えません。
appVersion
には、対象のChartでインストールされるアプリケーションのバージョンなどを備忘録として残しておく項目です。例えばNginx1.16.0をインストールするChartであれば、appVersion: 1.16.0のように記述しておけば、どのバージョンのNginxがインストールされるのかが、あとからみてわかりやすくなるでしょう。
Helm Home
Helm Homeは、Helmクライアントの情報が格納されているディレクトリです。Helmの初期化コマンドhelm init
を実行したときに作成されます。デフォルトでは$HOME/.helm
に作成されます。
Kube Config
Helmはデプロイ対象のKubernetes ClusterをKube configファイルから取得します。デフォルトでは、kubectl
コマンドによって作成された$HOME/.kube/config
ファイルを参照します。
Lint
Lintは作成したChartがHelm Chart標準の書式や必須項目を満たしているかの確認を行います。helm lint
コマンドを実行することで、Chartの確認を行うことができます。簡単に構文エラーや必須項目の不足を確認できるので、Chartを編集したときに必ずlintコマンドを実行することをお勧めします。
Provenance
ProvenanceはChartのセキュリティ強化のために利用します。provenanceファイルでChartの出どころや構成される内容が正しいかの確認を行うことができます。provenanceファイルは.prov
の拡張子で、Helmのリポジトリに格納されます。
Release
HelmによりKubernetes Clusterにアプリケーションがインストール(helm install
)やアップデート(helm update
)されると、インストールやアップデートごとにreleaseが作成されます。Helmはreleaseを利用してKubernetes上のデプロイを管理します。
Release Number
Release Numberは、1回のreleaseごとに増加するシーケンシャルカウンターです。インストール、アップデート、ロールバックごとにカウンターの値は増加します。この値は増加するだけで、減少することはありません(後述のRollbackを参照)。
Rollback
Rollbackは、以前のreleaseに戻すことです。helm rollback
コマンドを利用します。ロールバックもreleaseの一つで、release numberがもとに戻ることはありません。ロールバック対象のrelease内容で、アップデートreleaseを行います。下記の例のように、release number 1にロールバックしてもrelease numberは1にはならず、増加した値(3)になります。
操作 | Release Number |
---|---|
helm install | 1 |
helm update | 2 |
helm rollback 1 | 3 |
Tiller
TillerはHelmのKubernetes Clusterコンポーネントです。TillerがKubernetes APIと連携し、Kuberetes Clusterのリソース操作を行います。Tillerはhelm init
コマンドを実行したときに、Kubernetes Clusterのkube-system namespaceに作成されます。
1 2 3 |
$ kubectl --namespace=kube-system get deployments NAME READY UP-TO-DATE AVAILABLE AGE tiller-deploy 1/1 1 1 16h |
Repository
Repositoryは、HelmのChartを格納するリポジトリです。Helmクライアントはデフォルトで公式のKubernetes Chart Repository(https://kubernetes-charts.storage.googleapis.com)が設定されています。設定されているリポジトリはhelm repo list
コマンドで確認することができます。
1 2 3 4 |
$ helm repo list NAME URL stable <https://kubernetes-charts.storage.googleapis.com> local <http://127.0.0.1:8879/charts> |
リポジトリはいくつでも追加することができ、通常のHTTPサーバを用意できれば、独自のHelmリポジトリとして運用することができます。
Values
Valuesはテンプレートの値をユーザ固有の値に変更するための仕組みです。デフォルトではvalues.yamlファイルに設定された値に変更を行います。helm install
実行時に —values
オプションを利用することで、環境種別など特定のvalueでデフォルト値を上書きをすることができます。
さいごに
本記事ではKubernetes用のパッケージ管理ソフトウェアであるHelmの概要と用語の説明を行いました。公開されてるChartの再利用やプライベートなHelmリポジトリの運用により、開発者のローカルPCから本番環境まで、簡単にKubernetesアプリケーションの管理ができるようになります。
Helmという名前ですが、英語で(船の)舵、総舵輪という意味だそうです。Kubernetesはギリシャ語で航海長という意味で、ロゴも船の総舵輪のイメージとなっています。またHelmのKubernetesコンポーネントであるTillerも英語で舵柄という意味で、船に由来していますね。
投稿者プロフィール
最新の投稿
- AWS2021年12月2日AWS Graviton3 プロセッサを搭載した EC2 C7g インスタンスが発表されました。
- セキュリティ2021年7月14日ゼロデイ攻撃とは
- セキュリティ2021年7月14日マルウェアとは
- WAF2021年7月13日クロスサイトスクリプティングとは?