こんにちは!KubernetesのパッケージマネージャーであるHelmを使用していると、「設定した値がなぜ反映されないのだろう?」とか、「Argo CDで外部チャートを使う際にプライベートリポジトリの設定はどうすればいいのだろう?」といった悩みを一度は経験したことがあるのではないでしょうか。
本日は、Helmの値を注入するすべての方法とそれらの間の序列(優先順位)、そしてArgo CD運用の達人が使用するInitContainerの活用法を、10分で理解できる詳細なガイドとしてまとめました。🛠️

1. 📂 Helm Valuesを指定するすべての方法
Helmは柔軟性のために、さまざまな方法で値を注入します。各方法の特徴と用途をまとめました。
① values.yaml ファイル (デフォルト値)
チャート内部に含まれるデフォルトの設定ファイルです。
- 用途: チャート作成者が提供する基本仕様の定義。
- 特徴: 最も低い優先順位を持ちます。
② –values または -f (外部ファイル)
ユーザーが直接作成した別のYAMLファイルを指定します。
- 用途: 環境別(Dev, Staging, Prod)の設定分離。
- コマンド: helm install my-app ./my-chart -f values-prod.yaml
③ –set (インラインフラグ)
ターミナルから直接キーと値のペアを入力します。
- 用途: CI/CDパイプラインで動的にタグを変更したり、非常に簡単な値を修正する場合。
- コマンド: helm install my-app ./my-chart –set image.tag=v2.0.0
④ –set-file (ファイル内容を値として注入)
ファイルの内容(例:スクリプト、設定ファイル)を丸ごと特定のキーの値として挿入します。
- 用途: ConfigMapに入れる大きな設定ファイルの注入。
⑤ –set-string
すべての値を強制的に文字列として認識させます。(数字の0がブーリアンとして認識されるのを防ぐ)
2. 🏆 Values適用優先順位 (Precedence)
設定方法が重複する場合、Helmはどの値を選択するのでしょうか?「後で定義されたもの、またはより具体的なものが優先される」と覚えてください。
| 優先順位 | 設定方法 | 備考 |
|---|---|---|
| 1 (最高) | –set (インライン) | 最後に上書きする最終兵器 |
| 2 | –values (-f) | ファイルリストの中で最も右にあるファイルが優先 |
| 3 | 親チャートの values.yaml | 親チャートが子チャートの値を上書きする場合 |
| 4 (最低) | チャート内部の values.yaml | デフォルト値 |
—
3. 🏗️ Argo CDの高度なテクニック: InitContainerでHelm Repoを追加する
Argo CDを運用していると、このような状況に遭遇することがあります。
「社内プライベートHelmリポジトリがあるのですが、Argo CDが毎回そこからチャートを取得する必要があります。しかし、認証情報やリポジトリ登録を毎回宣言的に管理するのは手間がかかります。」
このときに使用するのが、Argo CD Repo ServerにInitContainerを追加してHelm Repoを事前に登録する方法です。
❓ これは何ですか?
Argo CDのコンポーネントの一つで、GitやHelmリポジトリと通信するargocd-repo-serverが起動する前に、一時的なコンテナ(InitContainer)を起動し、`helm repo add`コマンドを実行しておくことです。
💻 どのように設定しますか? (Kustomize/Helm基準)
Argo CDのインストールマニフェスト(Deployment)を修正する必要があります。
YAML
# argocd-repo-server Deploymentの修正
apiVersion: apps/v1
kind: Deployment
metadata:
name: argocd-repo-server
spec:
template:
spec:
# 1. Helm設定を保存する共有ボリュームの定義 📂
volumes:
- name: helm-working-dir
emptyDir: {}
# 2. メインコンテナの前に実行されるInitContainerの設定 🚀
initContainers:
- name: helm-repo-adder
image: alpine/helm:latest
command: ["/bin/sh", "-c"]
args:
- |
# 社内プライベートリポジトリの追加
helm repo add my-private-repo https://charts.mycompany.com --username $REPO_USER --password $REPO_PASS
# リポジトリの更新
helm repo update
env:
- name: REPO_USER
valueFrom:
secretKeyRef:
name: repo-credentials
key: username
# 重要: 追加されたリポジトリ情報が保存されるパスを共有ボリュームとしてマウント
volumeMounts:
- name: helm-working-dir
mountPath: /root/.config/helm
# 3. メインコンテナでも同じボリュームをマウント 🔗
containers:
- name: argocd-repo-server
volumeMounts:
- name: helm-working-dir
mountPath: /app/config/helm # Argo CDがHelm設定を探すパス
✨ この方式を使う理由
- 動的管理: Argo CD UIでいちいちリポジトリを登録する必要がなく、サーバーが起動する際にコードで自動登録されます。
- セキュリティ: Secretを通じて資格情報を注入するため安全です。
- 依存関係の解決: Chart.yamlに宣言されたサードパーティチャートの依存関係を解決する際に、ローカルのHelmキャッシュが事前に構築されているため、速度が速いです。
4. 💡 実務適用ヒント
- インライン(–set)は避ける: Argo CDを使用する際は、可能な限りvalues.yamlやGitに保存されたファイルを使用してください。インライン設定は後で追跡が困難になります。
- 構造的分離: 共通設定はvalues.yamlに、環境ごとの違いはvalues-dev.yaml、values-prod.yamlに分離して管理するのがGitOpsの定石です。
- Argo CD Helm Application: Argo CD Applicationリソース内でも、helm.parametersを通じて–setと同じ効果を得ることができます。
YAML
spec:
source:
chart: my-app
helm:
# インライン設定と同じ効果 ⚡
parameters:
- name: "replicaCount"
value: "3"
# 外部ファイル指定の効果 📄
valueFiles:
- values-prod.yaml
📝 要約
- Helm Valuesは、インライン(–set)、外部ファイル(-f)、デフォルトファイルの順に優先順位が高くなります。
- Argo CD InitContainerは、Repo Serverが起動する前にプライベートHelmリポジトリを自動登録し、運用利便性を向上させます。
- すべての設定はコード(Git)で管理し、追跡可能性を確保することが重要です。
本日の内容が、皆様の安定したクラスター運用の一助となれば幸いです!🎯
コメントを残す