Helm は release 履歴、Kubernetes は稼働リソースを管理する。クラスタ、namespace、release、chart 版、values の出所を記録する。例の ./chart は審査済みの chart に置換する。
四つの設定表示を区別
バージョンと対象を固定する
helm version --short
以下の your-context/default/web は context/namespace/release の例。各コマンドで明示する。context は kubectl config get-contexts で確認し、chart 名と release 名を混同しない。
helm list --kube-context your-context -n default --all
NAME・REVISION・STATUS・CHART・APP VERSION を読む。chart とアプリのバージョンは別である。
helm status web --kube-context your-context -n default
deployed は Helm の状態で、Pod や業務の正常性は別に確認する。pending なら継続中の公開処理を先に調べる。
確認したい内容に応じて設定の表示を選ぶ
helm show values ./chart
./chart は公開候補のローカル chart。release の現在の実効値ではない。
helm get values web --kube-context your-context -n default
上書きがなければ空の場合がある。統合後の値は次の --all を選ぶ。
helm get values web --all --kube-context your-context -n default
対象フィールドの最終値を確認する。コントローラー内部の現在値ではない。機密設定を含む場合は共有前に確認する。
helm get manifest web --kube-context your-context -n default
同じ範囲の kubectl get deployment web -o yaml などと照合する。既定値適用・制御処理・手動変更で差が生じる。実際の名前は manifest から取得する。
| 出所 | 分かること |
| helm show values ./chart | chart の既定値 |
| helm get values RELEASE | 保存済み上書き値。--all は合成結果 |
| helm get manifest RELEASE | revision に保存されたマニフェスト |
| kubectl get ... -o yaml | 既定値・コントローラー・手動編集を経た現在の API オブジェクト |
values の優先順位と展開確認
図を準備しています
値の出所と list 全体の置換有効な values 層が順に defaults を上書きし CLI が最後。object は key 単位で merge、list は全体置換。
{"id":"ops-helm-values","title":"値の出所と list 全体の置換","summary":"有効な values 層が順に defaults を上書きし CLI が最後。object は key 単位で merge、list は全体置換。","height":600,"html":"<main><p class=\"quiet\" data-i18n=\"scope\"></p><div class=\"layers\"><div class=\"row code\">defaults\nreplicas: 1\nimage: {repository: app, tag: v1}\nports: [80, 443]</div><div class=\"row code\">prod.yaml\nreplicas: 2\nimage: {tag: v2}\nports: [8080]</div></div><div class=\"checks\"><label><input id=\"file\" type=\"checkbox\" checked><span data-i18n=\"file\"></span></label><label><input id=\"cli\" type=\"checkbox\" ><span data-i18n=\"cli\"></span></label></div><section class=\"row\"><h3 data-i18n=\"result\"></h3><pre class=\"code\" id=\"values\"></pre></section><div class=\"explain\"><div class=\"stable \"><p class=\"reserve\" aria-hidden=\"true\" data-i18n=\"hint\"></p><p id=\"message\" aria-live=\"polite\"></p></div></div></main>\n","css":"main {\n display: grid;\n gap: 18px;\n min-width: 0;\n}\np {\n overflow-wrap: anywhere;\n}\n.controls {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: center;\n}\n.presets {\n display: flex;\n flex-wrap: wrap;\n}\n.presets button {\n flex: 1 1 85px;\n font-size: 15px;\n}\n.cards {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 10px;\n}\n.card {\n border: 1px solid var(--rule);\n border-radius: 10px;\n padding: 14px;\n min-width: 0;\n background: var(--surface);\n}\n.card h3 {\n font-size: 15px;\n color: var(--muted);\n margin-bottom: 8px;\n}\n.card strong {\n font-size: 23px;\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n.code {\n font-family: var(--viz-font-mono);\n font-size: 15px;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n.stable {\n display: grid;\n min-width: 0;\n}\n.stable > * {\n grid-area: 1/1;\n margin: 0;\n}\n.stable > .reserve {\n visibility: hidden;\n pointer-events: none;\n}\n.explain {\n border-left: 3px solid var(--accent);\n padding: 12px 14px;\n background: var(--accent-soft);\n}\n.arrow {\n text-align: center;\n color: var(--accent);\n font-size: 25px;\n}\n.row {\n padding: 12px;\n border: 1px solid var(--rule);\n border-radius: 8px;\n min-width: 0;\n}\n.row.on {\n border-color: var(--accent);\n background: var(--accent-soft);\n}\n.row.off {\n color: var(--muted);\n}\n.bar {\n height: 18px;\n background: var(--surface);\n border: 1px solid var(--rule);\n border-radius: 5px;\n overflow: hidden;\n margin-top: 8px;\n}\n.bar > i {\n display: block;\n height: 100%;\n background: var(--accent);\n width: 0;\n transition: width 0.22s;\n}\n.checks {\n display: grid;\n gap: 8px;\n}\n.checks label {\n display: flex;\n gap: 10px;\n align-items: center;\n padding: 9px;\n border: 1px solid var(--rule);\n border-radius: 7px;\n font-size: 16px;\n}\n.checks input {\n width: 18px;\n height: 18px;\n accent-color: var(--accent);\n flex-shrink: 0;\n}\nlabel.range {\n display: block;\n font-size: 16px;\n}\nlabel.range output {\n float: right;\n font-variant-numeric: tabular-nums;\n}\n.pair {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n}\n.flow {\n display: grid;\n gap: 6px;\n}\n.quiet {\n font-size: 14px;\n color: var(--muted);\n}\n.badge {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 5px;\n background: var(--accent-soft);\n color: var(--accent);\n}\nbutton {\n overflow-wrap: anywhere;\n}\n.large {\n font-size: 32px;\n color: var(--accent);\n font-weight: 500;\n}\n.layers {\n display: grid;\n gap: 12px;\n}\n.layer {\n border-left: 3px solid var(--rule);\n padding-left: 12px;\n}\n.layer.on {\n border-color: var(--accent);\n}\n@media (max-width: 520px) {\n .cards,\n .pair {\n grid-template-columns: 1fr;\n }\n .card {\n padding: 12px;\n }\n .card strong {\n font-size: 22px;\n }\n}\n.code {\n white-space: pre-wrap;\n}\n#values {\n min-height: 11em;\n margin: 8px 0 0;\n}\n","js":"const $ = (s) => document.querySelector(s);\nconst $$ = (s) => [...document.querySelectorAll(s)];\nconst t = (k) => viz.t(k);\nconst put = (id, v) => ($(\"#\" + id).textContent = v);\nconst say = (k) => put(\"message\", t(k));\nconst state = (v) => ($(\"main\").dataset.state = JSON.stringify(v));\nconst press = (key, v) =>\n $$(\"[data-\" + key + \"]\").forEach((b) =>\n b.setAttribute(\"aria-pressed\", String(b.dataset[key] === v)),\n );\nfunction draw() {\n const file = $(\"#file\").checked,\n cli = $(\"#cli\").checked,\n replicas = cli ? 3 : file ? 2 : 1,\n tag = file ? \"v2\" : \"v1\",\n ports = file ? [8080] : [80, 443];\n put(\n \"values\",\n \"replicas: \" +\n replicas +\n \" ← \" +\n (cli ? \"CLI\" : file ? \"prod.yaml\" : \"defaults\") +\n \"\\nimage.repository: app ← defaults\\nimage.tag: \" +\n tag +\n \" ← \" +\n (file ? \"prod.yaml\" : \"defaults\") +\n \"\\nports: [\" +\n ports.join(\", \") +\n \"]\",\n );\n state({ file, cli, replicas, tag, ports });\n}\n$$(\"input\").forEach((e) => (e.onchange = draw));\nsay(\"hint\");\ndraw();\n","audio":false,"strings":{"cli":"--set replicas=3 を有効化","file":"prod.yaml を有効化","hint":"prod.yaml は image.tag だけ変更し repository は残る。ports list は全置換。同じ key は右側の明示値が優先。","result":"最終 values","scope":"限定 values 例。template・null 削除・reuse は省略。source を切替えて結果を見る。"}}
今回の values の来源を決める
chart の既定値と今回の values.yaml を --reset-values で適用する。旧値が必要なら先に出力・確認して意図的に入力へ含める。chart と非機密 values は版管理し、機密値はプロジェクトの方式で扱う。
helm lint ./chart -f values.yaml
テンプレート・構造エラーを先に直す。集群での受理や正常起動までは証明しない。
helm template web ./chart -n default -f values.yaml > rendered.yaml
出力先は上書きされるので今回の作業ディレクトリを使う。イメージ・ポート・namespace・ストレージ・Secret を確認する。
kubectl --context your-context -n default diff -f rendered.yaml
通常、1 は差分あり。ここでは比較だけに kubectl を使い、実際の更新は Helm に統一する。
helm upgrade --install web ./chart \
--kube-context your-context -n default \
-f values.yaml --reset-values --wait --timeout 5m
namespace は事前作成が必要。--install は初回導入も許可し、--wait/--timeout は待機を制御する。業務テストや自動 rollback ではない。status・イベント・実リクエストで確認する。
chart 既定値と今回の values を明示的に使い、旧 release 値を意図せず継承しない。後の -f が優先し、--set はさらに優先する。配列は通常全体置換。repository/OCI では版と出所を固定して確認する。
template はローカル描画で、API 対応・admission・稼働を保証しない。lookup などはクラスタ依存。dry-run の形式と機密出力に注意する。Helm 3 の --atomic と Helm 4 の失敗時復元オプションは異なるため upgrade --help を確認する。
release の復元は全業務状態の復元ではない
rollback 前に履歴と入力を読む
helm history web --kube-context your-context -n default
revision 2 が正常とは決めつけず、以前に業務確認した版を探す。
helm get values web --revision 2 --kube-context your-context -n default
同じ範囲で helm get manifest web --revision 2 も読み、イメージと対象を確認する。データ復旧は別途計画する。
helm rollback web 2 --kube-context your-context -n default --wait --timeout 5m
2 は確認値に置き換える。追加された履歴、status、Pod、業務を確認する。失敗時はイベントや hook Job を調べ、release の保存オブジェクトを直接削除しない。
revision 2 は例なのでイメージと values を先に確認する。復元は新 revision を作るが、PVC データ、外部サービス、hook の副作用、DB 移行は自動で戻らない。pending では実行中処理・Job/Pod Events・履歴を調べ、release Secret を安易に消さない。
chart の版と利用手順を調べる
helm repo list
helm repo update はローカル索引更新で、release は更新しない。OCI 参照はこの索引に依存しない。
helm search repo web --versions
repo/chart 導入では一覧から --version VERSION を指定し、同じ版の values/template を先に確認する。
helm get notes web --kube-context your-context -n default
案内のアドレスや資格情報取得方法は実リソースと照合する。正常性の証明ではない。
uninstall はリソース削除の独立した作業
helm uninstall web --kube-context your-context -n default --wait --timeout 5m
事前に manifest・hook・PVC/CRD・バックアップを確認する。後で helm list --all と残存リソースを調べる。--keep-history は履歴保持で、データ保持ではない。
uninstall は namespace と context を固定し、PVC・CRD・hook・外部リソースの扱いを先に確認する。--keep-history が残すのは release 履歴で、全リソースやデータではない。
helm upgrade · helm rollback · Values files