正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

コンテナレジストリの使用

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab Self-Managed

registryサブチャートは、完全にクラウドネイティブなGitLabのKubernetesへのデプロイに、registryコンポーネントを提供します。このサブチャートはアップストリームチャートをベースにしており、GitLabのコンテナRegistryが含まれています。

このチャートは、主に以下の3つの部分で構成されています:

すべての設定は、ConfigMapから入力されたDeploymentに提供される/etc/docker/registry/config.yml変数を使用して、レジストリの設定ドキュメントに従って処理されます。ConfigMapはアップストリームのデフォルトをオーバーライドしますが、それらに基づいています。詳細については、以下をご覧ください:

設計の選択

インスタンスの簡単なスケールを可能にし、ローリングアップデートを可能にするために、Deploymentデプロイがこのチャートのデプロイ方法として選択されました。

このチャートは、2つの必須シークレットと1つのオプションを使用します:

必須

  • global.registry.certificate.secret: 関連付けられたGitLabインスタンスによって提供される認証トークンを検証するための公開CA証明書バンドルを含むグローバルシークレット。GitLabを認証エンドポイントとして使用する方法については、ドキュメントを参照してください。
  • global.registry.httpSecret.secret: registryポッド間の共有シークレットを含むグローバルシークレット。

任意

  • profiling.stackdriver.credentials.secret: Stackdriverのプロファイリングが有効になっていて、明示的なサービスアカウントの認証情報を提供する必要がある場合、このシークレット(credentialsキー(デフォルト))の値は、GCPサービスアカウントのJSON認証情報です。GKEを使用しており、ワークロードIDを使用して(またはノードサービスアカウントを使用している場合は、お勧めしません)、ワークロードにサービスアカウントを提供している場合、このシークレットは不要であり、提供しないでください。いずれの場合も、サービスアカウントには、ロールroles/cloudprofiler.agentまたは同等の手動権限が必要です

設定

以下に、設定の主要なセクションをすべて説明します。親チャートから設定する場合、これらの値は次のようになります:

registry:
  enabled:
  maintenance:
    readonly:
      enabled: false
    uploadpurging:
      enabled: true
      age: 168h
      interval: 24h
      dryrun: false
  image:
    tag: 'v4.15.2-gitlab'
    pullPolicy: IfNotPresent
  annotations:
  service:
    type: ClusterIP
    name: registry
  httpSecret:
    secret:
    key:
  authEndpoint:
  tokenIssuer:
  certificate:
    secret: gitlab-registry
    key: registry-auth.crt
  deployment:
    terminationGracePeriodSeconds: 30
  draintimeout: '0'
  hpa:
    minReplicas: 2
    maxReplicas: 10
    cpu:
      targetAverageUtilization: 75
    behavior:
      scaleDown:
        stabilizationWindowSeconds: 300
  storage:
    secret:
    key: storage
    extraKey:
  validation:
    disabled: true
    manifests:
      referencelimit: 0
      payloadsizelimit: 0
      urls:
        allow: []
        deny: []
  notifications: {}
  tolerations: []
  affinity: {}
  ingress:
    enabled: false
    tls:
      enabled: true
      secretName: redis
    annotations:
    configureCertmanager:
    proxyReadTimeout:
    proxyBodySize:
    proxyBuffering:
  networkpolicy:
    enabled: false
    egress:
      enabled: false
      rules: []
    ingress:
      enabled: false
      rules: []
  serviceAccount:
    create: false
    automountServiceAccountToken: false
  tls:
    enabled: false
    secretName:
    verify: true
    caSecretName:
    cipherSuites:

このチャートをスタンドアロンとしてデプロイすることを選択した場合は、最上位レベルでregistryを削除します。

インストールパラメータ

