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

registry サブチャートは、Kubernetes上での完全なクラウドネイティブGitLabデプロイへのレジストリコンポーネントを提供します。このサブチャートは、Dockerディストリビューションを含むアップストリームレジストリコンテナを利用します。このChartは3つの主要な部分で構成されています:ServiceDeploymentConfigMapです。

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

設計の選択

このChartのデプロイ方法としてKubernetesDeployment が選ばれたのは、インスタンスをシンプルにスケーリングできるようにすると同時に、ローリングアップデートを可能にするためです。

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

必須

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

オプション

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

設定

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

registry:
  enabled:
  maintenance:
    readonly:
      enabled: false
    uploadpurging:
      enabled: true
      age: 168h
      interval: 24h
      dryrun: false
  image:
    tag: 'v3.80.0-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: []
  ingress:
    enabled: false
    tls:
      enabled: true
      secretName: redis
    annotations:
    configureCertmanager:
    proxyReadTimeout:
    proxyBodySize:
    proxyBuffering:
  networkpolicy:
    enabled: false
    egress:
      enabled: false
      rules: []
    ingress:
      enabled: false
      rules: []
  tls:
    enabled: false
    secretName:
    verify: true
    caSecretName:

このチャートをスタンドアロンとしてデプロイする場合は、トップ・レベルのregistry を削除してください。

インストールパラメータ

