Helm 3oci:// 運用では、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-httplab のみ、本番は CA 配布を優先してください。

代表パターン(優先度の目安)
  • 429/帯域飽和:同時 helm install 本数と、同一プロセス内の依存解決を先に抑える。
  • 401/403helm registry login を取得直前へ寄せ、トークン TTLジョブ timeout を整合。
  • 証明書/プロキシ:ルート CA と HTTP(S)_PROXYNO_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 loginhelm 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 installpull を減らす。Retry-After があれば従い、無ければ 4→12→30→90 秒並列一段削り

Q. 401
A. 期限切れ or スコープ不足。pull 直前に再ログイン、ローテと timeout を整合。

Q. x509/プロキシのみ不通
A. ルート CA 配布。--plain-http は lab のみ。プロキシは HTTP(S)_PROXYNO_PROXY を同一シェルで確認。

まとめと次の一手

認証 TTL・並列・退避・キャッシュ隔離を同時に決めると安定しやすいです。コンテナとチャートを同一 Registryに寄せられると設計が簡潔になります。

ノード選定:越境で Chart を頻繁に引く検証は帯域・ディスクが律速のため、専用リモート Macでプール分離し表の並列を実測してください。料金購入ヘルプログイン不要ホームブログ一覧Nix 決定表レンタル比較

Helm OCI × リモート Mac

跨境 Chart 取得の再現環境をリモート Mac で固める

料金・購入・ヘルプはログイン不要。プラン選びと帯域・ディスクの実測から進められます。