パラメータデフォルト説明
annotationsポッドの注釈
podLabels補足的なポッドラベル。セレクターには使用されません。
common.labelsこのチャートによって作成されたすべてのオブジェクトに適用される補足的なラベル。
authAutoRedirecttrue認証自動リダイレクト(Windowsクライアントが動作するにはtrueである必要があります)
authEndpointglobal.hosts.gitlab.name認証エンドポイント(ホストとポートのみ)
certificate.secretgitlab-registryJWT certificate
debug.addr.port5001デバッグポート
debug.tls.enabledfalseregistryのデバッグポートに対してTLSを有効にします。有効になっている場合、メトリクスエンドポイントだけでなく、実稼働状態と準備状況のプローブにも影響します
debug.tls.secretNameregistryのデバッグエンドポイントの有効なcertificateとキーを含むKubernetes TLSシークレットの名前。設定されていない場合、debug.tls.enabled=true - デバッグTLS設定は、デフォルトでregistryのTLS certificateを共有します。
debug.prometheus.enabledfalse非推奨 metrics.enabledを使用
debug.prometheus.path""非推奨 metrics.pathを使用
metrics.enabledfalseメトリクスエンドポイントをスクレイプするために使用可能にする必要がある場合
metrics.path/metricsメトリクスエンドポイントのパス
metrics.serviceMonitor.enabledfalsePrometheusオペレーターがメトリクスのスクレイプを管理できるようにサービスモニターを作成する必要がある場合は、これを有効にするとprometheus.ioのスクレイプ注釈が削除されることに注意してください
metrics.serviceMonitor.additionalLabels{}サービスモニターに追加する追加のラベル
metrics.serviceMonitor.endpointConfig{}サービスモニターの追加のエンドポイント設定
deployment.terminationGracePeriodSeconds30ポッドが正常に終了するために必要なオプションの秒単位の期間。
deployment.strategy{}デプロイで使用される更新戦略を設定できます
draintimeout'0'SIGTERMシグナルを受信した後、HTTP接続をドレインするまで待機する時間(例: '10s'
relativeurlsfalseregistryがLocationヘッダーに相対URLを返すようにします。
enabledtrueregistryフラグを有効にする
api.enabledtrueサービス、デプロイ、HPA、およびPDBリソースを有効にします。
extraContainers含めるコンテナのリストを含む複数行のリテラルスタイル文字列
extraInitContainers含める追加のinitコンテナのリスト
hpa.behavior{scaleDown: {stabilizationWindowSeconds: 300 }}動作には、アップスケールとダウンスケールの仕様が含まれています(autoscaling/v2beta2以上が必要です)
hpa.customMetrics[]カスタムメトリクスには、目的のレプリカ数を計算するために使用する仕様が含まれています(targetAverageUtilizationで設定された平均CPU使用率のデフォルトの使用をオーバーライドします)
hpa.cpu.targetTypeUtilizationオートスケールCPUターゲットの種類を設定します。UtilizationまたはAverageValueのいずれかである必要があります
hpa.cpu.targetAverageValueオートスケールCPUターゲット値を設定します
hpa.cpu.targetAverageUtilization75オートスケールCPUターゲット使用率を設定します
hpa.memory.targetTypeオートスケールメモリターゲットの種類を設定します。UtilizationまたはAverageValueのいずれかである必要があります
hpa.memory.targetAverageValueオートスケールメモリターゲット値を設定します
hpa.memory.targetAverageUtilizationオートスケールメモリターゲット使用率を設定します
hpa.minReplicas2レプリカの最小数
hpa.maxReplicas10レプリカの最大数
httpSecretHttpsシークレット
extraEnvFrom公開する他のデータソースからの追加の環境変数のリスト
image.pullPolicyregistryイメージのプルポリシー
image.pullSecretsイメージrepositoryに使用するシークレット
image.repositoryregistry.gitlab.com/gitlab-org/build/cng/gitlab-container-registryregistryイメージ
image.tagv4.15.2-gitlab使用するイメージのバージョン
init.image.repositoryinitContainerイメージ
init.image.taginitContainerイメージタグ
init.containerSecurityContextinitContainer固有のセキュリティコンテキスト
init.containerSecurityContext.runAsUser1000initContainer固有: コンテナを開始するユーザーID
init.containerSecurityContext.allowPrivilegeEscalationfalseinitContainer固有: プロセスがその親プロセスよりも多くの特権を取得できるかどうかを制御します
init.containerSecurityContext.runAsNonRoottrueinitContainer固有: コンテナを非ルートユーザーで実行するかどうかを制御します
init.containerSecurityContext.capabilities.drop[ "ALL" ]initContainer固有: コンテナのLinuxケイパビリティを削除します
keda.enabledfalseHorizontalPodAutoscalersの代わりにKEDA ScaledObjectsを使用します
keda.pollingInterval30各トリガーをチェックする間隔
keda.cooldownPeriod300リソースを0にスケールバックする前に、アクティブとレポートされた最後のトリガーの後に待機する期間
keda.minReplicaCounthpa.minReplicasKEDAがリソースをダウンスケールするレプリカの最小数。
keda.maxReplicaCounthpa.maxReplicasKEDAがリソースをアップスケールするレプリカの最大数。
keda.fallbackKEDAフォールバック設定については、ドキュメントを参照してください
keda.hpaNamekeda-hpa-{scaled-object-name}KEDAが作成するHPAリソースの名前。
keda.restoreToOriginalReplicaCountScaledObjectが削除された後、ターゲットリソースを元のレプリカ数にスケールバックするかどうかを指定します
keda.behaviorhpa.behaviorアップスケールとダウンスケールの動作に関する仕様。
keda.triggersターゲットリソースのスケールをアクティブにするトリガーのリストは、hpa.cpuhpa.memoryから計算されたトリガーにデフォルト設定されます
log{level: info, fields: {service: registry}}ログオプションを設定する
minio.bucketglobal.registry.bucket従来のregistryバケット名
maintenance.readonly.enabledfalseregistryの読み取り専用モードを有効にします
maintenance.uploadpurging.enabledtrueアップロードのパージを有効にする
maintenance.uploadpurging.age168h指定された期間より古いアップロードをパージする
maintenance.uploadpurging.interval24hアップロードのパージが実行される頻度
maintenance.uploadpurging.dryrunfalse削除せずに、パージされるアップロードのみをリストします
priorityClassNameポッドに割り当てられる優先度クラス
reporting.sentry.enabledfalseSentryを使用したレポートを有効にします
reporting.sentry.dsnSentry DSN(データソース名)
reporting.sentry.environmentSentry環境を参照してください
profiling.stackdriver.enabledfalseStackdriverを使用した継続的なプロファイリングを有効にする
profiling.stackdriver.credentials.secretgitlab-registry-profiling-creds認証情報を含むシークレットの名前
profiling.stackdriver.credentials.keycredentials認証情報が保存されているシークレットキー
profiling.stackdriver.serviceRELEASE-registry(テンプレート化されたサービス名)プロファイルを記録するStackdriverサービスの名前
profiling.stackdriver.projectid実行中のGCPプロジェクトプロファイルをレポートするGCPプロジェクト
database.configurefalse有効にせずに、registryチャートにデータベース設定を設定します。既存のregistryをインポートする場合に必要です。
database.enabledfalseメタデータデータベースを有効にします。これは試験的な機能であり、本番環境で使用しないでください。
database.hostglobal.psql.hostデータベースサーバーのホスト名。
database.portglobal.psql.portデータベースサーバーのポート。
database.userデータベースのユーザー名。
database.password.secretRELEASE-registry-database-passwordデータベースパスワードを含むシークレットの名前。
database.password.keypasswordデータベースパスワードが保存されているシークレットキー。
database.nameデータベース名。
database.sslmodeSSLモード。disableallowpreferrequireverify-ca、またはverify-fullのいずれかです。
database.ssl.secretglobal.psql.ssl.secretクライアント証明書、キー、および認証局を含むシークレット。デフォルトは、mainのPostgreSQL SSLシークレットです。
database.ssl.clientCertificateglobal.psql.ssl.clientCertificateクライアント証明書を参照するシークレット内のキー。
database.ssl.clientKeyglobal.psql.ssl.clientKeyクライアントキーを参照するシークレット内のキー。
database.ssl.serverCAglobal.psql.ssl.serverCA認証局(CA)を参照するシークレット内のキー。
database.connecttimeout0接続を待機する最大時間。ゼロまたは指定されていない場合は、無期限に待機することを意味します。
database.draintimeout0シャットダウン時にすべての接続をドレインするまで待機する最大時間。ゼロまたは指定されていない場合は、無期限に待機することを意味します。
database.preparedstatementsfalse準備されたステートメントを有効にします。PgBouncerとの互換性のために、デフォルトでは無効になっています。
database.primaryfalseターゲットのプライマリデータベースサーバー。これは、registry database.migrationsの実行時にターゲットとする専用のFQDNを指定するために使用されます。指定されていない場合、database.migrationsの実行にはhostが使用されます。
database.pool.maxidle0アイドル接続プール内の接続の最大数。maxopenmaxidleより小さい場合、maxidlemaxopen制限に合わせて削減されます。ゼロまたは指定されていない場合は、アイドル接続がないことを意味します。
database.pool.maxopen0データベースへのオープン接続の最大数。maxopenmaxidleより小さい場合、maxidlemaxopen制限に合わせて削減されます。ゼロまたは指定されていない場合は、無制限のオープン接続を意味します。
database.pool.maxlifetime0接続を再利用できる最大時間。期限切れの接続は、再利用する前に遅延して閉じられる場合があります。ゼロまたは指定されていない場合は、無制限の再利用を意味します。
database.pool.maxidletime0接続がアイドル状態になる可能性がある最大時間。期限切れの接続は、再利用する前に遅延して閉じられる場合があります。ゼロまたは指定されていない場合は、無制限の期間を意味します。
database.loadBalancing.enabledfalseデータベースのロードバランシングを有効にします。これは試験的な機能であり、本番環境で使用しないでください。
database.loadBalancing.nameserver.hostlocalhostDNSレコードの検索に使用するネームサーバーのホスト。
database.loadBalancing.nameserver.port8600DNSレコードの検索に使用するネームサーバーのポート。
database.loadBalancing.record検索するSRVレコード。このオプションは、サービスディスカバリが機能するために必要です。
database.loadBalancing.replicaCheckInterval1mレプリカのステータスをチェックする間隔の最小時間。
database.migrations.enabledtrueチャートの最初のデプロイおよびアップグレード時に、移行ジョブが自動的に移行を実行するように有効にします。移行は、実行中のRegistryポッド内から手動で実行することもできます。
database.migrations.activeDeadlineSeconds3600移行ジョブでactiveDeadlineSecondsを設定します。
database.migrations.annotations{}移行ジョブに追加する追加の注釈。
database.migrations.backoffLimit6移行ジョブでbackoffLimitを設定します。
database.backgroundMigrations.enabledfalseデータベースのバックグラウンド移行を有効にします。これは、Registryメタデータデータベースの試験的な機能です。本番環境では使用しないでください。動作方法の詳細な説明については、仕様を参照してください。
database.backgroundMigrations.jobInterval各バックグラウンド移行ジョブワーカーの実行間のスリープ間隔。指定されていない場合、レジストリによってデフォルト値が設定されます
database.backgroundMigrations.maxJobRetries失敗したバックグラウンド移行ジョブの最大再試行回数。指定されていない場合、レジストリによってデフォルト値が設定されます
database.metrics.enabledfalsetrueに設定すると、データベースメトリクスの収集が有効になります。これは試験的な機能であり、本番環境で使用しないでください。分散ロックには、registry 4.27.0以降、メタデータデータベース(database.enabled: true)およびRedis (redis.cache.enabled: true)が必要です。
database.metrics.interval10sデータベースからメトリクスを収集する間隔。
database.metrics.leaseDuration30sメトリクスコレクターによってRedisロックが保持される期間。同じインスタンスによる継続的な収集を保証するには、intervalよりも長くする必要があります。
gc.disabledtruetrueに設定すると、オンラインGCワーカーが無効になります。
gc.maxbackoff24hエラーが発生した場合にワーカーの実行間でスリープするために使用される最大指数バックオフ期間。gc.noidlebackofftrueでない限り、処理するタスクがない場合にも適用されます。これは絶対最大値ではなく、最大33%のランダム化されたジッター係数が常に追加されることに注意してください。
gc.noidlebackofffalsetrueに設定すると、処理するタスクがない場合にワーカーの実行間で指数バックオフが無効になります。
gc.transactiontimeout10s各ワーカー実行のデータベーストランザクションタイムアウト。各ワーカーは、開始時にデータベーストランザクションを開始します。このタイムアウトを超過すると、停止または長時間実行されるトランザクションを回避するために、ワーカーの実行はキャンセルされます。
gc.blobs.disabledfalsetrueに設定すると、blobのGCワーカーが無効になります。
gc.blobs.interval5s各ワーカー実行間の初期スリープ間隔。
gc.blobs.storagetimeout5sストレージ操作のタイムアウト。ストレージバックエンドで、ぶら下がっているblobを削除するリクエストの期間を制限するために使用されます。
gc.manifests.disabledfalsetrueに設定すると、マニフェストのGCワーカーが無効になります。
gc.manifests.interval5s各ワーカー実行間の初期スリープ間隔。
gc.reviewafter24hガベージコレクターがレビューのためにレコードをピックアップするまでの最小時間。-1は待機しないことを意味します。
securityContext.fsGroup1000ポッドの起動に使用するグループID。
securityContext.runAsUser1000ポッドの起動に使用するユーザーID。
securityContext.fsGroupChangePolicyボリュームの所有権と許可を変更するためのポリシー(Kubernetes 1.23が必要です)
securityContext.seccompProfile.typeRuntimeDefault使用するSeccompプロファイル
containerSecurityContextコンテナの起動に使用するsecurityContextをオーバーライドします。
containerSecurityContext.runAsUser1000コンテナの起動に使用する特定のセキュリティコンテキストユーザーIDを上書きできるようにします。
containerSecurityContext.allowPrivilegeEscalationfalseGitalyコンテナのプロセスがその親プロセスよりも多くの権限を取得できるかどうかを制御します。
containerSecurityContext.runAsNonRoottrueコンテナを非ルートユーザーで実行するかどうかを制御します
containerSecurityContext.capabilities.drop[ "ALL" ]GitalyコンテナのLinuxケイパビリティを削除します
serviceAccount.automountServiceAccountTokenfalseデフォルトのServiceAccountアクセストークンをポッドにマウントするかどうかを示します
serviceAccount.enabledfalseServiceAccountを使用するかどうかを示します。
serviceLabels{}追加のサービスラベル。
tokenServicecontainer_registryJWTトークンサービス。
tokenIssuergitlab-issuerJWTトークン発行者。
tolerations[]ポッドの割り当てに使用するTolerationラベル
affinity{}ポッドの割り当てのAffinityルール。
middleware.storageミドルウェアストレージの設定レイヤー(たとえば、S3)。
redis.cache.enabledfalsetrueに設定すると、Redisキャッシュが有効になります。この機能は、メタデータデータベースが有効になっていることが前提です。設定されたRedisインスタンスにリポジトリメタデータがキャッシュされます。
redis.cache.host<Redis URL>Redisインスタンスのホスト名。空の場合、値はglobal.redis.host:global.redis.portとして入力されます。
redis.cache.port6379Redisインスタンスのポート。
redis.cache.cluster[]ホストとポートを持つアドレスのリスト。
redis.cache.sentinels[]ホストとポートを持つリストセンチネル。
redis.cache.mainnameメインサーバー名。センチネルにのみ適用されます。
redis.cache.usernameRedisインスタンスへの接続に使用されるユーザー名。
redis.cache.password.enabledfalseレジストリで使用されるRedisキャッシュがパスワードで保護されているかどうかを示します。
redis.cache.password.secretgitlab-redis-secretRedisパスワードを含むシークレットの名前。shared-secrets機能が有効になっている場合、これが提供されていない場合は自動的に作成されます。
redis.cache.password.keyredis-passwordRedisパスワードが格納されているシークレットキー。
redis.cache.sentinelpassword.enabledfalseRedisセンチネルがパスワードで保護されているかどうかを示します。redis.cache.sentinelpasswordが空の場合、global.redis.sentinelAuthの値が使用されます。redis.cache.sentinelsが定義されている場合にのみ使用されます。
redis.cache.sentinelpassword.secretgitlab-redis-secretRedisセンチネルパスワードを含むシークレットの名前。
redis.cache.sentinelpassword.keyredis-sentinel-passwordRedisセンチネルパスワードが格納されているシークレットキー。
redis.cache.db0各接続に使用するデータベースの名前。
redis.cache.dialtimeout0sRedisインスタンスへの接続のタイムアウト。デフォルトではタイムアウトはありません。
redis.cache.readtimeout0sRedisインスタンスからの読み取りのタイムアウト。デフォルトではタイムアウトはありません。
redis.cache.writetimeout0sRedisインスタンスへの書き込みのタイムアウト。デフォルトではタイムアウトはありません。
redis.cache.tls.enabledfalsetrueに設定して、TLSを有効にします。
redis.cache.tls.insecurefalseTLS経由で接続するときにサーバー名の検証を無効にするには、trueに設定します。
redis.cache.pool.size10ソケット接続の最大数。デフォルトは10接続です。
redis.cache.pool.maxlifetime1hクライアントが接続をリタイアする接続経過時間。デフォルトでは、古い接続は閉じません。
redis.cache.pool.idletimeout300s非アクティブな接続を閉じるまで待機する時間。
redis.rateLimiting.enabledfalsetrueに設定すると、Redisレート制限が有効になります。この機能は開発中です。
redis.rateLimiting.host<Redis URL>Redisインスタンスのホスト名。空の場合、値はglobal.redis.host:global.redis.portとして入力されます。
redis.rateLimiting.port6379Redisインスタンスのポート。
redis.rateLimiting.cluster[]ホストとポートを持つアドレスのリスト。
redis.rateLimiting.sentinels[]ホストとポートを持つリストセンチネル。
redis.rateLimiting.mainnameメインサーバー名。センチネルにのみ適用されます。
redis.rateLimiting.usernameRedisインスタンスへの接続に使用されるユーザー名。
redis.rateLimiting.password.enabledfalseRedisインスタンスがパスワードで保護されているかどうかを示します。
redis.rateLimiting.password.secretgitlab-redis-secretRedisパスワードを含むシークレットの名前。shared-secrets機能が有効になっている場合、これが提供されていない場合は自動的に作成されます。
redis.rateLimiting.password.keyredis-passwordRedisパスワードが格納されているシークレットキー。
redis.rateLimiting.sentinelpassword.enabledfalseRedisセンチネルがパスワードで保護されているかどうかを示します。redis.rateLimiting.sentinelpasswordが空の場合、global.redis.sentinelAuthの値が使用されます。redis.rateLimiting.sentinelsが定義されている場合にのみ使用されます。
redis.rateLimiting.sentinelpassword.secretgitlab-redis-secretRedisセンチネルパスワードを含むシークレットの名前。
redis.rateLimiting.sentinelpassword.keyredis-sentinel-passwordRedisセンチネルパスワードが格納されているシークレットキー。
redis.rateLimiting.db0各接続に使用するデータベースの名前。
redis.rateLimiting.dialtimeout0sRedisインスタンスへの接続のタイムアウト。デフォルトではタイムアウトはありません。
redis.rateLimiting.readtimeout0sRedisインスタンスからの読み取りのタイムアウト。デフォルトではタイムアウトはありません。
redis.rateLimiting.writetimeout0sRedisインスタンスへの書き込みのタイムアウト。デフォルトではタイムアウトはありません。
redis.rateLimiting.tls.enabledfalsetrueに設定して、TLSを有効にします。
redis.rateLimiting.tls.insecurefalseTLS経由で接続するときにサーバー名の検証を無効にするには、trueに設定します。
redis.rateLimiting.pool.size10ソケット接続の最大数。
redis.rateLimiting.pool.maxlifetime1hクライアントが接続をリタイアする接続経過時間。デフォルトでは、古い接続は閉じません。
redis.rateLimiting.pool.idletimeout300s非アクティブな接続を閉じるまで待機する時間。
redis.loadBalancing.enabledfalsetrueに設定すると、ロードバランシングのRedis接続が有効になります。
redis.loadBalancing.host<Redis URL>Redisインスタンスのホスト名。空の場合、値はglobal.redis.host:global.redis.portとして入力されます。
redis.loadBalancing.port6379Redisインスタンスのポート。
redis.loadBalancing.cluster[]ホストとポートを持つアドレスのリスト。
redis.loadBalancing.sentinels[]ホストとポートを持つリストセンチネル。
redis.loadBalancing.mainnameメインサーバー名。センチネルにのみ適用されます。
redis.loadBalancing.usernameRedisインスタンスへの接続に使用されるユーザー名。
redis.loadBalancing.password.enabledfalseRedisインスタンスがパスワードで保護されているかどうかを示します。
redis.loadBalancing.password.secretgitlab-redis-secretRedisパスワードを含むシークレットの名前。shared-secrets機能が有効になっている場合、これが提供されていない場合は自動的に作成されます。
redis.loadBalancing.password.keyredis-passwordRedisパスワードが格納されているシークレットキー。
redis.loadBalancing.db0各接続に使用するデータベースの名前。
redis.loadBalancing.dialtimeout0sRedisインスタンスへの接続のタイムアウト。デフォルトではタイムアウトはありません。
redis.loadBalancing.readtimeout0sRedisインスタンスからの読み取りのタイムアウト。デフォルトではタイムアウトはありません。
redis.loadBalancing.writetimeout0sRedisインスタンスへの書き込みのタイムアウト。デフォルトではタイムアウトはありません。
redis.loadBalancing.tls.enabledfalsetrueに設定して、TLSを有効にします。
redis.loadBalancing.tls.insecurefalseTLS経由で接続するときにサーバー名の検証を無効にするには、trueに設定します。
redis.loadBalancing.pool.size10ソケット接続の最大数。
redis.loadBalancing.pool.maxlifetime1hクライアントが接続をリタイアする接続経過時間。デフォルトでは、古い接続は閉じません。
redis.loadBalancing.pool.idletimeout300s非アクティブな接続を閉じるまで待機する時間。

チャート設定の例

pullSecrets

pullSecretsを使用すると、プライベートレジストリに対して認証を行い、ポッドのイメージをプルできます。

プライベートレジストリとその認証方法に関する追加の詳細は、Kubernetesドキュメントにあります。

pullSecretsの使用例を以下に示します:

image:
  repository: my.registry.repository
  tag: latest
  pullPolicy: Always
  pullSecrets:
  - name: my-secret-name
  - name: my-secondary-secret-name

serviceAccount

このセクションでは、ServiceAccountを作成するかどうか、およびデフォルトのアクセストークンをポッドにマウントするかどうかを制御します。

名前デフォルト説明
automountServiceAccountTokenブール値falseの設定は、PodにデフォルトのServiceAccountアクセストークンをマウントする必要があるかどうかを制御します。これは、特定のサイドカーが正常に機能するために必要という場合(Istioなど)を除き、有効にしないようにしてください。
enabledブール値falseServiceAccountを使用するかどうかを示します。

tolerations

tolerationsを使用すると、taintされたワーカーノードでポッドをスケジュールできます。

tolerationsの使用例を以下に示します:

tolerations:
- key: "node_label"
  operator: "Equal"
  value: "true"
  effect: "NoSchedule"
- key: "node_label"
  operator: "Equal"
  value: "true"
  effect: "NoExecute"

affinity

affinityはオプションのパラメータで、以下の一方または両方を設定できます:

  • 次のpodAntiAffinityルール:
    • topology keyに対応する式に一致するポッドと同じドメインにポッドをスケジュールしません。
    • podAntiAffinityルールの2つのモードを設定します。必須(requiredDuringSchedulingIgnoredDuringExecution)と推奨(preferredDuringSchedulingIgnoredDuringExecutionantiAffinity変数をvalues.yamlで使用して、推奨モードが適用されるように設定をsoftに設定するか、必須モードが適用されるようにhardに設定します。
  • 次のnodeAffinityルール:
    • 特定のゾーンに属するノードにポッドをスケジュールします。
    • nodeAffinityルールの2つのモードを設定します。必須(requiredDuringSchedulingIgnoredDuringExecution)と推奨(preferredDuringSchedulingIgnoredDuringExecution)。softに設定すると、推奨モードが適用されます。hardに設定すると、必須モードが適用されます。このルールは、registryチャート、およびgitlabチャートとそのすべてのサブチャート(webserviceおよびsidekiqを除く)に対してのみ実装されます。

nodeAffinityは、In演算子のみを実装します。

詳細については、関連するKubernetesドキュメントを参照してください。

次の例では、affinityを設定し、nodeAffinityantiAffinityの両方がhardに設定されています:

nodeAffinity: "hard"
antiAffinity: "hard"
affinity:
  nodeAffinity:
    key: "test.com/zone"
    values:
    - us-east1-a
    - us-east1-b
  podAntiAffinity:
    topologyKey: "test.com/hostname"

annotations

annotationsを使用すると、レジストリポッドに注釈を追加できます。

以下にannotationsの使用例を示します。

annotations:
  kubernetes.io/example-annotation: annotation-value

サブチャートを有効にする

コンパートメント化されたサブチャートを実装するために選択した方法には、特定のデプロイで不要なコンポーネントを無効にする機能が含まれています。このため、最初に決定する必要がある設定はenabledです。

デフォルトでは、レジストリはすぐに使用できます。無効にする場合は、enabled: falseを設定します。

アプリケーションに必要なリソースを有効にする

Service、デプロイメント、HPA、およびPDBリソースは、registry.api.enabled値(デフォルト: true)によって有効になります。

この設定がGitLab.comでどのように使用されるかの詳細については、コンテナレジストリのデプロイメント後の移行(GitLab.com上)をご覧ください。

imageの設定

このセクションでは、このサブチャートのデプロイメントで使用されるコンテナイメージの設定について詳しく説明します。レジストリとpullPolicyに含まれるバージョンを変更できます。

デフォルト設定:

  • tag: 'v4.15.2-gitlab'
  • pullPolicy: 'IfNotPresent'

serviceの設定

このセクションでは、サービスの名前と種類を制御します。これらの設定は、values.yamlによって入力されます。

デフォルトでは、サービスは次のように構成されています:

名前デフォルト説明
name文字列registryサービスの名前を構成します
type文字列ClusterIPサービスの種類を構成します
externalPort整数5000サービスによって公開されるポート。
internalPort整数5000サービスからのリクエストを受け入れるためにポッドによって利用されるポート。
clusterIP文字列null必要に応じてカスタムCluster IPを構成できます。
loadBalancerIP文字列null必要に応じてカスタムロードバランサーIPアドレスを構成できます。

ingressを設定する

このセクションでは、レジストリIngressを制御します。

名前デフォルト説明
apiVersion文字列apiVersionフィールドで使用する値。
annotations文字列このフィールドは、Kubernetes Ingressの標準annotationsと完全に一致します。
configureCertmanagerブール値Ingress注釈cert-manager.io/issuerおよびacme.cert-manager.io/http01-edit-in-placeを切り替えます。詳細については、GitLab PagesのTLS要件を参照してください。
enabledブール値falseサービスがサポートするIngressオブジェクトを作成するかどうかを制御する設定。falseの場合、global.ingress.enabled設定が使用されます。
tls.enabledブール値truefalseに設定すると、レジストリサブチャートのTLSが無効になります。これは、ingress-levelでTLS終端を使用できない場合(Ingressコントローラーの前にTLS終端プロキシーがある場合など)に主に役立ちます。
tls.secretName文字列レジストリURLの有効な証明書とキーを含むKubernetes TLSシークレットの名前。設定されていない場合、代わりにglobal.ingress.tls.secretNameが使用されます。デフォルトでは設定されていません。
tls.cipherSuites配列[]コンテナレジストリがTLSハンドシェイク中にクライアントに提示する必要がある暗号スイートのリスト。

TLSを設定する

コンテナレジストリは、nginx-ingressを含む他のコンポーネントとの通信を保護するTLSをサポートします。

TLSを設定するための前提条件:

  • TLS証明書には、共通名(CN)またはサブジェクト代替名(SAN)にレジストリサービスホスト名(たとえば、RELEASE-registry.default.svc)を含める必要があります。
  • TLS証明書を生成した後:
    • Kubernetes TLSシークレットを作成します。
    • ca.crtキーを使用して、TLS証明書のCA証明書のみを含む別のシークレットを作成します。

TLSを有効にするには、次の手順に従ってください:

  1. registry.tls.enabledtrueに設定します。
  2. global.hosts.registry.protocolhttpsに設定します。
  3. Secret名を、それに応じてregistry.tls.secretNameglobal.certificates.customCAsに渡します。

registry.tls.verifytrueの場合、CA証明書Secret名をregistry.tls.caSecretNameに渡す必要があります。これは、自己署名証明書およびカスタムCAに必要です。このSecretは、NGINXがレジストリのTLS証明書を検証するために使用します。

例:

global:
  certificates:
    customCAs:
    - secret: registry-tls-ca
  hosts:
    registry:
      protocol: https

registry:
  tls:
    enabled: true
    secretName: registry-tls
    verify: true
    caSecretName: registry-tls-ca

コンテナレジストリの暗号スイート

通常、tls.cipherSuitesオプションは、レジストリがスタンドアロンモードでデプロイされているか、最新の暗号スイートをサポートしていないデフォルト以外のイングレスが使用されている非常に特殊な構成でのみ使用してください。標準的なGitLabのデプロイでは、NGINXイングレスは、コンテナレジストリバックエンドでサポートされている最高のTLSバージョン(現在はTLS1.3)を選択します。TLS1.3では暗号の構成は許可されておらず、デフォルトで安全です。何らかの理由でTLS1.3が利用できない場合、コンテナレジストリが使用しているデフォルトのTLS1.2暗号リストもNGINXイングレスのデフォルト設定と互換性があり、同様に安全です。

デバッグポートのTLSの構成

レジストリのデバッグポートもTLSをサポートします。デバッグポートは、Kubernetesの活性と準備状況のヘルスチェック、およびPrometheusの/metricsエンドポイントの公開に使用されます(有効な場合)。

TLSを有効にするには、registry.debug.tls.enabledtrueに設定します。Kubernetes TLS Secretは、デバッグポートのTLS構成での使用専用として、registry.debug.tls.secretNameで提供できます。専用のSecretが指定されていない場合、デバッグ構成はregistry.tls.secretNameをレジストリの通常のTLS構成と共有するようにフォールバックします。

Prometheusがhttpsを使用して/metrics/エンドポイントをスクレイプするには、証明書のCommonName属性またはSubjectAlternativeNameエントリの追加構成が必要です。これらの要件については、TLS対応エンドポイントをスクレイプするためのPrometheusの構成を参照してください。

networkpolicyの構成

このセクションでは、レジストリのNetworkPolicyを制御します。この構成はオプションであり、特定のエンドポイントへのレジストリのエグレスとイングレスを制限するために使用します。また、特定のエンドポイントへのイングレスを制限します。

名前デフォルト説明
enabledブール値falseこの設定は、レジストリのNetworkPolicyを有効にします
ingress.enabledブール値falsetrueに設定すると、Ingressネットワークポリシーがアクティブになります。これにより、ルールが指定されていない限り、すべてのイングレス接続がブロックされます。
ingress.rules配列[]イングレスポリシーのルール。詳細については、https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resourceおよび以下の例を参照してください。
egress.enabledブール値falsetrueに設定すると、Egressネットワークポリシーがアクティブになります。これにより、ルールが指定されていない限り、すべてのエグレス接続がブロックされます。
egress.rules配列[]エグレスポリシーのルール。詳細については、https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resourceおよび以下の例を参照してください。

すべての内部エンドポイントへの接続を防止するためのポリシーの例

レジストリサービスは通常、オブジェクトストレージ、Dockerクライアントからのイングレス接続、およびDNSルックアップ用のkube-DNSへのエグレス接続を必要とします。これにより、レジストリサービスに次のネットワーク制限が追加されます:

  • イングレスリクエストを許可します:
    • sidekiqwebservice、およびnginx-ingressからのポッドからポート5000
    • Prometheusポッドからポート9235
  • エグレスリクエストを許可します:
    • kube-dnsからポート53
    • S3またはSTSのAWS VPCエンドポイントなどのエンドポイントからポート443への172.16.1.0/24
    • インターネット0.0.0.0/0からポート443

注: レジストリサービスには、外部オブジェクトストレージ上のイメージへの送信接続が必要です(エンドポイントが使用されていない場合)

この例は、kube-dnsがネームスペースkube-systemにデプロイされ、prometheusがネームスペースmonitoringにデプロイされ、nginx-ingressがネームスペースnginx-ingressにデプロイされたという前提に基づいています。

networkpolicy:
  enabled: true
  ingress:
    enabled: true
    rules:
      - from:
          - namespaceSelector:
              matchLabels:
                kubernetes.io/metadata.name: nginx-ingress
            podSelector:
              matchLabels:
                app: nginx-ingress
                component: controller
        ports:
          - port: 5000
      - from:
          - namespaceSelector:
              matchLabels:
                kubernetes.io/metadata.name: monitoring
            podSelector:
              matchLabels:
                app: prometheus
                component: server
                release: gitlab
        ports:
          - port: 9235
      - from:
          - podSelector:
              matchLabels:
                app: sidekiq
        ports:
          - port: 5000
      - from:
          - podSelector:
              matchLabels:
                app: webservice
        ports:
          - port: 5000
  egress:
    enabled: true
    rules:
      - to:
          - namespaceSelector:
              matchLabels:
                kubernetes.io/metadata.name: kube-system
            podSelector:
              matchLabels:
                k8s-app: kube-dns
        ports:
          - port: 53
            protocol: UDP
      - to:
          - ipBlock:
              cidr: 172.16.1.0/24
        ports:
          - port: 443
      - to:
        - ipBlock:
            cidr: 0.0.0.0/0
            except:
            - 10.0.0.0/8

KEDAの構成

このkedaセクションでは、通常のHorizontalPodAutoscalersの代わりにKEDA ScaledObjectsのインストールを有効にします。この構成はオプションであり、カスタムまたは外部メトリクスに基づくオートスケールが必要な場合に使用できます。

ほとんどの設定は、該当する場合、hpaセクションで設定された値にデフォルトでフォールバックします。

以下がtrueの場合、hpaセクションで設定されたCPUとメモリのしきい値に基づいて、CPUおよびメモリートリガーが自動的に追加されます:

  • triggersが設定されていません。
  • 対応するrequest.cpu.requestまたはrequest.memory.request設定もゼロ以外の値に設定されています。

トリガーが設定されていない場合、ScaledObjectは作成されません。

これらの設定の詳細については、KEDAドキュメントを参照してください。

名前デフォルト説明
enabledブール値falseHorizontalPodAutoscalersの代わりにKEDA ScaledObjectsを使用します
pollingInterval整数30各トリガーをチェックする間隔
cooldownPeriod整数300リソースを0にスケールバックする前に、最後のトリガーがアクティブであるとレポートされてから待機する期間
minReplicaCount整数hpa.minReplicasKEDAがリソースをスケールダウンする最小レプリカ数。
maxReplicaCount整数hpa.maxReplicasKEDAがリソースをスケールアップする最大レプリカ数。
fallbackマップKEDAのフォールバック構成。詳細については、ドキュメントを参照してください。
hpaName文字列keda-hpa-{scaled-object-name}KEDAが作成するHPAリソースの名前。
restoreToOriginalReplicaCountブール値ターゲットリソースをScaledObjectの削除後に元のレプリカ数にスケールバックするかどうかを指定します
behaviorマップhpa.behaviorアップスケールとダウンスケールの動作の仕様。
triggers配列ターゲットリソースのスケールをアクティブにするトリガーのリスト。hpa.cpuおよびhpa.memoryから算出されたトリガーがデフォルトになります

すべての内部エンドポイントへの接続を防止するためのポリシーの例

レジストリサービスは通常、オブジェクトストレージ、Dockerクライアントからのイングレス接続、およびDNSルックアップ用のkube-DNSへのエグレス接続を必要とします。これにより、レジストリサービスに次のネットワーク制限が追加されます:

  • 10.0.0.0/8ポート53のローカルネットワークへのすべてのエグレスリクエストが許可されます(kubeDNSの場合)
  • 10.0.0.0/8上のローカルネットワークへの他のエグレスリクエストは制限されています
  • 10.0.0.0/8の外部へのエグレスリクエストは許可されます

注: レジストリサービスには、外部オブジェクトストレージ上のイメージへの送信接続が必要です

networkpolicy:
  enabled: true
  egress:
    enabled: true
    # The following rules enable traffic to all external
    # endpoints, except the local
    # network (except DNS requests)
    rules:
      - to:
        - ipBlock:
            cidr: 10.0.0.0/8
        ports:
        - port: 53
          protocol: UDP
      - to:
        - ipBlock:
            cidr: 0.0.0.0/0
            except:
            - 10.0.0.0/8

レジストリ構成の定義

このチャートの次のプロパティは、基盤となるregistryコンテナの構成に関係しています。GitLabとのインテグレーションのための最も重要な値のみが公開されます。このインテグレーションでは、JWT authenticationを介してレジストリへの認証を制御する、Docker Distributionauth.token.x設定を利用します。

httpSecret

フィールドhttpSecretは、secretkeyの2つの項目を含むマップです。

この参照がキーの内容は、registryhttp.secret値に対応します。この値には、暗号で生成されたランダムな文字列が入力された必要があります。

shared-secretsジョブは、提供されていない場合、このSecretを自動的に作成します。これは、安全に生成された128文字の英数字文字列で、base64でエンコードされます。

このSecretを手動で作成するには:

kubectl create secret generic gitlab-registry-httpsecret --from-literal=secret=strongrandomstring

通知Secret

通知Secretは、Geoがプライマリサイトとセカンダリサイト間でContainerレジストリデータを同期するのを支援するなど、さまざまな方法でGitLabアプリケーションにコールバックするために利用されます。

notificationSecret secretオブジェクトは、shared-secrets機能が有効になっている場合、提供されていなければ自動的に作成されます。

このSecretを手動で作成するには:

kubectl create secret generic gitlab-registry-notification --from-literal=secret=[\"strongrandomstring\"]

次に、以下を設定します

global:
  # To provide your own secret
  registry:
    notificationSecret:
        secret: gitlab-registry-notification
        key: secret

  # If utilising Geo, and wishing to sync the container registry.
  # Define this in the primary site configs only.
  geo:
    registry:
      replication:
        enabled: true
        primaryApiUrl: <URL to primary registry>

secretの値が、上記で作成されたSecretの名前に設定されていることを確認します

RedisキャッシュSecret

global.redis.auth.enabledtrueに設定されている場合、RedisキャッシュSecretが使用されます。

shared-secrets機能が有効になっている場合、gitlab-redis-secret Secretオブジェクトは、提供されていない場合に自動的に作成されます。

このSecretを手動で作成するには、Redisパスワードの手順を参照してください。

authEndpoint

authEndpointフィールドは文字列で、registryが認証するGitLabインスタンスへのURLを提供します。

値には、プロトコルとホスト名のみを含める必要があります。チャートテンプレートは、必要なリクエストパスを自動的に追加します。結果の値は、コンテナ内のauth.token.realmに入力されたされます。例: authEndpoint: "https://gitlab.example.com"

デフォルトでは、このフィールドには、グローバル設定によって設定されたGitLabホスト名の構成が入力されたされます。

certificate

certificateフィールドは、secretkeyの2つの項目を含むマップです。

secretは、GitLabインスタンスによって作成されたトークンの検証に使用される証明書バンドルを格納するKubernetes Secretの名前を含む文字列です。

keyは、registryコンテナにauth.token.rootcertbundleとして提供される証明書バンドルを格納するSecretkeyの名前です。

デフォルトの例:

certificate:
  secret: gitlab-registry
  key: registry-auth.crt

準備状況プローブと活性プローブ

デフォルトでは、デバッグポートであるポート5001/debug/healthをチェックするために構成された準備状況プローブと活性プローブがあります。

validation

validationフィールドは、レジストリ内のDockerイメージの検証プロセスを制御するマップです。イメージの検証が有効になっている場合、検証スタンザ内のmanifests.urls.allowフィールドでこれらのレイヤーのURLを許可するように明示的に設定されていない限り、レジストリは外部レイヤーを持つWindowsイメージを拒否します。

検証はマニフェストのプッシュ中にのみ行われるため、レジストリにすでに存在するイメージは、このセクションの値の変更の影響を受けません。

イメージの検証はデフォルトでオフになっています。

イメージの検証を有効にするには、registry.validation.disabled: falseを明示的に設定する必要があります。

manifests

manifestsフィールドを使用すると、マニフェストに固有の検証ポリシーを構成できます。

urlsセクションには、allowフィールドとdenyフィールドの両方が含まれています。検証に合格するためのURLを含むマニフェストレイヤーの場合、そのレイヤーはallowフィールドの正規表現のいずれかと一致し、denyフィールドの正規表現とは一致してはいけません。

名前デフォルト説明
referencelimit整数01つのマニフェストが持つことができる、レイヤー、イメージ構成、その他のマニフェストなどの参照の最大数。0(デフォルト)に設定すると、この検証は無効になります。
payloadsizelimit整数0マニフェストペイロードの最大データサイズ(バイト単位)。0(デフォルト)に設定すると、この検証は無効になります。
urls.allow配列[]マニフェストのレイヤー内のURLを有効にする正規表現のリスト。空(デフォルト)のままにすると、URLを含むレイヤーはすべて拒否されます。
urls.deny配列[]マニフェストのレイヤー内のURLを制限する正規表現のリスト。空(デフォルト)のままにすると、urls.allowリストに合格したURLを持つレイヤーは拒否されません

notifications

このnotificationsフィールドは、レジストリ通知を設定するために使用されます。デフォルト値として空のハッシュがあります。

名前デフォルト説明
endpoints配列[]各項目がエンドポイントに対応する項目のリスト
eventsハッシュ{}イベント通知で提供される情報

設定例は次のようになります:

notifications:
  endpoints:
    - name: FooListener
      url: https://foolistener.com/event
      timeout: 500ms
      # DEPRECATED: use `maxretries` instead https://gitlab.com/gitlab-org/container-registry/-/issues/1243.
      # When using `maxretries`, `threshold` is ignored: https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md?ref_type=heads#endpoints
      threshold: 10
      maxretries: 10
      backoff: 1s
    - name: BarListener
      url: https://barlistener.com/event
      timeout: 100ms
      # DEPRECATED: use `maxretries` instead https://gitlab.com/gitlab-org/container-registry/-/issues/1243.
      # When using `maxretries`, `threshold` is ignored: https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md?ref_type=heads#endpoints
      threshold: 3
      maxretries: 5
      backoff: 1s
  events:
    includereferences: true

hpa

hpaフィールドは、セットの一部として作成するregistryインスタンスの数を制御するオブジェクトです。デフォルトでは、minReplicasの値が2maxReplicasの値が10、cpu.targetAverageUtilizationが75%に設定されます。

storage

storage:
  secret:
  key: config
  extraKey:

storageフィールドは、Kubernetes Secretと関連付けられたキーへの参照です。このSecretの内容は、Registry Configuration: storageから直接取得されます。詳細については、そのドキュメントを参照してください。

AWS S3およびGoogle GCSドライバーの例は、examples/objectstorageにあります:

S3の場合は、正しいレジストリストレージの属性を与えることを確認してください。ストレージ構成の詳細については、管理ドキュメントのContainerレジストリストレージドライバーを参照してください。

storageブロックの_コンテンツ_をSecretに配置し、次の項目をstorageマップに提供します:

  • secret: YAMLブロックを格納するKubernetes Secretの名前。
  • key: 使用するSecret内のキーの名前。configがデフォルトです。
  • extraKey: _(オプション)_コンテナ内の/etc/docker/registry/storage/${extraKey}にマウントされるSecret内の追加のキーの名前。これは、gcsドライバーにkeyfileを提供するために使用できます。
# Example using S3
kubectl create secret generic registry-storage \
    --from-file=config=registry-storage.yaml

# Example using GCS with JSON key
# - Note: `registry.storage.extraKey=gcs.json`
kubectl create secret generic registry-storage \
    --from-file=config=registry-storage.yaml \
    --from-file=gcs.json=example-project-382839-gcs-bucket.json

ストレージドライバーのリダイレクトを無効にし、すべてのトラフィックが別のバックエンドにリダイレクトされる代わりにレジストリサービスを通過するようにすることができます:

storage:
  secret: example-secret
  key: config
  redirect:
    disable: true

filesystemドライバーを使用することを選択した場合:

  • このデータには永続ボリュームを提供する必要があります。
  • hpa.minReplicas1に設定する必要があります
  • hpa.maxReplicas1に設定する必要があります

回復力と簡素化のために、s3gcsazure、またはその他の互換性のあるオブジェクトストレージなどの外部サービスを利用することをお勧めします。

チャートは、ユーザーが指定していない場合、デフォルトでこの構成にdelete.enabled: trueを入力されたます。これにより、期待される動作がMinIOのデフォルトの使用法、およびLinuxパッケージと一致したままになります。ユーザーが指定した値は、このデフォルトより優先されます。

middleware.storage

middleware.storageの設定は、アップストリームの慣例に従います:

設定は非常に一般的で、同様のパターンに従います:

middleware:
  # See https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#middleware
  storage:
    - name: cloudfront
      options:
        baseurl: https://abcdefghijklmn.cloudfront.net/
        # `privatekey` is auto-populated with the content from the privatekey Secret.
        privatekeySecret:
          secret: cloudfront-secret-name
          # "key" value is going to be used to generate filename for PEM storage:
          #   /etc/docker/registry/middleware.storage/<index>/<key>
          key: private-key-ABC.pem
        keypairid: ABCEDFGHIJKLMNOPQRST

上記のコードでは、options.privatekeySecretは、PEMファイルの内容に対応するコンテンツを持つgeneric Kubernetesのシークレットです:

kubectl create secret generic cloudfront-secret-name --type=kubernetes.io/ssh-auth --from-file=private-key-ABC.pem=pk-ABCEDFGHIJKLMNOPQRST.pem

アップストリームで使用されるprivatekeyは、privatekeyシークレットからチャートによって自動的に入力されたものであり、指定された場合、無視されます。

keypairidのバリアント

さまざまなベンダーが、同じコンストラクトに異なるフィールド名を使用しています:

ベンダーフィールド名
Google CDNkeyname
クラウドフロントkeypairid

現時点では、middleware.storageセクションの設定のみがサポートされています。

debug

デバッグポートはデフォルトで有効になっており、ヘルスチェックに使用されます。さらに、Prometheusのメトリクスは、metrics値を介して有効にできます。

debug:
  addr:
    port: 5001

metrics:
  enabled: true

health

healthプロパティはオプションであり、ストレージドライバーのバックエンドストレージに対する定期的なヘルスチェックの優先順位が含まれています。詳細については、Dockerの構成ドキュメントを参照してください。

health:
  storagedriver:
    enabled: false
    interval: 10s
    threshold: 3

reporting

reportingプロパティはオプションで、レポートを有効にします。

reporting:
  sentry:
    enabled: true
    dsn: 'https://<key>@sentry.io/<project>'
    environment: 'production'

profiling

profilingプロパティはオプションで、継続的なプロファイリングを有効にします。

profiling:
  stackdriver:
    enabled: true
    credentials:
      secret: gitlab-registry-profiling-creds
      key: credentials
    service: gitlab-registry

database

databaseプロパティはオプションで、メタデータデータベースを有効にします。

この機能を有効にする前に、管理ドキュメントを参照してください。

この機能には、PostgreSQL 13以降が必要です。

database:
  enabled: true
  host: registry.db.example.com
  port: 5432
  user: registry
  password:
    secret: gitlab-postgresql-password
    key: postgresql-registry-password
  dbname: registry
  sslmode: verify-full
  ssl:
    secret: gitlab-registry-postgresql-ssl
    clientKey: client-key.pem
    clientCertificate: client-cert.pem
    serverCA: server-ca.pem
  connecttimeout: 5s
  draintimeout: 2m
  preparedstatements: false
  primary: 'primary.record.fqdn'
  pool:
    maxidle: 25
    maxopen: 25
    maxlifetime: 5m
    maxidletime: 5m
  migrations:
    enabled: true
    activeDeadlineSeconds: 3600
    backoffLimit: 6
  backgroundMigrations:
    enabled: true
    maxJobRetries: 3
    jobInterval: 10s

ロードバランシング

これは活発に開発中の試験的な機能であり、本番環境で使用しないでください。

loadBalancingセクションでは、データベースロードバランシングを設定できます。この機能を動作させるには、対応するRedis接続を有効にする必要があります。

データベースを管理します

データベースの作成とメンテナンスの詳細については、Containerレジストリメタデータデータベースページを参照してください。

gcプロパティ

gcプロパティは、オンラインガベージコレクションオプションを提供します。

オンラインガベージコレクションでは、メタデータデータベースを有効にする必要があります。データベースを使用する場合はオンラインガベージコレクションを使用する必要がありますが、メンテナンスとデバッグのために、オンラインガベージコレクションを一時的に無効にすることができます。

gc:
  disabled: false
  maxbackoff: 24h
  noidlebackoff: false
  transactiontimeout: 10s
  reviewafter: 24h
  manifests:
    disabled: false
    interval: 5s
  blobs:
    disabled: false
    interval: 5s
    storagetimeout: 5s

Redisキャッシュ

Redisキャッシュは、バージョン16.4以降のベータ機能です。この機能を有効にする前に、フィードバックイシューと関連ドキュメントをレビューしてください。

redis.cacheプロパティはオプションであり、Redisキャッシュに関連するオプションを提供します。redis.cacheをレジストリで使用するには、メタデータデータベースを有効にする必要があります。

例:

redis:
  cache:
    enabled: true
    host: localhost
    port: 16379
    password:
      secret: gitlab-redis-secret
      key: redis-password
    db: 0
    dialtimeout: 10ms
    readtimeout: 10ms
    writetimeout: 10ms
    tls:
      enabled: true
      insecure: true
    pool:
      size: 10
      maxlifetime: 1h
      idletimeout: 300s

クラスタリング

redis.cache.clusterプロパティは、Redisクラスタリングに接続するためのホストとポートのリストです。例:

redis:
  cache:
    enabled: true
    host: redis.example.com
    cluster:
      - host: host1.example.com
        port: 6379
      - host: host2.example.com
        port: 6379

センチネル

redis.cacheglobal.redis.sentinels構成を使用できます。ローカル値を指定すると、グローバル値よりも優先されます。例:

redis:
  cache:
    enabled: true
    host: redis.example.com
    sentinels:
      - host: sentinel1.example.com
        port: 16379
      - host: sentinel2.example.com
        port: 16379

Redis Sentinelパスワードのサポート

redis.cacheでは、global.redis.sentinelAuth構成を使用して、Redis Sentinelの認証パスワードを使用することもできます。ローカル値を指定すると、グローバル値よりも優先されます。例:

redis:
  cache:
    enabled: true
    host: redis.example.com
    sentinels:
      - host: sentinel1.example.com
        port: 16379
      - host: sentinel2.example.com
        port: 16379
    sentinelpassword:
      enabled: true
      secret: registry-redis-sentinel
      key: password

Redisレート制限

Redisのレート制限は開発中です。機能に関する詳細情報は、利用可能になり次第、このセクションに追加されます。

redis.rateLimitingプロパティはオプションで、Redisレート制限に関連するオプションを提供します。

例:

redis:
  rateLimiting:
    enabled: true
    host: localhost
    port: 16379
    username: registry
    password:
      secret: gitlab-redis-secret
      key: redis-password
    db: 0
    dialtimeout: 10ms
    readtimeout: 10ms
    writetimeout: 10ms
    tls:
      enabled: true
      insecure: true
    pool:
      size: 10
      maxlifetime: 1h
      idletimeout: 300s

データベースロードバランシング用Redis

  • ステータス: 実験的機能

データベースロードバランシングは、活発に開発中の試験的な機能であり、本番環境で使用しないでください。エピック8591を使用して進捗状況を把握し、フィードバックを共有してください。

redis.loadBalancingプロパティはオプションであり、データベースロードバランシング用のRedis接続に関連するオプションを提供します。

例:

redis:
  loadBalancing:
    enabled: true
    host: localhost
    port: 16379
    username: registry
    password:
      secret: gitlab-redis-secret
      key: redis-password
    db: 0
    dialtimeout: 10ms
    readtimeout: 10ms
    writetimeout: 10ms
    tls:
      enabled: true
      insecure: true
    pool:
      size: 10
      maxlifetime: 1h
      idletimeout: 300s

ガベージコレクション

Dockerレジストリは、時間の経過とともに余分なデータを蓄積しますが、これはガベージコレクションを使用して解放できます。現在、このチャートでガベージコレクションを完全に自動化またはスケジュールする方法はありません。

オンラインガベージコレクションは、メタデータデータベースで使用する必要があります。メタデータデータベースで手動ガベージコレクションを使用すると、データが失われる可能性があります。オンラインガベージコレクションは、手動でガベージコレクションを実行する必要性を完全に置き換えます。

手動ガベージコレクション

手動ガベージコレクションでは、最初にレジストリを読み取り専用モードにする必要があります。Helmを使用してGitLabチャートをすでにインストールし、mygitlabという名前を付け、ネームスペースgitlabnsにインストールしたと仮定しましょう。実際の構成に従って、以下のコマンドでこれらの値を置き換えます。

# Because of https://github.com/helm/helm/issues/2948 we can't rely on --reuse-values, so let's get our current config.
helm get values mygitlab > mygitlab.yml
# Upgrade Helm installation and configure the registry to be read-only.
# The --wait parameter makes Helm wait until all ressources are in ready state, so we are safe to continue.
helm upgrade mygitlab gitlab/gitlab -f mygitlab.yml --set registry.maintenance.readonly.enabled=true --wait
# Our registry is in r/o mode now, so let's get the name of one of the registry Pods.
# Note down the Pod name and replace the '<registry-pod>' placeholder below with that value.
# Replace the single quotes to double quotes (' => ") if you are using this with Windows' cmd.exe.
kubectl get pods -n gitlabns -l app=registry -o jsonpath='{.items[0].metadata.name}'
# Run the actual garbage collection. Check the registry's manual if you really want the '-m' parameter.
kubectl exec -n gitlabns <registry-pod> -- /bin/registry garbage-collect -m /etc/docker/registry/config.yml
# Reset registry back to original state.
helm upgrade mygitlab gitlab/gitlab -f mygitlab.yml --wait
# All done :)

Containerレジストリに対する管理コマンドの実行

管理コマンドは、レジストリポッドからのみContainerレジストリに対して実行できます。ここでは、registryバイナリと必要な設定の両方を使用できます。イシュー #2629が開き、この機能をツールボックスポッドから提供する方法について話し合っています。

管理コマンドを実行するには:

  1. レジストリポッドに接続します:

    kubectl exec -it <registry-pod> -- bash
  2. レジストリポッド内に入ると、registryバイナリはPATHで使用できるようになり、直接使用できます。設定ファイルは/etc/docker/registry/config.ymlで利用できます。次の例では、データベース移行のステータスを確認します:

    registry database migrate status /etc/docker/registry/config.yml

詳細およびその他の使用可能なコマンドについては、関連ドキュメントを参照してください:

レジストリレート制限設定

レジストリは、コンテナレジストリインスタンスへのトラフィックを制御するために、レート制限で構成できます。これにより、乱用、DoS攻撃、または過度の使用からレジストリを保護できます。

  • レート制限では、registry.redis.rateLimiting設定を使用してRedisを適切に構成する必要があります。
  • レート制限は、デフォルトでは無効になっています。registry.rateLimiter.enabled: trueに設定して有効にします。
  • レート制限は、優先順位の高い順に適用されます(値が低いものが最初)。
  • log_onlyオプションは、レート制限を適用する前にテストする場合に役立ちます。

レート制限設定

コンテナレジストリのレート制限を有効にして構成するには、registry.rateLimiter設定を使用します:

registry:
  rateLimiter:
    enabled: true
    limiters:
      - name: global_rate_limit
        description: "Global IP rate limit"
        log_only: false
        match:
          type: IP
        precedence: 10
        limit:
          rate: 5000
          period: "minute"
          burst: 8000
        action:
          warn_threshold: 0.7
          warn_action: "log"
          hard_action: "block"

制限設定

レート制限は、レート制限ルールを定義するために、リミッターのリストを使用します。各レート制限には、次のプロパティがあります:

  • name: レート制限の識別子
  • description: レート制限の目的を人間が読んで理解できる説明
  • log_only: trueに設定すると、違反は強制なしでログに記録されるだけです
  • precedence: レート制限が評価される順序を定義します(値が低いものが最初)
  • match: リクエストを照合するための基準
  • limit: レート制限パラメータ
  • action: 制限に達した場合に実行するアクション

制限構成

limitセクションでは、実際レート制限パラメータを定義します:

limit:
  rate: 100       # Number of requests allowed
  period: "minute" # Time period (second, minute, hour, day)
  burst: 200      # Allowed burst capacity

アクション構成

actionセクションでは、制限に近づいたとき、または制限に達したときに何が起こるかを定義します:

action:
  warn_threshold: 0.7      # Percentage of limit to trigger warning
  warn_action: "log"       # Action when warning threshold is reached
  hard_action: "block"     # Action when limit is reached

グローバルIPレート制限

この例では、単一のIPアドレスからのすべてのリクエストを制限します:

- name: global_rate_limit
  description: "Global IP rate limit"
  log_only: false
  match:
    type: IP
  precedence: 10
  limit:
    rate: 5000
    period: "minute"
    burst: 8000
  action:
    warn_threshold: 0.7
    warn_action: "log"
    hard_action: "block"