パラメータデフォルト説明
annotations ポッド注釈
podLabels ポッドラベルの補足。セレクタには使用されません。
common.labels このChartで作成されたすべてのオブジェクトに適用される補助ラベル。
authAutoRedirecttrueAuth auto-redirect(Windowsクライアントの場合はtrueにする必要があります。)
authEndpointglobal.hosts.gitlab.name認証エンドポイント(ホストとポートのみ)
certificate.secretgitlab-registryJWT証明書
debug.addr.port5001デバッグポート
debug.tls.enabledfalseレジストリのデバッグ・ポートのTLSを有効にします。LivenessおよびReadiness Probe、ならびにメトリクス・エンドポイント(有効な場合)に影響します。
debug.tls.secretName レジストリのデバッグエンドポイント用の有効な証明書とキーを含むKubernetes TLSシークレットの名前。設定されておらず、debug.tls.enabled=true - デバッグTLS設定は、レジストリのTLS証明書をデフォルトとします。
debug.prometheus.enabledfalse 廃止用途metrics.enabled
debug.prometheus.path"" 廃止用途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 シグナル (例:'10s') を受信した後、HTTP 接続が枯渇するまでの待機時間。
relativeurlsfalseLocationヘッダで相対URLを返すようにレジストリを有効にします。
enabledtrueレジストリを有効にするフラグ
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最大レプリカ数
httpSecret httpsのシークレット
extraEnvFrom 公開する他のデータソースの追加環境変数のリスト
image.pullPolicy レジストリ画像のプルポリシー
image.pullSecrets イメージリポジトリに使用するシークレット
image.repositoryregistry.gitlab.com/gitlab-org/build/cng/gitlab-container-registryレジストリ画像
image.tagv3.80.0-gitlab使用するイメージのバージョン
init.image.repository initContainer 画像
init.image.tag initContainer画像タグ
init.containerSecurityContext initContainer コンテナ固有のsecurityContext
keda.enabledfalseの代わりにKEDA ScaledObjects を使用します。HorizontalPodAutoscalers
keda.pollingInterval30各トリガーを
keda.cooldownPeriod300リソースを0にスケールバックする前に、最後のトリガがアクティブであると報告された後、待機する期間。
keda.minReplicaCount KEDAがリソースをスケールダウンする最小レプリカ数。hpa.minReplicas
keda.maxReplicaCount KEDAがリソースをスケールアップする際の最大レプリカ数。hpa.maxReplicas
keda.fallback KEDAフォールバック設定。
keda.hpaName KEDAが作成するHPAリソースの名前。keda-hpa-{scaled-object-name}
keda.restoreToOriginalReplicaCount  ScaledObject が削除された後、ターゲットリソースを元のレプリカ数にスケールバックするかどうかを指定します。
keda.behavior アップスケーリングとダウンスケーリングの動作を指定します。hpa.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 ポッドに割り当てられる優先度クラス
reporting.sentry.enabledfalseSentryを使用してレポーターを有効にします。
reporting.sentry.dsn Sentry DSN (データソース名)
reporting.sentry.environment Sentryの環境
profiling.stackdriver.enabledfalseStackdriverを使用した継続的なプロファイリングの有効化
profiling.stackdriver.credentials.secretgitlab-registry-profiling-credsコンテナを含むシークレットの名前
profiling.stackdriver.credentials.keycredentialsクレデンシャルが格納されているシークレットキー
profiling.stackdriver.service RELEASE-registry (テンプレート化されたサービス名)プロファイルを記録するStackdriverサービス名
profiling.stackdriver.projectid実行中のGCPプロジェクトプロファイルを報告するGCPプロジェクト
database.enabledfalseメタデータ・データベースを有効にします。これは実験的な機能であり、本番環境では使用しないでください。
database.hostglobal.psql.hostデータベース・サーバのホスト名。
database.portglobal.psql.portデータベースサーバーのポート。
database.user データベースのユーザー名。
database.password.secretRELEASE-registry-database-passwordデータベースのパスワードを含むシークレットの名前。
database.password.keypasswordデータベースパスワードが格納されているシークレットキー。
database.name データベース名。
database.sslmode SSL モード。disable,allow,prefer,require,verify-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.pool.maxidle0アイドル接続プール内の最大接続数。を下回るmaxopen maxidle場合は maxidle maxopen、制限maxopen 値に合わせて減らさ maxopenれます。ゼロまたは指定されていない場合は、アイドル接続がないことを意味します。
database.pool.maxopen0データベースへのオープン接続の最大数。maxopen maxidlemaxidle maxopen下回る場合は、制限値に合うmaxopen ように減らさ maxopenれます。ゼロまたは指定されていない場合は、無制限のオープン接続を意味します。
database.pool.maxlifetime0接続を再利用できる最大時間。期限切れの接続は、再利用の前に遅延的に閉じることができます。ゼロまたは指定なしは、再利用が無制限であることを意味します。
database.pool.maxidletime0接続がアイドルである最大時間。期限切れになった接続は、再利用する前に強制的に閉じることができます。ゼロまたは指定なしは、無制限を意味します。
database.migrations.enabledtrueマイグレーションジョブを有効にすると、Chartの初期デプロイ時およびアップグレード時にマイグレーションが自動的に実行されます。マイグレーションは、実行中のレジストリポッド内から手動で実行することもできます。
database.migrations.activeDeadlineSeconds3600マイグレーションジョブのactiveDeadlineSecondsを設定します。
database.migrations.backoffLimit6マイグレーションジョブにbackoffLimitを設定します。
database.discovery.enabledfalseデータベースのサービス検出を有効にします。これはレジストリ・メタデータ・データベースの実験的な機能です。本番環境では使用しないでください。
database.discovery.nameserver サービス検出用のネームサーバー(DNS) のサーバーアドレスまたは FQDN を設定します。database.discovery.enabledtrue に設定されている場合に必要です。
database.discovery.port53ネームサーバーのポートを設定します。デフォルトは53です。
database.discovery.primaryrecord  nameserver から取得する必要がある SRV リソースレコード。primaryrecorddatabase.migrations を実行するために使用されます。
database.discovery.tcpfalseUDP ではなく TCP 接続が必要な場合は、true に設定します。
gc.disabledtrue trueに設定すると、オンライン GC ワーカーが無効になります。
gc.maxbackoff24hエラー発生時のワーカー実行間のスリープに使用される最大指数バックオフ時間。gc.noidlebackofftrue でない限り、処理するタスクがないときにも適用されます。最大 33% のランダムなジッター要因が常に追加されるため、これは絶対的な最大値ではないことに注意してください。
gc.noidlebackofffalse true に設定すると、処理するタスクがないときのワーカー実行間の指数関数的なバックオフを無効にします。
gc.transactiontimeout10s各 Worker が実行するデータベーストランザクションのタイムアウト。各 Worker は開始時にデータベーストランザクションを開始します。このタイムアウトを超えるとワーカーの実行はキャンセルされ、停止したり長時間実行されたりするトランザクションを回避します。
gc.blobs.disabledfalse true に設定すると、blob の GC ワーカーは無効になります。
gc.blobs.interval5s各ワーカーの実行間の初期スリープ間隔。
gc.blobs.storagetimeout5sストレージ オペレーションのタイムアウト。ストレージバックエンドでぶら下がっている blob を削除するリクエストの時間を制限するために使います。
gc.manifests.disabledfalse true に設定すると、マニフェストの GC ワーカーが無効になります。
gc.manifests.interval5s各ワーカーの実行間の初期スリープ間隔。
gc.reviewafter24h -1 は待機なしを意味します。
securityContext.fsGroup1000ポッドを起動するグループID
securityContext.runAsUser1000ポッドを起動するユーザーID
securityContext.fsGroupChangePolicy ボリュームの所有権と権限を変更するためのポリシー (Kubernetes 1.23 が必要)
containerSecurityContext コンテナが起動するコンテナsecurityContext をオーバーライドします。
containerSecurityContext.runAsUser1000コンテナが起動される特定のセキュリティコンテキストを上書きできるようにします。
serviceLabels{}補足サービスラベル
tokenServicecontainer_registryJWTトークンサービス
tokenIssuergitlab-issuerJWTトークン発行者
tolerations[]ポッド割り当て用のトレラベル
middleware.storage ミッドウェア・ストレージ(インスタンスンスS3)の設定レイヤー
redis.cache.enabledfalse true に設定すると、Redisキャッシュが有効になります。この機能は、メタデータデータベースが有効になっていることに依存します。リポジトリのメタデータは、設定されたRedisインスタンスにキャッシュされます。
redis.cache.host<Redis URL>Redis インスタンスのホスト名。空の場合はglobal.redis.host:global.redis.port となります。
redis.cache.port6379Redis インスタンスのポート。
redis.cache.sentinels[]センチネルをホストとポートでリストします。
redis.cache.mainname メインサーバー名。センチネルにのみ適用されます。
redis.cache.password.enabledfalseレジストリで使用されるRedisキャッシュがパスワードで保護されているかどうかを示します。
redis.cache.password.secretgitlab-redis-secretRedis パスワードを含むシークレットの名前。これは、shared-secrets 機能が有効な場合に、提供されなければ自動的に作成されます。
redis.cache.password.keyredis-passwordRedisのパスワードが格納されているシークレットキー。
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非アクティブな接続を閉じるまでの待ち時間。

