Helmのローカルチャートとkustomizeのオーバーレイ
目標
インターネットなしでローカルのHelmチャートを作成してレンダリング・インストール・アップグレードし、Kustomizeのbase/overlay構造で同じマニフェストを環境ごとに変形して適用できるようになります。
なぜ重要なのか
HelmとKustomizeは、アプローチが正反対です。Helmはテンプレートです。Goテンプレートでマニフェストを文字列レベルで生成するため、条件分岐や繰り返しのようなことが自由にできますが、レンダリングする前は有効なYAMLではありません。Kustomizeはパッチです。すでに有効なYAMLを構造的にマージするので、常に有効な結果が出ますが、表現できる変形の幅は狭くなります。
どちらもリビジョンの概念を持つ点は同じです。Helmはreleaseのリビジョンをネームスペース内のSecretとして積み重ね、KustomizeではGitのコミットがその役割を果たします。そのため、Helmにはhelm rollbackがあり、Kustomizeはgit revertしたあとに再度適用します。
helm templateを習慣にすることが重要です。インストール前に何が作られるかを確認する唯一の方法で、CIでマニフェストを検査するポイントでもあります。試験会場でも、「このチャートが何を作るか確認しなさい」という類いの問題が出ます。
このラボ環境にはインターネットがありません。helm repo addは動作しません。実務でもエアギャップ環境は珍しくなく、その場合はチャートをtgzで持ち込むか、ローカルのパスからインストールします。ここで練習する方法が、まさにそれです。
ステップ
helm create /root/ckad-pkg/webappでチャートを作成してください。(必要なら、先に/root/ckad-pkgディレクトリを作成してください。)/root/ckad-pkg/webapp/values.yamlを編集してください。replicaCount: 3、image.repository: nginx、image.tag: "1.27"、service.type: NodePort、service.port: 8080にします。helm template webapp /root/ckad-pkg/webappの結果を/root/ckad-pkg/rendered.yamlに保存してください。- ローカルのチャートのパスをそのまま指定して、ネームスペース
ckad-pkgにrelease名webappでインストールしてください。ネームスペースは事前に作成しても、インストール時に一緒に作成してもかまいません。 helm upgradeでreplicaCountだけを5に変更してください。releaseのリビジョンが2になっている必要があります。- Kustomizeのbaseを作成してください。
/root/ckad-pkg/kustomize/base/deployment.yamlにDeploymentreport(レプリカ1、ラベルapp=report、イメージnginx:1.27)を書き、同じディレクトリのkustomization.yamlにそのファイルをresourcesとして登録してください。 - オーバーレイ
/root/ckad-pkg/kustomize/overlays/prod/kustomization.yamlを作成してください。baseを参照し、名前の先頭にprod-の接頭辞を付け、共通ラベルenv=prodを入れ、レプリカを4に変更するパッチを適用します。kubectl kustomize /root/ckad-pkg/kustomize/overlays/prodの結果に、prod-reportがレプリカ4、ラベルenv: prodで出力される必要があります。 - そのオーバーレイをネームスペース
ckad-pkgに適用してください(kubectl apply -k ... -n ckad-pkg)。Deploymentprod-reportが、レプリカ4、ラベルenv=prod、イメージnginx:1.27で存在している必要があります。
参考
helm list -n ckad-pkgとhelm history webapp -n ckad-pkgで、releaseの状態とリビジョンを確認します。kubectl kustomize <경로>はビルドだけ、kubectl apply -k <경로>はビルドしてから適用します(プレースホルダーはパスです)。- レプリカのパッチは、
patches:にpath:でパッチファイルを指す方式が最も無難です。replicas:専用のフィールドを使ってもかまいません。 - よくある間違い1:
helm repo addを試みることです。インターネットがないので、必ずローカルのパスだけを使います。 - よくある間違い2: オーバーレイの
resourcesに絶対パスを書くことです。../../baseのように、kustomization.yamlを基準にした相対パスが安全です。 - よくある間違い3:
image.tagを数値のように1.27のままにすることです。YAMLが浮動小数点数として解釈して1.27ではない値になることがあるので、引用符で囲みます。
helm createでチャートのひな形を作成する
helm create /root/ckad-pkg/webappでチャートを作成してください。(必要なら、先に/root/ckad-pkgディレクトリを作成してください。)
helm create <경로>は、インターネットなしでローカルに標準のチャート構造を作成します(プレースホルダーはパスです)。Chart.yaml、values.yaml、templates/が作成されたか確認します。
values.yamlを編集する
/root/ckad-pkg/webapp/values.yamlを編集してください。replicaCount: 3、image.repository: nginx、image.tag: "1.27"、service.type: NodePort、service.port: 8080にします。
values.yamlを直接編集します。イメージのタグは文字列にしておくほうが安全です(引用符)。サービスのタイプとポートは、serviceブロックの下にあります。
helm templateでレンダリング結果を確認する
helm template webapp /root/ckad-pkg/webappの結果を/root/ckad-pkg/rendered.yamlに保存してください。
helm template <릴리스이름> <차트경로>は、クラスターに何も作成せず、最終的なマニフェストだけを出力します(プレースホルダーはrelease名とチャートのパスです)。リダイレクトでファイルに保存します。
ローカルのパスからhelm installする
ローカルのチャートのパスをそのまま指定して、ネームスペースckad-pkgにrelease名webappでインストールしてください。ネームスペースは事前に作成しても、インストール時に一緒に作成してもかまいません。
チャートのパスをそのまま渡します(helm install 이름 /경로、プレースホルダーは名前とパスです)。ネームスペースがなければ--create-namespaceを付けます。インターネットがないので、リポジトリ名は使えません。
helm upgradeでリビジョンを積み重ねる
helm upgradeでreplicaCountだけを5に変更してください。releaseのリビジョンが2になっている必要があります。
--setで値を1つだけ上書きします。アップグレードするとreleaseのリビジョンが増え、以前のリビジョンはsupersededとして残ります。helm historyで確認します。
Kustomizeのbaseを作成する
Kustomizeのbaseを作成してください。/root/ckad-pkg/kustomize/base/deployment.yamlにDeployment report(レプリカ1、ラベルapp=report、イメージnginx:1.27)を書き、同じディレクトリのkustomization.yamlにそのファイルをresourcesとして登録してください。
baseディレクトリにマニフェストのファイルとkustomization.yamlを置きます。kustomizationのresourcesは、同じディレクトリを基準にした相対パスの配列です。kubectl kustomize <경로>でビルド結果を確認します(プレースホルダーはパスです)。
オーバーレイで名前・ラベル・レプリカを変更する
オーバーレイ/root/ckad-pkg/kustomize/overlays/prod/kustomization.yamlを作成してください。baseを参照し、名前の先頭にprod-の接頭辞を付け、共通ラベルenv=prodを入れ、レプリカを4に変更するパッチを適用します。kubectl kustomize /root/ckad-pkg/kustomize/overlays/prodの結果に、prod-reportがレプリカ4、ラベルenv: prodで出力される必要があります。
オーバーレイのresourcesは、baseを相対パスで指します。名前の先頭に接頭辞を付けるフィールドと共通ラベルを付けるフィールドは別々にあり、レプリカはストラテジックマージパッチのファイルで上書きします。結果はkubectl kustomizeの出力で確認します。
オーバーレイをクラスターに適用する(総合)
そのオーバーレイをネームスペースckad-pkgに適用してください(kubectl apply -k ... -n ckad-pkg)。Deployment prod-reportが、レプリカ4、ラベルenv=prod、イメージnginx:1.27で存在している必要があります。
kubectl apply -k <오버레이경로>は、ビルドと適用を一度に行います(プレースホルダーはオーバーレイのパスです)。ネームスペースを指定しないと、目的の場所に入りません。適用後、名前が接頭辞付きに変わったか確認します。