Kubernetesのアプリケーション管理は難しい?いいえ、Helmがあるじゃないか! – 概要編 –

Helmとは何ですか?

HelmはKubernetes cluster用のパッケージ管理ツールです。パッケージ管理ツールと聞くと、yumaptのようなOSのパッケージ管理ツールを思い浮かべるのではないでしょうか?yumaptのようなOSパッケージ管理ツールを使うと、ソフトウェアの依存関係をパッケージ管理ツールが解決し、インストールやアップデート、アンインストールが簡単に行えるようになります。HelmはOSパッケージ管理ツールのKubernetes版のようなものです。

kubernetes clusterのシステム(アプリケーション)をインストール、アンインストールするには、kubernetesの設定ファイルごとにkubectl applylkubectl 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のディレクトリ構成は、以下のようになります。

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ファイルは以下のような形式となっています。

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に作成されます。

$ 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コマンドで確認することができます。

$ 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も英語で舵柄という意味で、船に由来していますね。

投稿者プロフィール

石川 淳
スカイアーチネットワークスで、新しいサービスの企画を行っています。
元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。
https://github.com/easydoggie
コメントを頂けると嬉しいです。

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

スカイアーチネットワークスで、新しいサービスの企画を行っています。 元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。 https://github.com/easydoggie コメントを頂けると嬉しいです。