Chart設定例

プルシークレット

pullSecrets を使用すると、非公開レジストリで認証してポッドのイメージをプルできるようになります。

非公開レジストリとその認証方法の詳細については、Kubernetesのドキュメントを参照してください。

以下は、pullSecrets の使用例です:

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

許容範囲

tolerations 汚染されたワーカーノードでポッドのスケジューリングが可能

以下は、tolerations の使用例です:

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

注釈

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

以下はannotations

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

サブチャートを有効にします。

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

レジストリはデフォルトで有効になっています。無効にしたい場合は、enabled: false を設定します。

設定image

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

デフォルト設定:

  • tag: 'v3.80.0-gitlab'
  • pullPolicy: 'IfNotPresent'

設定service

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

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

名前種類デフォルト説明
name文字列registryサービス名の設定
type文字列ClusterIPサービスのタイプを設定します。
externalPortInt5000サービスが公開するポート
internalPortInt5000サービスからのリクエストを受け付けるためにポッドが使用するポート
clusterIP文字列null必要に応じてカスタムクラスタIPを設定できます。
loadBalancerIP文字列null必要に応じてカスタム LoadBalancer IP アドレスを設定できます。

設定ingress

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

名前種類デフォルト説明
apiVersion文字列  apiVersion フィールドで使用する値。
annotations文字列 このフィールドは、Kubernetes Ingressの標準annotations
configureCertmanagerブール値 Ingress 注釈cert-manager.io/issueracme.cert-manager.io/http01-edit-in-place を切り替えます。詳細はGitLab Pages の TLS 要件をご覧ください。
enabledブール値falseIngressオブジェクトをサポートするサービスに対してIngressオブジェクトを作成するかどうかを制御する設定。false の場合、global.ingress.enabled 設定が使用されます。
tls.enabledブール値true false に設定すると、レジストリサブチャートのTLSを無効にします。これは主に、Ingress Controllerの前にTLS終端のプロキシがある場合など、ingress-level でTLS終端を使えない場合に便利です。
tls.secretName文字列 レジストリ URL 用の有効な証明書とキーを含む Kubernetes TLS シークレットの名前。設定されていない場合は、代わりにglobal.ingress.tls.secretName が使用されます。デフォルトは設定されていません。

