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

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

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

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

このチャートは主に3つのパートで構成されています:

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

設計上の選択肢

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

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

必須

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

オプション

  • 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証明書
debug.addr.port5001デバッグポート
debug.tls.enabledfalseレジストリのデバッグポートのTLSを有効にします。LivenessおよびReadinessプローブ、ならびにメトリクスエンドポイント(有効な場合)に影響します。
debug.tls.secretNameレジストリデバッグエンドポイント用の有効な証明書とキーを含むKubernetes TLSシークレットの名前。設定されておらずdebug.tls.enabled=trueの場合、デバッグTLS設定はレジストリのTLS証明書にデフォルトで設定されます。
debug.prometheus.enabledfalseDEPRECATED metrics.enabledを使用
debug.prometheus.path""DEPRECATED metrics.pathを使用
metrics.enabledfalseメトリクスエンドポイントをスクレイプ可能にするかどうか
metrics.path/metricsメトリクスエンドポイントパス
metrics.serviceMonitor.enabledfalsePrometheus Operatorがメトリクスのスクレイプを管理できるようにServiceMonitorを作成する場合、これを有効にするとprometheus.ioスクレイプアノテーションが削除されることに注意してください。
metrics.serviceMonitor.additionalLabels{}ServiceMonitorに追加する追加のラベル
metrics.serviceMonitor.endpointConfig{}ServiceMonitor用の追加のエンドポイント設定
deployment.terminationGracePeriodSeconds30ポッドが正常に終了するまでに必要なオプションの期間(秒単位)。
deployment.strategy{}デプロイによって利用される更新戦略を設定できます。
draintimeout'0'SIGTERMシグナルを受信した後、HTTP接続がドレインするまで待機する時間(例: '10s'
relativeurlsfalseレジストリがLocationヘッダーで相対URLを返すことを有効にします。
enabledtrueレジストリフラグを有効にする
api.enabledtrueService、Deployment、HPA、およびPDBリソースを有効にします。
extraContainers含めるコンテナのリストを含む複数行リテラルスタイルの文字列
extraInitContainers含める追加のinitコンテナのリスト
hpa.behavior{scaleDown: {stabilizationWindowSeconds: 300 }}Behaviorには、スケールアップおよびスケールダウン動作の仕様が含まれます(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.pullPolicyレジストリイメージのプルポリシー
image.pullSecretsイメージリポジトリに使用するシークレット
image.repositoryregistry.gitlab.com/gitlab-org/build/cng/gitlab-container-registryレジストリイメージ
image.tagv4.15.2-gitlab使用するイメージのバージョン
init.image.repositoryinitContainerイメージ
init.image.taginitContainerイメージタグ
init.containerSecurityContextinitContainer固有のsecurityContext
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レガシーレジストリバケット名
maintenance.readonly.enabledfalseレジストリの読み取り専用モードを有効にする
maintenance.uploadpurging.enabledtrueアップロードパージを有効にする
maintenance.uploadpurging.age168h指定された期間より古いアップロードをパージする
maintenance.uploadpurging.interval24hアップロードパージが実行される頻度
maintenance.uploadpurging.dryrunfalse削除せずにパージされるアップロードをリストするのみ
priorityClassNameポッドに割り当てられたPriority class
reporting.sentry.enabledfalseSentryを使用したレポートを有効にする
reporting.sentry.dsnSentry DSN(Data Source Name)
reporting.sentry.environmentSentry環境
profiling.stackdriver.enabledfalseStackdriverを使用した継続的プロファイリングを有効にする
profiling.stackdriver.credentials.secretgitlab-registry-profiling-creds認証情報を含むシークレットの名前
profiling.stackdriver.credentials.keycredentials認証情報が保存されているシークレット内のキー
profiling.stackdriver.serviceRELEASE-registry(テンプレート化されたService名)プロファイルを記録するStackdriverサービスの名前
profiling.stackdriver.projectid実行中のGCPプロジェクトプロファイルを報告するGCPプロジェクト
database.configurefalseレジストリチャートにデータベース設定を入力しますが、有効にはしません。既存のレジストリをインポートする場合に必要です。
database.enabledfalseメタデータデータベースを有効にします。これは実験的機能であり、本番環境で使用してはなりません。
database.hostglobal.psql.hostデータベースサーバーのホスト名。
database.portglobal.psql.portデータベースサーバーのポート。
database.userデータベースのユーザー名。
database.password.secretRELEASE-registry-database-passwordデータベースパスワードを含むシークレットの名前。
database.password.keypasswordデータベースパスワードが保存されているシークレット内のキー。
database.nameデータベース名。
database.sslmodeThe SSL mode.disableallowpreferrequireverify-caまたはverify-fullのいずれか。
database.ssl.secretglobal.psql.ssl.secretクライアント証明書、キー、および認証局を含むシークレット。メインの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ターゲットプライマリデータベースサーバー。これは、レジストリdatabase.migrationsを実行する際にターゲットとする専用のFQDNを指定するために使用されます。指定されていない場合、hostdatabase.migrationsの実行に使用されます。
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チャートの初期デプロイおよびアップグレード時に、移行ジョブを自動的に実行できるようにします。移行は、実行中のいずれかのレジストリポッド内から手動で実行することもできます。
database.migrations.activeDeadlineSeconds3600移行ジョブのactiveDeadlineSecondsを設定します。
database.migrations.annotations{}移行ジョブに追加する追加のアノテーション。
database.migrations.backoffLimit6移行ジョブのbackoffLimitを設定します。
database.backgroundMigrations.enabledfalseデータベースのバックグラウンド移行を有効にします。これはレジストリメタデータデータベース用の実験的機能です。本番環境では使用しないでください。動作の詳細については、仕様を参照してください。
database.backgroundMigrations.jobInterval各バックグラウンド移行ジョブワーカーの実行間のスリープ間隔。指定されていない場合、レジストリによってデフォルト値が設定されます
database.backgroundMigrations.maxJobRetries失敗したバックグラウンド移行ジョブの最大再試行回数。指定されていない場合、レジストリによってデフォルト値が設定されます
database.metrics.enabledfalsetrueに設定すると、データベースメトリクス収集が有効になります。これは実験的機能であり、本番環境では使用しないでください。分散ロックには、レジストリ4.27.0以降、メタデータデータベース(database.enabled: true)、およびRedisキャッシュ(redis.cache.enabled: true)が必要です。
database.metrics.interval10sデータベースからメトリクスが収集される間隔。
database.metrics.leaseDuration30sRedisロックがメトリクスコレクターによって保持される期間。同じインスタンスによる継続的な収集を保証するために、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.enabledfalseサービスアカウントを使用するかどうかを示します。
serviceLabels{}補足のサービスラベル
tokenServicecontainer_registryJWTトークンサービス
tokenIssuergitlab-issuerJWTトークン発行者
tolerations[]ポッドの割り当てに対するTolerationラベル
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メインサーバー名。Sentinelにのみ適用可能です。
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 Sentinelがパスワードで保護されているかどうかを示します。redis.cache.sentinelpasswordが空の場合、global.redis.sentinelAuthの値が使用されます。redis.cache.sentinelsが定義されている場合にのみ使用されます。
redis.cache.sentinelpassword.secretgitlab-redis-secretRedis Sentinelパスワードを含むシークレットの名前。
redis.cache.sentinelpassword.keyredis-sentinel-passwordRedis Sentinelパスワードが保存されているシークレット内のキー。
redis.cache.db0各接続に使用するデータベースの名前。
redis.cache.dialtimeout0sRedisインスタンスに接続するためのタイムアウト。デフォルトではタイムアウトなし。
redis.cache.readtimeout0sRedisインスタンスからの読み取りのタイムアウト。デフォルトではタイムアウトなし。
redis.cache.writetimeout0sRedisインスタンスへの書き込みのタイムアウト。デフォルトではタイムアウトなし。
redis.cache.tls.enabledfalseTLSを有効にするにはtrueに設定します。
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メインサーバー名。Sentinelにのみ適用可能です。
redis.rateLimiting.usernameRedisインスタンスに接続するために使用されるユーザー名。
redis.rateLimiting.password.enabledfalseRedisインスタンスがパスワードで保護されているかどうかを示します。
redis.rateLimiting.password.secretgitlab-redis-secretRedisパスワードを含むシークレットの名前。shared-secrets機能が有効な場合、指定されていなければ自動的に作成されます。
redis.rateLimiting.password.keyredis-passwordRedisパスワードが保存されているシークレット内のキー。
redis.rateLimiting.sentinelpassword.enabledfalseRedis Sentinelがパスワードで保護されているかどうかを示します。redis.rateLimiting.sentinelpasswordが空の場合、global.redis.sentinelAuthの値が使用されます。redis.rateLimiting.sentinelsが定義されている場合にのみ使用されます。
redis.rateLimiting.sentinelpassword.secretgitlab-redis-secretRedis Sentinelパスワードを含むシークレットの名前。
redis.rateLimiting.sentinelpassword.keyredis-sentinel-passwordRedis Sentinelパスワードが保存されているシークレット内のキー。
redis.rateLimiting.db0各接続に使用するデータベースの名前。
redis.rateLimiting.dialtimeout0sRedisインスタンスに接続するためのタイムアウト。デフォルトではタイムアウトなし。
redis.rateLimiting.readtimeout0sRedisインスタンスからの読み取りのタイムアウト。デフォルトではタイムアウトなし。
redis.rateLimiting.writetimeout0sRedisインスタンスへの書き込みのタイムアウト。デフォルトではタイムアウトなし。
redis.rateLimiting.tls.enabledfalseTLSを有効にするにはtrueに設定します。
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メインサーバー名。Sentinelにのみ適用可能です。
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.enabledfalseTLSを有効にするにはtrueに設定します。
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

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

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

tolerations

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

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)と推奨(preferredDuringSchedulingIgnoredDuringExecution)。values.yamlantiAffinity変数を使用して、推奨モードが適用されるようにsoftに設定するか、必須モードが適用されるようにhardに設定します。
  • nodeAffinityルール:
    • 特定のゾーンまたは複数のゾーンに属するノードにポッドをスケジュールします。
    • nodeAffinityルールの2つのモードを設定します: 必須(requiredDuringSchedulingIgnoredDuringExecution)と推奨(preferredDuringSchedulingIgnoredDuringExecution)。softに設定すると、推奨モードが適用されます。hardに設定すると、必須モードが適用されます。このルールは、webservicesidekiqを除くすべてのサブチャートとともに、registryチャートとgitlabチャートにのみ実装されます。

nodeAffinityInオペレーターのみを実装します。

詳細については、関連する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、Deployment、HPA、PDBリソースは、registry.api.enabledの値(デフォルト:true)によって有効になります。

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

imageを設定する

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

デフォルト設定:

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

serviceを設定する

このセクションでは、Serviceの名前とタイプを制御します。これらの設定はvalues.yamlによって入力されます。

デフォルトでは、Serviceは次のように設定されます:

名前デフォルト説明
name文字列registryサービスの名前を設定します
type文字列ClusterIPサービスのタイプを設定します
externalPort整数5000Serviceによって公開されるポート
internalPort整数5000サービスからのリクエストを受け入れるためにポッドが使用するポート
clusterIP文字列null必要に応じてカスタムCluster IPを設定できます
loadBalancerIP文字列null必要に応じてカスタムLoadBalancer IPアドレスを設定できます

ingressを設定する

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

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

TLSを設定する

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

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

  • TLS証明書には、Common Name (CN) またはSubject Alternate Name (SAN) にレジストリサービスホスト名(例: RELEASE-registry.default.svc)を含める必要があります。
  • TLS証明書が生成された後:
    • Kubernetes TLSシークレットを作成します。
    • ca.crtキーを持つTLS証明書のCA証明書のみを含む別のシークレットを作成します。

TLSを有効にするには:

  1. registry.tls.enabledtrueに設定します。
  2. global.hosts.registry.protocolhttpsに設定します。
  3. シークレット名をregistry.tls.secretNameglobal.certificates.customCAsにそれぞれ渡します。

registry.tls.verifytrueの場合、CA証明書シークレット名をregistry.tls.caSecretNameに渡す必要があります。これは、自己署名証明書およびカスタム認証局に必要です。このシークレットは、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オプションは、レジストリがスタンドアロンモードでデプロイされ、かつ最新の暗号スイートをサポートしない非デフォルトIngressが使用されるような、非常にまれな設定でのみ使用されるべきです。標準のGitLabデプロイでは、NGINX Ingressはコンテナレジストリバックエンドがサポートする最高のTLSバージョンを選択します。これは現時点ではTLS1.3です。TLS1.3では暗号の設定は許可されておらず、デフォルトで安全です。何らかの理由でTLS1.3が利用できない場合でも、コンテナレジストリが使用しているデフォルトのTLS1.2暗号リストはNGINX Ingressのデフォルト設定とも互換性があり、同様に安全です。

デバッグポートのTLSを設定する

レジストリのデバッグポートもTLSをサポートしています。デバッグポートは、KubernetesのLivenessおよびReadinessチェック、ならびにPrometheus用の/metricsエンドポイント(有効な場合)の公開に使用されます。

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

Prometheusがhttpsを使用して/metrics/エンドポイントをスクレイプするには、証明書のCommonName属性またはSubjectAlternativeNameエントリに追加の設定が必要です。それらの要件については、TLSが有効なエンドポイントをスクレイプするようにPrometheusを設定するを参照してください。

networkpolicyを設定する

このセクションでは、レジストリのNetworkPolicyを制御します。この設定はオプションであり、レジストリのエグレスおよびIngressを特定のエンドポイントに制限するために使用されます。

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

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

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

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

注意:レジストリサービスは、エンドポイントが使用されていない場合、外部オブジェクトストレージ上のイメージのためにパブリックインターネットへの送信接続を必要とします

この例は、kube-dnskube-systemネームスペースにデプロイされ、prometheusmonitoringネームスペースにデプロイされ、nginx-ingressnginx-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セクションで設定された値にデフォルトで設定されます。

以下が真の場合、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.cpuhpa.memoryから計算されたトリガーにデフォルトで設定されます。

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

レジストリサービスは通常、オブジェクトストレージへのエグレス接続、DockerクライアントからのIngress接続、および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

レジストリ設定の定義

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

httpSecret

フィールドhttpSecretは、secretkeyの2つのアイテムを含むマップです。

これが参照するキーの内容は、レジストリhttp.secret値と相関します。この値は暗号学的に生成されたランダムな文字列で入力されるべきです。

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

このシークレットを手動で作成するには:

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

通知シークレット

通知シークレットは、GitLabアプリケーションへのさまざまな呼び出しに使用されます。Geoがプライマリサイトとセカンダリサイト間でコンテナレジストリデータの同期を管理するのに役立つなどです。

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

このシークレットを手動で作成するには:

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

次に、これらの設定を進め、secretの値が上記で作成されたシークレットの名前に設定されていることを確認してください。

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

Geoを利用し、コンテナレジストリをレプリケートすることを希望する場合は、次の2つの手順に従ってください:

  1. プライマリサイトの設定で:

    global:
      # To provide your own secret, as described above
      registry:
        notificationSecret:
            secret: gitlab-registry-notification
            key: secret
      geo:
        registry:
          replication:
            enabled: true
  2. セカンダリサイトの設定で:

    global:
      geo:
        registry:
          replication:
            enabled: true
            primaryApiUrl: <URL to primary registry>

    primaryApiUrlは、セカンダリサイトがプライマリサイトに対してプルを実行するために使用されます。

Redisキャッシュシークレット

Redisキャッシュシークレットは、global.redis.auth.enabledtrueに設定されている場合に使用されます。

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

このシークレットを手動で作成するには、Redisパスワードの指示を参照してください。

authEndpoint

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

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

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

certificate

certificateフィールドは、secretkeyの2つのアイテムを含むマップです。

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

keyは、レジストリコンテナにauth.token.rootcertbundleとして提供される証明書バンドルを収容するSecret内のkeyキーの名前です。

デフォルトの例:

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

ReadinessおよびLivenessプローブ

デフォルトでは、デバッグポートである5001ポートで/debug/healthをチェックするようにReadinessおよびLivenessプローブが設定されています。

validation

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

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

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

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

manifests

manifestsフィールドは、マニフェストに固有の検証ポリシーの設定を許可します。

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

名前デフォルト説明
referencelimit整数0単一のマニフェストが持つことができるレイヤー、イメージ設定、その他のマニフェストなどの参照の最大数。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フィールドはオブジェクトで、設定の一部として作成するレジストリのインスタンス数を制御します。これはminReplicasの値が2maxReplicasの値が10にデフォルト設定され、cpu.targetAverageUtilizationを75%に設定します。

storage

storage:
  secret:
  key: config
  extraKey:

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

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

S3の場合、正しいレジストリストレージのパーミッションを付与してください。ストレージの設定に関する詳細については、管理ドキュメントのコンテナレジストリストレージドライバーを参照してください。

_コンテンツ_をstorageブロックからシークレットに配置し、以下の項目をstorageマップに指定します:

  • secret: KubernetesシークレットのYAMLブロック名。
  • key: 使用するシークレット内のキーの名前。configがデフォルトです。
  • extraKey: _(オプション)_コンテナ内の/etc/docker/registry/storage/${extraKey}にマウントされるシークレットの追加キー名。これは、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

ストレージドライバーのリダイレクトを無効にすることで、すべてのトラフィックが別のバックエンドにリダイレクトされるのではなく、Registryサービスを介して流れるようにできます:

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

filesystemドライバーを使用する場合:

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

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

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シークレットによって自動的に入力され、指定されている場合はignored

keypairidバリアント

さまざまなベンダーが同じ構成に対して異なるフィールド名を使用しています:

ベンダーフィールド名
Google CDNkeyname
CloudFrontkeypairid

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プロパティはオプションであり、メタデータデータベースを有効にします。

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

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 Registryメタデータデータベースのページを参照してください。

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.cacheプロパティはオプションであり、Redisキャッシュに関連するオプションを提供します。Registryで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

Sentinel

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

Sentinelパスワードのサポート

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

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.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

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

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

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

手動ガベージコレクションには、まずRegistryが読み取り専用モードになっている必要があります。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 Registryに対する管理コマンドの実行

管理コマンドは、registryバイナリと必要な設定の両方が利用可能なRegistryポッドからのみ、Container Registryに対して実行できます。ツールボックスポッドからこの機能を提供する方法について議論するため、イシュー #2629がオープンされています。

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

  1. Registryポッドに接続します:

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

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

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

Registryレートリミッター設定

Registryは、コンテナRegistryインスタンスへのトラフィックを制御するために、レート制限で設定できます。これは、乱用、DoS攻撃、または過度な使用からRegistryを保護するのに役立ちます。

注記

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

レートリミッター設定

コンテナRegistryのレート制限を有効にして設定するには、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"