oci:// 運用では、429・認証 TTL・TLS に加え サブチャート再帰取得と HELM_CACHE_HOME の衝突が律速になりがちです。ローテ・並列・plain-http・退避秒数を一表にし、貼れるコマンドで固めます。ホーム・技術ブログ一覧・GHCR 越境表・Harbor プリフェッチ。
シナリオとリスク(CI における Helm/OCI 取得の失敗型)
越境では 429 と再試行連鎖が先に来やすく、共有 runner では helm pull が重なってレート枠を消費します。長尺ジョブではトークン失効で 401 が断続することもあります。
dependencies 経由のサブチャートでリクエストが膨らみます。HELM_CACHE_HOME はジョブ毎にワークスペース配下へ閉じ、self-hosted/リモート Mac での汚染を避けます。
社内 TLS 検査で x509 が出やすいです。--plain-http はlab のみ、本番は CA 配布を優先してください。
- 429/帯域飽和:同時
helm install本数と、同一プロセス内の依存解決を先に抑える。 - 401/403:
helm registry loginを取得直前へ寄せ、トークン TTL と ジョブ timeout を整合。 - 証明書/プロキシ:ルート CA と
HTTP(S)_PROXY/NO_PROXYを Helm とランタイムで二重確認。
決定マトリクス(並列 install・--plain-http・認証・リトライ退避)
下表は初期値です。P95 遅延や429 の頻度が高いときは、並列を一段下げ、退避秒数を一段上げます。
| レバー | 推奨初期値(越境) | 上げる条件 | 下げる条件 |
|---|---|---|---|
| 同一 runner の同時 helm install 本数 | 1(厳しければキュー) | 429 が出ず帯域に余白 | 429・ディスク await 悪化・サブチャート多 |
| CI マトリクス内の並列ジョブ(チャート取得を含む) | CPU/帯域に合わせ 1〜2 列 | キャッシュヒットが高い単純チャート | 依存階層が深い/大容量 tgz |
--plain-http | 使わない(本番) | 隔離 lab のみ HTTP レジストリ | 外部公開や監査要件あり(必ず TLS) |
| registry トークン TTL・ローテ | ロボット 7〜30 日、長尺は pull 直前 login | 短命トークン+都度発行が運用で回る | ジョブが TTL をまたぐ/401 多発 |
| HTTP 429/5xx 退避(秒) | 4 → 12 → 30 → 90(上限 120 でクリップ) | オリジンが安定し試行が稀 | 429 連発・Retry-After 無し |
メモ:helm install oci://… は manifest と blob 取得を伴うため、コンテナ越境表と並列設計は共通です。イメージとチャートを同一 Harborに寄せると認証を一本化しやすいです。
実行チェックリスト(helm registry login・helm pull oci://・並列・タイムアウト)
プレースホルダは Runbook 化し、実値は CI のシークレットへ注入してください。
ログインと取得(GHCR 例)
# キャッシュをワークスペースに閉じる(ジョブ間汚染を防ぐ)
export HELM_CACHE_HOME="${CI_PROJECT_DIR:-$PWD}/.helm-cache"
export HELM_CONFIG_HOME="${CI_PROJECT_DIR:-$PWD}/.helm-config"
mkdir -p "$HELM_CACHE_HOME" "$HELM_CONFIG_HOME"
# GHCR(例):read:packages 相当のトークン
printf '%s' "${GITHUB_TOKEN_PLACEHOLDER}" | helm registry login ghcr.io -u "${GITHUB_ACTOR_PLACEHOLDER}" --password-stdin
# チャートを OCI から取得(バージョン固定推奨)
helm pull "oci://ghcr.io/${OWNER_PLACEHOLDER}/charts/${CHART_NAME_PLACEHOLDER}" \
--version "${CHART_VERSION_PLACEHOLDER}"
# install まで一気に行う場合(リリース名は環境で差し替え)
# helm install "${RELEASE_PLACEHOLDER}" "oci://ghcr.io/${OWNER_PLACEHOLDER}/charts/${CHART_NAME_PLACEHOLDER}" \
# --version "${CHART_VERSION_PLACEHOLDER}" -n "${NAMESPACE_PLACEHOLDER}" --create-namespace
私有 Registry/Harbor 例・HTTP 検証用
printf '%s' "${REGISTRY_TOKEN_PLACEHOLDER}" | \
helm registry login "${REGISTRY_HOST_PLACEHOLDER}" -u "${REGISTRY_USER_PLACEHOLDER}" --password-stdin
helm pull "oci://${REGISTRY_HOST_PLACEHOLDER}/${PROJECT_PLACEHOLDER}/${CHART_NAME_PLACEHOLDER}" \
--version "${CHART_VERSION_PLACEHOLDER}"
# 隔離 lab のみ(本番では TLS を正しく終端させること)
# helm pull "oci://registry.lab.local:5000/..." --version "1.2.3" --plain-http
並列とタイムアウト(シェル/オーケストレータ)
複数チャートを直列に近づけるほど 429 は減りやすいです。並列化する場合は 同時本数に上限を付けてください。
# 例:最大 1 並列で helm pull を直列化(xargs -P 1)
printf '%s\n' "${CHART_REF_1}" "${CHART_REF_2}" | xargs -I{} -P 1 helm pull {}
# リトライ骨子(429/5xx 向け・秒数は環境変数化)
for i in 1 2 3 4; do
helm pull "${OCI_CHART_REF_PLACEHOLDER}" --version "${CHART_VER_PLACEHOLDER}" && break
case "$i" in 1) sleep "${HELM_BACKOFF_1:-4}";; 2) sleep "${HELM_BACKOFF_2:-12}";; 3) sleep "${HELM_BACKOFF_3:-30}";; *) sleep "${HELM_BACKOFF_4:-90}";; esac
done
timeout はトークン TTL・依存解決・退避の合計より長めに。並列とディスク FAQ 参照。
FAQ(429/401/証明書エラー)
Q. 429
A. 同時 helm install/pull を減らす。Retry-After があれば従い、無ければ 4→12→30→90 秒+並列一段削り。
Q. 401
A. 期限切れ or スコープ不足。pull 直前に再ログイン、ローテと timeout を整合。
Q. x509/プロキシのみ不通
A. ルート CA 配布。--plain-http は lab のみ。プロキシは HTTP(S)_PROXY/NO_PROXY を同一シェルで確認。
まとめと次の一手
認証 TTL・並列・退避・キャッシュ隔離を同時に決めると安定しやすいです。コンテナとチャートを同一 Registryに寄せられると設計が簡潔になります。