TLSの設定

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

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

  • TLS 証明書は、Common Name(共通名)(CN) または Subject Alternate Name(サブジェクト代替名)(SAN)にレジストリ・サービス・ホスト名(たとえば、RELEASE-registry.default.svc )を含める必要があります。
  • TLS証明書が生成された後:

TLSを有効にするには

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

registry.tls.verifytrue の場合、registry.tls.caSecretNameに CA 証明書のシークレットネームを渡す必要があります。これは、自己署名証明書とカスタム認証局に必要です。このシークレットは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設定

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

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

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

設定networkpolicy

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

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

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

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

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

レジストリサービスは、外部オブジェクトストレージ上のイメージのために公開インターネットへのアウトバウンド接続を必要とすることに注意してください。

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

KEDAの設定

このkeda セクションでは、通常のHorizontalPodAutoscalersの代わりにKEDA ScaledObjects をインストールできるようにします。この設定はオプションで、カスタムまたは外部のメトリクスに基づいてオートスケーリングする必要がある場合に使用できます。

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

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

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

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

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

名前種類デフォルト説明
enabledブール値falseの代わりにKEDA ScaledObjects を使用します。HorizontalPodAutoscalers
pollingInterval整数30各トリガーを
cooldownPeriod整数300リソースを0にスケールバックする前に、最後のトリガがアクティブであると報告された後、待機する期間。
minReplicaCount整数 KEDAがリソースをスケールダウンする最小レプリカ数。hpa.minReplicas
maxReplicaCount整数 KEDAがリソースをスケールアップする際の最大レプリカ数。hpa.maxReplicas
fallbackマップ KEDAフォールバック設定。
hpaName文字列 KEDAが作成するHPAリソースの名前。keda-hpa-{scaled-object-name}
restoreToOriginalReplicaCountブール値  ScaledObject が削除された後、ターゲットリソースを元のレプリカ数にスケールバックするかどうかを指定します。
behaviorマップ アップスケーリングとダウンスケーリングの動作を指定します。hpa.behavior
triggers配列 対象リソースのスケーリングを有効にするトリガーのリスト。デフォルトはhpa.cpuhpa.memory

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

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

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

レジストリサービスは、外部オブジェクトストレージ上のイメージのために公開インターネットへのアウトバウンド接続を必要とすることに注意してください。

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 Distributionの auth.token.x 。JWT認証トークンを使ってレジストリへの認証を制御します。

httpSecret

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

このキーが参照するキーの内部は、レジストリの http.secret の値と関連しています。この値には暗号的に生成されたランダムな文字列を指定します。

shared-secrets のジョブは、指定がなければ自動的にこの秘密を作成します。この値は、base64 エンコードされた 128 文字の英数字からなるセキュリティで生成された文字列で埋められます。

このシークレットを手動で作成するには、次のようにします:

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

通知シークレット

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

shared-secrets 機能を有効にすると、notificationSecret シークレットオブジェクトが自動的に作成されます。

このシークレットを手動で作成するには、次のようにします:

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
  geo:
    registry:
      replication:
        enabled: true
        primaryApiUrl: <URL to primary registry>

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

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

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

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

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

authEndpoint

authEndpoint フィールドは文字列で、レジストリで認証する GitLab インスタンスの URL を指定します。

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

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

証明書

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

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

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

デフォルトの例:

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

準備とiveness Probe

デフォルトでは、デバッグ・ポートであるポート5001/debug/health をチェックするために、Readiness and Liveness Probe が設定されています。

検証

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

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

画像の検証はデフォルトでオフに設定されています。

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

マニフェスト

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

urls セクションはallowdeny フィールドの両方を含みます。URL を含むマニフェストレイヤーがバリデーションを通過するには、そのレイヤーがallow フィールドの正規表現のいずれかにマッチし、かつdeny フィールドの正規表現にはマッチしない必要があります。

名前種類デフォルト説明
referencelimitInt0レイヤー、画像設定、その他のマニフェストなど、1 つのマニフェストが持つことのできる参照の最大数。0 (デフォルト) に設定すると、この検証は無効になります。
payloadsizelimitInt0マニフェストペイロードの最大データサイズ (バイト単位)。0 (デフォルト) に設定すると、この検証は無効になります。
urls.allow配列[]マニフェストのレイヤーの URL を有効にする正規表現のリスト。空のまま (デフォルト) にすると、任意の URL を含むレイヤーは拒否されます。
urls.deny配列[]マニフェストのレイヤの URL を制限する正規表現のリスト。空のまま (デフォルト) にすると、urls.allow リストを通過した URL を持つレイヤーは拒否されません。

通知

notifications フィールドはレジストリ通知の設定に使用します。デフォルト値は空のハッシュです。

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

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

notifications:
  endpoints:
    - name: FooListener
      url: https://foolistener.com/event
      timeout: 500ms
      threshold: 10
      backoff: 1s
    - name: BarListener
      url: https://barlistener.com/event
      timeout: 100ms
      threshold: 3
      backoff: 1s
  events:
    includereferences: true

hpa

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

ストレージ

storage:
  secret:
  key: config
  extraKey:

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

AWS s3とGoogle GCSドライバの例は、examples/objectstorageにあります:

S3 の場合、レジストリストレージに正しい権限が与えられていることを確認してください。ストレージ設定の詳細については、管理ドキュメントのコンテナレジストリストレージドライバを参照してください。

storage ブロックの内容をシークレットに storage配置し、マップのstorage 項目として以下を指定 storageします:

  • secretYAML ブロックを格納する Kubernetes シークレットの名前。
  • 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

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

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

filesystem ドライバーの使用を選択した場合:

  • このデータ用に永続ボリュームを用意する必要があります。
  • hpa.minReplicas に設定されるべきです。1
  • hpa.maxReplicas に設定されるべきです。1

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

note
Chartは、ユーザーが指定しない場合、デフォルトでこの設定にdelete.enabled: true 。これにより、Linuxパッケージと同様に、MinIOのデフォルトの使用に合わせて期待される動作が維持されます。ユーザーが指定した値は、このデフォルトより優先されます。

ミドルウェア.ストレージ

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 file name for PEM storage:
          #   /etc/docker/registry/middleware.storage/<index>/<key>
          key: private-key-ABC.pem
        keypairid: ABCEDFGHIJKLMNOPQRST

上記のコードoptions.privatekeySecret 内にはgeneric Kubernetes シークレットコンテンツがあり、PEM ファイルのコンテンツに対応しています:

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

privatekey 使用されるアップストリームは、privatekey SecretからChartによって自動入力され、指定された場合は無視されます。

keypairid バリアント

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

ベンダーフィールド名
Google CDNkeyname
クラウドフロントkeypairid
note
現時点ではmiddleware.storage セクションの設定のみがサポートされています。

デバッグ

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

debug:
  addr:
    port: 5001

metrics:
  enabled: true

健康

health プロパティはオプションで、ストレージドライバのバックエンドストレージの定期的なヘルスチェックの設定を含みます。詳細はDockerの設定ドキュメントを参照してください。

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

レポーター

reporting プロパティはオプションで、レポートを作成することができます。

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

プロファイリング

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

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

データベース

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

note
メタデータ・データベースは実験的な機能であり、本番環境では使用_しないで_ください。
note
この機能には PostgreSQL 12 以降が必要です。
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
  pool:
    maxidle: 25
    maxopen: 25
    maxlifetime: 5m
    maxidletime: 5m
  migrations:
    enabled: true
    activeDeadlineSeconds: 3600
    backoffLimit: 6
  discovery:
    enabled: true
    nameserver: 'nameserver.fqdn'
    port: 53
    primaryrecord: 'primary.record.fqdn.'
    tcp: false

データベースの作成

レジストリデータベースが有効になっている場合、レジストリはその状態を追跡するために独自のデータベースを使用します。

以下の手順に従って、手動でデータベースとロールを作成してください。

note
この手順は、付属のPostgreSQLサーバーを使用することを前提としています。独自のサーバーを使用している場合は、接続方法に若干の違いがあります。
  1. データベースのパスワードでシークレットを作成します:

    kubectl create secret generic RELEASE_NAME-registry-database-password --from-literal=password=randomstring
    
  2. データベースインスタンスにログインしてください:

    kubectl exec -it $(kubectl get pods -l app.kubernetes.io/name=postgresql -o custom-columns=NAME:.metadata.name --no-headers) -- bash
    
    PGPASSWORD=${POSTGRES_POSTGRES_PASSWORD} psql -U postgres -d template1
    
  3. データベースユーザーを作成します:

    CREATE ROLE registry WITH LOGIN;
    
  4. データベースユーザーのパスワードを設定します。

    1. パスワードを取得してください:

      kubectl get secret RELEASE_NAME-registry-database-password -o jsonpath="{.data.password}" | base64 --decode
      
    2. psql プロンプトでパスワードを設定します:

      \password registry
      
  5. データベースを作成します:

    CREATE DATABASE registry WITH OWNER registry;
    
  6. PostgreSQL コマンドラインから安全に終了し、exit を使用してコンテナから終了します:

    template1=# exit
    ...@gitlab-postgresql-0/$ exit
    

gc プロパティ

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

caution
これは実験的な機能であり、本番環境では使用_しないで_ください。

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

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

Redisキャッシュ

caution
これは実験的な機能であり、本番環境では使用_しないで_ください。

このredis.cache プロパティはオプションで、Redis キャッシュに関連するオプションを指定 redis.cacheします。レジストリでredis.cache 使用するには 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.cacheglobal.redis.sentinels の設定を使用することができます。ローカルな値を指定することができ、グローバルな値よりも優先されます。例えば

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

ガベージコレクション

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

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

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

手動でガベージ・コレクションを行うには、まずレジストリを読み込み専用モードにする必要があります。すでにHelmを使ってGitLab Chartをインストールし、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 :)

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

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

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

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

    kubectl exec -it <registry-pod> -- bash
    
  2. レジストリポッドの内部では、PATHregistry のバイナリがあり、直接使用することができます。設定ファイルは/etc/docker/registry/config.ymlにあります。次の例は、データベースのマイグレーションの状態をチェックします:

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

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