コンテナレジストリの使用
- プラン: 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 | このチャートによって作成されたすべてのオブジェクトに適用される補足ラベル。 | |
authAutoRedirect | true | 認証自動リダイレクト(Windowsクライアントが機能するにはtrueである必要があります) |
authEndpoint | global.hosts.gitlab.name | 認証エンドポイント(ホストとポートのみ) |
certificate.secret | gitlab-registry | JWT証明書 |
debug.addr.port | 5001 | デバッグポート |
debug.tls.enabled | false | レジストリのデバッグポートのTLSを有効にします。LivenessおよびReadinessプローブ、ならびにメトリクスエンドポイント(有効な場合)に影響します。 |
debug.tls.secretName | レジストリデバッグエンドポイント用の有効な証明書とキーを含むKubernetes TLSシークレットの名前。設定されておらずdebug.tls.enabled=trueの場合、デバッグTLS設定はレジストリのTLS証明書にデフォルトで設定されます。 | |
debug.prometheus.enabled | false | DEPRECATED metrics.enabledを使用 |
debug.prometheus.path | "" | DEPRECATED metrics.pathを使用 |
metrics.enabled | false | メトリクスエンドポイントをスクレイプ可能にするかどうか |
metrics.path | /metrics | メトリクスエンドポイントパス |
metrics.serviceMonitor.enabled | false | Prometheus Operatorがメトリクスのスクレイプを管理できるようにServiceMonitorを作成する場合、これを有効にするとprometheus.ioスクレイプアノテーションが削除されることに注意してください。 |
metrics.serviceMonitor.additionalLabels | {} | ServiceMonitorに追加する追加のラベル |
metrics.serviceMonitor.endpointConfig | {} | ServiceMonitor用の追加のエンドポイント設定 |
deployment.terminationGracePeriodSeconds | 30 | ポッドが正常に終了するまでに必要なオプションの期間(秒単位)。 |
deployment.strategy | {} | デプロイによって利用される更新戦略を設定できます。 |
draintimeout | '0' | SIGTERMシグナルを受信した後、HTTP接続がドレインするまで待機する時間(例: '10s') |
relativeurls | false | レジストリがLocationヘッダーで相対URLを返すことを有効にします。 |
enabled | true | レジストリフラグを有効にする |
api.enabled | true | Service、Deployment、HPA、およびPDBリソースを有効にします。 |
extraContainers | 含めるコンテナのリストを含む複数行リテラルスタイルの文字列 | |
extraInitContainers | 含める追加のinitコンテナのリスト | |
hpa.behavior | {scaleDown: {stabilizationWindowSeconds: 300 }} | Behaviorには、スケールアップおよびスケールダウン動作の仕様が含まれます(autoscaling/v2beta2以降が必要です)。 |
hpa.customMetrics | [] | カスタムメトリクスには、必要なレプリカ数を計算するために使用する仕様が含まれます(targetAverageUtilizationで設定された平均CPU使用率のデフォルト使用をオーバーライドします)。 |
hpa.cpu.targetType | Utilization | オートスケールのCPUターゲットタイプを設定します。UtilizationまたはAverageValueのいずれかである必要があります。 |
hpa.cpu.targetAverageValue | オートスケールのCPUターゲット値を設定します。 | |
hpa.cpu.targetAverageUtilization | 75 | オートスケールのCPUターゲット使用率を設定します。 |
hpa.memory.targetType | オートスケールのメモリターゲットタイプを設定します。UtilizationまたはAverageValueのいずれかである必要があります。 | |
hpa.memory.targetAverageValue | オートスケールのメモリターゲット値を設定します。 | |
hpa.memory.targetAverageUtilization | オートスケールのメモリターゲット使用率を設定します。 | |
hpa.minReplicas | 2 | レプリカの最小数 |
hpa.maxReplicas | 10 | レプリカの最大数 |
httpSecret | Httpsシークレット | |
extraEnvFrom | 他のデータソースから公開する追加の環境変数のリスト | |
image.pullPolicy | レジストリイメージのプルポリシー | |
image.pullSecrets | イメージリポジトリに使用するシークレット | |
image.repository | registry.gitlab.com/gitlab-org/build/cng/gitlab-container-registry | レジストリイメージ |
image.tag | v4.15.2-gitlab | 使用するイメージのバージョン |
init.image.repository | initContainerイメージ | |
init.image.tag | initContainerイメージタグ | |
init.containerSecurityContext | initContainer固有のsecurityContext | |
init.containerSecurityContext.runAsUser | 1000 | initContainer固有: コンテナが起動されるユーザーID |
init.containerSecurityContext.allowPrivilegeEscalation | false | initContainer固有: プロセスがその親プロセスよりも多くの特権を獲得できるかどうかを制御します。 |
init.containerSecurityContext.runAsNonRoot | true | initContainer固有: コンテナが非ルートユーザーで実行されるかどうかを制御します。 |
init.containerSecurityContext.capabilities.drop | [ "ALL" ] | initContainer固有: コンテナのLinux機能を削除します。 |
keda.enabled | false | HorizontalPodAutoscalersの代わりにKEDA ScaledObjectsを使用します |
keda.pollingInterval | 30 | 各トリガーをチェックする間隔 |
keda.cooldownPeriod | 300 | 最後のトリガーがアクティブであると報告された後、リソースを0にスケールダウンするまで待機する期間 |
keda.minReplicaCount | hpa.minReplicas | KEDAがリソースをスケールダウンする最小レプリカ数。 |
keda.maxReplicaCount | hpa.maxReplicas | KEDAがリソースをスケールアップする最大レプリカ数。 |
keda.fallback | KEDAフォールバック設定。ドキュメントを参照してください。 | |
keda.hpaName | keda-hpa-{scaled-object-name} | KEDAが作成するHPAリソースの名前。 |
keda.restoreToOriginalReplicaCount | ScaledObjectが削除された後、ターゲットリソースを元のレプリカ数にスケールバックするかどうかを指定します。 | |
keda.behavior | hpa.behavior | スケールアップおよびスケールダウン動作の仕様。 |
keda.triggers | ターゲットリソースのスケールをアクティブにするトリガーのリスト。hpa.cpuとhpa.memoryから計算されたトリガーにデフォルトで設定されます。 | |
log | {level: info, fields: {service: registry}} | ロギングオプションを設定します |
minio.bucket | global.registry.bucket | レガシーレジストリバケット名 |
maintenance.readonly.enabled | false | レジストリの読み取り専用モードを有効にする |
maintenance.uploadpurging.enabled | true | アップロードパージを有効にする |
maintenance.uploadpurging.age | 168h | 指定された期間より古いアップロードをパージする |
maintenance.uploadpurging.interval | 24h | アップロードパージが実行される頻度 |
maintenance.uploadpurging.dryrun | false | 削除せずにパージされるアップロードをリストするのみ |
priorityClassName | ポッドに割り当てられたPriority class。 | |
reporting.sentry.enabled | false | Sentryを使用したレポートを有効にする |
reporting.sentry.dsn | Sentry DSN(Data Source Name) | |
reporting.sentry.environment | Sentry環境 | |
profiling.stackdriver.enabled | false | Stackdriverを使用した継続的プロファイリングを有効にする |
profiling.stackdriver.credentials.secret | gitlab-registry-profiling-creds | 認証情報を含むシークレットの名前 |
profiling.stackdriver.credentials.key | credentials | 認証情報が保存されているシークレット内のキー |
profiling.stackdriver.service | RELEASE-registry(テンプレート化されたService名) | プロファイルを記録するStackdriverサービスの名前 |
profiling.stackdriver.projectid | 実行中のGCPプロジェクト | プロファイルを報告するGCPプロジェクト |
database.configure | false | レジストリチャートにデータベース設定を入力しますが、有効にはしません。既存のレジストリをインポートする場合に必要です。 |
database.enabled | false | メタデータデータベースを有効にします。これは実験的機能であり、本番環境で使用してはなりません。 |
database.host | global.psql.host | データベースサーバーのホスト名。 |
database.port | global.psql.port | データベースサーバーのポート。 |
database.user | データベースのユーザー名。 | |
database.password.secret | RELEASE-registry-database-password | データベースパスワードを含むシークレットの名前。 |
database.password.key | password | データベースパスワードが保存されているシークレット内のキー。 |
database.name | データベース名。 | |
database.sslmode | The SSL mode.disable、allow、prefer、require、verify-caまたはverify-fullのいずれか。 | |
database.ssl.secret | global.psql.ssl.secret | クライアント証明書、キー、および認証局を含むシークレット。メインのPostgreSQL SSLシークレットにデフォルトで設定されます。 |
database.ssl.clientCertificate | global.psql.ssl.clientCertificate | クライアント証明書を参照するシークレット内のキー。 |
database.ssl.clientKey | global.psql.ssl.clientKey | クライアントキーを参照するシークレット内のキー。 |
database.ssl.serverCA | global.psql.ssl.serverCA | 認証局(CA)を参照するシークレット内のキー。 |
database.connecttimeout | 0 | 接続を待機する最大時間。ゼロまたは未指定は、無期限に待機することを意味します。 |
database.draintimeout | 0 | シャットダウン時にすべての接続がドレインするまで待機する最大時間。ゼロまたは未指定は、無期限に待機することを意味します。 |
database.preparedstatements | false | プリペアドステートメントを有効にします。PgBouncerとの互換性のためにデフォルトで無効になっています。 |
database.primary | false | ターゲットプライマリデータベースサーバー。これは、レジストリdatabase.migrationsを実行する際にターゲットとする専用のFQDNを指定するために使用されます。指定されていない場合、hostはdatabase.migrationsの実行に使用されます。 |
database.pool.maxidle | 0 | アイドル接続プール内の接続の最大数。maxopenがmaxidleよりも小さい場合、maxidleはmaxopenの制限に一致するように削減されます。ゼロまたは未指定は、アイドル接続がないことを意味します。 |
database.pool.maxopen | 0 | データベースへのオープン接続の最大数。maxopenがmaxidleよりも小さい場合、maxidleはmaxopenの制限に一致するように削減されます。ゼロまたは未指定は、無制限のオープン接続を意味します。 |
database.pool.maxlifetime | 0 | 接続が再利用される最大時間。期限切れの接続は、再利用前に遅延して閉じられる場合があります。ゼロまたは未指定は、無制限の再利用を意味します。 |
database.pool.maxidletime | 0 | 接続がアイドル状態である最大時間。期限切れの接続は、再利用前に遅延して閉じられる場合があります。ゼロまたは未指定は、無制限の期間を意味します。 |
database.loadBalancing.enabled | false | データベースのロードバランシングを有効にします。これは実験的機能であり、本番環境で使用してはなりません。 |
database.loadBalancing.nameserver.host | localhost | DNSレコードを検索するために使用するネームサーバーのホスト。 |
database.loadBalancing.nameserver.port | 8600 | DNSレコードを検索するために使用するネームサーバーのポート。 |
database.loadBalancing.record | 検索するSRVレコード。このオプションはサービスディスカバリが機能するために必要です。 | |
database.loadBalancing.replicaCheckInterval | 1m | レプリカのステータスを確認する間の最小時間。 |
database.migrations.enabled | true | チャートの初期デプロイおよびアップグレード時に、移行ジョブを自動的に実行できるようにします。移行は、実行中のいずれかのレジストリポッド内から手動で実行することもできます。 |
database.migrations.activeDeadlineSeconds | 3600 | 移行ジョブのactiveDeadlineSecondsを設定します。 |
database.migrations.annotations | {} | 移行ジョブに追加する追加のアノテーション。 |
database.migrations.backoffLimit | 6 | 移行ジョブのbackoffLimitを設定します。 |
database.backgroundMigrations.enabled | false | データベースのバックグラウンド移行を有効にします。これはレジストリメタデータデータベース用の実験的機能です。本番環境では使用しないでください。動作の詳細については、仕様を参照してください。 |
database.backgroundMigrations.jobInterval | 各バックグラウンド移行ジョブワーカーの実行間のスリープ間隔。指定されていない場合、レジストリによってデフォルト値が設定されます。 | |
database.backgroundMigrations.maxJobRetries | 失敗したバックグラウンド移行ジョブの最大再試行回数。指定されていない場合、レジストリによってデフォルト値が設定されます。 | |
database.metrics.enabled | false | trueに設定すると、データベースメトリクス収集が有効になります。これは実験的機能であり、本番環境では使用しないでください。分散ロックには、レジストリ4.27.0以降、メタデータデータベース(database.enabled: true)、およびRedisキャッシュ(redis.cache.enabled: true)が必要です。 |
database.metrics.interval | 10s | データベースからメトリクスが収集される間隔。 |
database.metrics.leaseDuration | 30s | Redisロックがメトリクスコレクターによって保持される期間。同じインスタンスによる継続的な収集を保証するために、intervalよりも長くする必要があります。 |
gc.disabled | true | trueに設定すると、オンラインGCワーカーが無効になります。 |
gc.maxbackoff | 24h | エラー発生時にワーカー実行間でスリープするために使用される最大指数バックオフ期間。gc.noidlebackoffがtrueでない限り、処理すべきタスクがない場合にも適用されます。ランダム化されたジッター係数が常に最大33%追加されるため、これが絶対的な最大値ではないことに注意してください。 |
gc.noidlebackoff | false | trueに設定すると、処理すべきタスクがない場合のワーカー実行間の指数バックオフが無効になります。 |
gc.transactiontimeout | 10s | 各ワーカー実行のデータベーストランザクションタイムアウト。各ワーカーは開始時にデータベーストランザクションを開始します。このタイムアウトを超過すると、ストールした、または長時間実行されるトランザクションを回避するために、ワーカー実行がキャンセルされます。 |
gc.blobs.disabled | false | trueに設定すると、blob用のGCワーカーが無効になります。 |
gc.blobs.interval | 5s | 各ワーカー実行間の初期スリープ間隔。 |
gc.blobs.storagetimeout | 5s | ストレージ操作のタイムアウト。ストレージバックエンド上のぶら下がっているblobを削除するリクエストの期間を制限するために使用されます。 |
gc.manifests.disabled | false | trueに設定すると、マニフェスト用のGCワーカーが無効になります。 |
gc.manifests.interval | 5s | 各ワーカー実行間の初期スリープ間隔。 |
gc.reviewafter | 24h | ガベージコレクターがレビューのためにレコードをピックアップするまでの最小時間。-1は待機なしを意味します。 |
securityContext.fsGroup | 1000 | ポッドが起動されるグループID |
securityContext.runAsUser | 1000 | ポッドが起動されるユーザーID |
securityContext.fsGroupChangePolicy | ボリュームの所有権とアクセス許可を変更するためのポリシー(Kubernetes 1.23以降が必要) | |
securityContext.seccompProfile.type | RuntimeDefault | 使用するSeccompプロファイル |
containerSecurityContext | コンテナが起動されるsecurityContextをオーバーライドします。 | |
containerSecurityContext.runAsUser | 1000 | コンテナが起動される特定のセキュリティコンテキストユーザーIDを上書きすることを許可します。 |
containerSecurityContext.allowPrivilegeEscalation | false | Gitalyコンテナのプロセスがその親プロセスよりも多くの特権を獲得できるかどうかを制御します。 |
containerSecurityContext.runAsNonRoot | true | コンテナが非ルートユーザーで実行されるかどうかを制御します。 |
containerSecurityContext.capabilities.drop | [ "ALL" ] | GitalyコンテナのLinux機能を削除します。 |
serviceAccount.automountServiceAccountToken | false | サービスアカウントアクセストークンがポッドにマウントされるべきかどうかを示します。 |
serviceAccount.enabled | false | サービスアカウントを使用するかどうかを示します。 |
serviceLabels | {} | 補足のサービスラベル |
tokenService | container_registry | JWTトークンサービス |
tokenIssuer | gitlab-issuer | JWTトークン発行者 |
tolerations | [] | ポッドの割り当てに対するTolerationラベル |
affinity | {} | ポッドの割り当てに対するアフィニティルール |
middleware.storage | ミドルウェアストレージ(例:s3)の設定レイヤー | |
redis.cache.enabled | false | trueに設定すると、Redisキャッシュが有効になります。この機能は、メタデータデータベースが有効になっていることに依存します。リポジトリのメタデータは、設定されたRedisインスタンスにキャッシュされます。 |
redis.cache.host | <Redis URL> | Redisインスタンスのホスト名。空の場合、値はglobal.redis.host:global.redis.portとして入力されます。 |
redis.cache.port | 6379 | Redisインスタンスのポート。 |
redis.cache.cluster | [] | ホストとポートを持つアドレスのリスト。 |
redis.cache.sentinels | [] | ホストとポートを持つセンチネルをリストします。 |
redis.cache.mainname | メインサーバー名。Sentinelにのみ適用可能です。 | |
redis.cache.username | Redisインスタンスに接続するために使用されるユーザー名。 | |
redis.cache.password.enabled | false | レジストリによって使用されるRedisキャッシュがパスワードで保護されているかどうかを示します。 |
redis.cache.password.secret | gitlab-redis-secret | Redisパスワードを含むシークレットの名前。shared-secrets機能が有効な場合、指定されていなければ自動的に作成されます。 |
redis.cache.password.key | redis-password | Redisパスワードが保存されているシークレット内のキー。 |
redis.cache.sentinelpassword.enabled | false | Redis Sentinelがパスワードで保護されているかどうかを示します。redis.cache.sentinelpasswordが空の場合、global.redis.sentinelAuthの値が使用されます。redis.cache.sentinelsが定義されている場合にのみ使用されます。 |
redis.cache.sentinelpassword.secret | gitlab-redis-secret | Redis Sentinelパスワードを含むシークレットの名前。 |
redis.cache.sentinelpassword.key | redis-sentinel-password | Redis Sentinelパスワードが保存されているシークレット内のキー。 |
redis.cache.db | 0 | 各接続に使用するデータベースの名前。 |
redis.cache.dialtimeout | 0s | Redisインスタンスに接続するためのタイムアウト。デフォルトではタイムアウトなし。 |
redis.cache.readtimeout | 0s | Redisインスタンスからの読み取りのタイムアウト。デフォルトではタイムアウトなし。 |
redis.cache.writetimeout | 0s | Redisインスタンスへの書き込みのタイムアウト。デフォルトではタイムアウトなし。 |
redis.cache.tls.enabled | false | TLSを有効にするにはtrueに設定します。 |
redis.cache.tls.insecure | false | TLS経由で接続するときにサーバー名の検証を無効にするにはtrueに設定します。 |
redis.cache.pool.size | 10 | ソケット接続の最大数。デフォルトは10接続です。 |
redis.cache.pool.maxlifetime | 1h | クライアントが接続を終了する接続の経過時間。デフォルトは、期限切れの接続を閉じないことです。 |
redis.cache.pool.idletimeout | 300s | 非アクティブな接続を閉じるまでに待機する時間。 |
redis.rateLimiting.enabled | false | trueに設定すると、Redisレート制限が有効になります。この機能は開発中です。 |
redis.rateLimiting.host | <Redis URL> | Redisインスタンスのホスト名。空の場合、値はglobal.redis.host:global.redis.portとして入力されます。 |
redis.rateLimiting.port | 6379 | Redisインスタンスのポート。 |
redis.rateLimiting.cluster | [] | ホストとポートを持つアドレスのリスト。 |
redis.rateLimiting.sentinels | [] | ホストとポートを持つセンチネルをリストします。 |
redis.rateLimiting.mainname | メインサーバー名。Sentinelにのみ適用可能です。 | |
redis.rateLimiting.username | Redisインスタンスに接続するために使用されるユーザー名。 | |
redis.rateLimiting.password.enabled | false | Redisインスタンスがパスワードで保護されているかどうかを示します。 |
redis.rateLimiting.password.secret | gitlab-redis-secret | Redisパスワードを含むシークレットの名前。shared-secrets機能が有効な場合、指定されていなければ自動的に作成されます。 |
redis.rateLimiting.password.key | redis-password | Redisパスワードが保存されているシークレット内のキー。 |
redis.rateLimiting.sentinelpassword.enabled | false | Redis Sentinelがパスワードで保護されているかどうかを示します。redis.rateLimiting.sentinelpasswordが空の場合、global.redis.sentinelAuthの値が使用されます。redis.rateLimiting.sentinelsが定義されている場合にのみ使用されます。 |
redis.rateLimiting.sentinelpassword.secret | gitlab-redis-secret | Redis Sentinelパスワードを含むシークレットの名前。 |
redis.rateLimiting.sentinelpassword.key | redis-sentinel-password | Redis Sentinelパスワードが保存されているシークレット内のキー。 |
redis.rateLimiting.db | 0 | 各接続に使用するデータベースの名前。 |
redis.rateLimiting.dialtimeout | 0s | Redisインスタンスに接続するためのタイムアウト。デフォルトではタイムアウトなし。 |
redis.rateLimiting.readtimeout | 0s | Redisインスタンスからの読み取りのタイムアウト。デフォルトではタイムアウトなし。 |
redis.rateLimiting.writetimeout | 0s | Redisインスタンスへの書き込みのタイムアウト。デフォルトではタイムアウトなし。 |
redis.rateLimiting.tls.enabled | false | TLSを有効にするにはtrueに設定します。 |
redis.rateLimiting.tls.insecure | false | TLS経由で接続するときにサーバー名の検証を無効にするにはtrueに設定します。 |
redis.rateLimiting.pool.size | 10 | ソケット接続の最大数。 |
redis.rateLimiting.pool.maxlifetime | 1h | クライアントが接続を終了する接続の経過時間。デフォルトは、期限切れの接続を閉じないことです。 |
redis.rateLimiting.pool.idletimeout | 300s | 非アクティブな接続を閉じるまでに待機する時間。 |
redis.loadBalancing.enabled | false | trueに設定すると、ロードバランシング用のRedis接続が有効になります。 |
redis.loadBalancing.host | <Redis URL> | Redisインスタンスのホスト名。空の場合、値はglobal.redis.host:global.redis.portとして入力されます。 |
redis.loadBalancing.port | 6379 | Redisインスタンスのポート。 |
redis.loadBalancing.cluster | [] | ホストとポートを持つアドレスのリスト。 |
redis.loadBalancing.sentinels | [] | ホストとポートを持つセンチネルをリストします。 |
redis.loadBalancing.mainname | メインサーバー名。Sentinelにのみ適用可能です。 | |
redis.loadBalancing.username | Redisインスタンスに接続するために使用されるユーザー名。 | |
redis.loadBalancing.password.enabled | false | Redisインスタンスがパスワードで保護されているかどうかを示します。 |
redis.loadBalancing.password.secret | gitlab-redis-secret | Redisパスワードを含むシークレットの名前。shared-secrets機能が有効な場合、指定されていなければ自動的に作成されます。 |
redis.loadBalancing.password.key | redis-password | Redisパスワードが保存されているシークレット内のキー。 |
redis.loadBalancing.db | 0 | 各接続に使用するデータベースの名前。 |
redis.loadBalancing.dialtimeout | 0s | Redisインスタンスに接続するためのタイムアウト。デフォルトではタイムアウトなし。 |
redis.loadBalancing.readtimeout | 0s | Redisインスタンスからの読み取りのタイムアウト。デフォルトではタイムアウトなし。 |
redis.loadBalancing.writetimeout | 0s | Redisインスタンスへの書き込みのタイムアウト。デフォルトではタイムアウトなし。 |
redis.loadBalancing.tls.enabled | false | TLSを有効にするにはtrueに設定します。 |
redis.loadBalancing.tls.insecure | false | TLS経由で接続するときにサーバー名の検証を無効にするにはtrueに設定します。 |
redis.loadBalancing.pool.size | 10 | ソケット接続の最大数。 |
redis.loadBalancing.pool.maxlifetime | 1h | クライアントが接続を終了する接続の経過時間。デフォルトは、期限切れの接続を閉じないことです。 |
redis.loadBalancing.pool.idletimeout | 300s | 非アクティブな接続を閉じるまでに待機する時間。 |
チャート設定の例
pullSecrets
pullSecretsを使用すると、プライベートレジストリに対して認証し、ポッド用のイメージをプルできます。
プライベートレジストリとその認証方法に関する追加の詳細は、Kubernetesドキュメントで確認できます。
pullSecretsの使用例を以下に示します。
image:
repository: my.registry.repository
tag: latest
pullPolicy: Always
pullSecrets:
- name: my-secret-name
- name: my-secondary-secret-nameserviceAccount
このセクションでは、サービスアカウントを作成するかどうか、およびデフォルトアクセストークンをポッドにマウントするかどうかを制御します。
| 名前 | 型 | デフォルト | 説明 |
|---|---|---|---|
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.yamlのantiAffinity変数を使用して、推奨モードが適用されるようにsoftに設定するか、必須モードが適用されるようにhardに設定します。
nodeAffinityルール:- 特定のゾーンまたは複数のゾーンに属するノードにポッドをスケジュールします。
nodeAffinityルールの2つのモードを設定します: 必須(requiredDuringSchedulingIgnoredDuringExecution)と推奨(preferredDuringSchedulingIgnoredDuringExecution)。softに設定すると、推奨モードが適用されます。hardに設定すると、必須モードが適用されます。このルールは、webserviceとsidekiqを除くすべてのサブチャートとともに、registryチャートとgitlabチャートにのみ実装されます。
nodeAffinityはInオペレーターのみを実装します。
詳細については、関連するKubernetesドキュメントを参照してください。
次の例では、affinityを設定し、nodeAffinityとantiAffinityの両方を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 | 整数 | 5000 | Serviceによって公開されるポート |
internalPort | 整数 | 5000 | サービスからのリクエストを受け入れるためにポッドが使用するポート |
clusterIP | 文字列 | null | 必要に応じてカスタムCluster IPを設定できます |
loadBalancerIP | 文字列 | null | 必要に応じてカスタムLoadBalancer IPアドレスを設定できます |
ingressを設定する
このセクションでは、レジストリのIngressを制御します。
| 名前 | 型 | デフォルト | 説明 |
|---|---|---|---|
apiVersion | 文字列 | apiVersionフィールドで使用する値。 | |
annotations | 文字列 | このフィールドは、KubernetesIngressの標準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 | ブール値 | true | falseに設定すると、レジストリサブチャートの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を有効にするには:
registry.tls.enabledをtrueに設定します。global.hosts.registry.protocolをhttpsに設定します。- シークレット名を
registry.tls.secretNameとglobal.certificates.customCAsにそれぞれ渡します。
registry.tls.verifyがtrueの場合、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.enabledをtrueに設定することで有効にできます。デバッグポートのTLS設定専用に、registry.debug.tls.secretNameでKubernetes TLSシークレットを提供できます。専用のシークレットが指定されていない場合、デバッグ設定は、レジストリの通常のTLS設定とregistry.tls.secretNameを共有するようにフォールバックします。
Prometheusがhttpsを使用して/metrics/エンドポイントをスクレイプするには、証明書のCommonName属性またはSubjectAlternativeNameエントリに追加の設定が必要です。それらの要件については、TLSが有効なエンドポイントをスクレイプするようにPrometheusを設定するを参照してください。
networkpolicyを設定する
このセクションでは、レジストリのNetworkPolicyを制御します。この設定はオプションであり、レジストリのエグレスおよびIngressを特定のエンドポイントに制限するために使用されます。
| 名前 | 型 | デフォルト | 説明 |
|---|---|---|---|
enabled | ブール値 | false | この設定により、レジストリのNetworkPolicyが有効になります |
ingress.enabled | ブール値 | false | trueに設定すると、IngressIngressネットワークポリシーがアクティブになります。これにより、ルールが指定されていない限り、すべてのIngress接続がブロックされます。 |
ingress.rules | 配列 | [] | Ingressポリシーのルール。詳細についてはhttps://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resourceと以下の例を参照してください。 |
egress.enabled | ブール値 | false | trueに設定すると、EgressIngressネットワークポリシーがアクティブになります。これにより、ルールが指定されていない限り、すべてのエグレス接続がブロックされます。 |
egress.rules | 配列 | [] | エグレスポリシーのルール。詳細についてはhttps://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resourceと以下の例を参照してください。 |
すべての内部エンドポイントへの接続を防止するポリシーの例
レジストリサービスは通常、オブジェクトストレージへのエグレス接続、DockerクライアントからのIngress接続、およびDNSルックアップのためのkube-DNSを必要とします。これにより、レジストリサービスに次のネットワーク制限が追加されます:
- Ingressリクエストを許可:
- ポッド
sidekiq、webservice、およびnginx-ingressから5000ポートへ Prometheusポッドから9235ポートへ
- ポッド
- エグレスリクエストを許可:
kube-dnsから53ポートへ- AWSVPCエンドポイント(S3またはSTS)のようなエンドポイント
172.16.1.0/24から443ポートへ - インターネット
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/8KEDAを設定する
このkedaセクションでは、通常のHorizontalPodAutoscalersの代わりにKEDA ScaledObjectsのインストールを有効にします。この設定はオプションであり、カスタムまたは外部メトリクスに基づいたオートスケールが必要な場合に使用できます。
ほとんどの設定は、該当する場合、hpaセクションで設定された値にデフォルトで設定されます。
以下が真の場合、hpaセクションで設定されたCPUおよびメモリのしきい値に基づいて、CPUおよびメモリのトリガーが自動的に追加されます:
triggersが設定されていません。- 対応する
request.cpu.requestまたはrequest.memory.request設定もゼロ以外の値に設定されています。
トリガーが設定されていない場合、ScaledObjectは作成されません。
これらの設定の詳細については、KEDAドキュメントを参照してください。
| 名前 | 型 | デフォルト | 説明 |
|---|---|---|---|
enabled | ブール値 | false | HorizontalPodAutoscalersの代わりにKEDA ScaledObjectsを使用します |
pollingInterval | 整数 | 30 | 各トリガーをチェックする間隔 |
cooldownPeriod | 整数 | 300 | 最後のトリガーがアクティブであると報告された後、リソースを0にスケールダウンするまで待機する期間 |
minReplicaCount | 整数 | hpa.minReplicas | KEDAがリソースをスケールダウンする最小レプリカ数。 |
maxReplicaCount | 整数 | hpa.maxReplicas | KEDAがリソースをスケールアップする最大レプリカ数。 |
fallback | マップ | KEDAフォールバック設定。ドキュメントを参照してください。 | |
hpaName | 文字列 | keda-hpa-{scaled-object-name} | KEDAが作成するHPAリソースの名前。 |
restoreToOriginalReplicaCount | ブール値 | ScaledObjectが削除された後、ターゲットリソースを元のレプリカ数にスケールバックするかどうかを指定します。 | |
behavior | マップ | hpa.behavior | スケールアップおよびスケールダウン動作の仕様。 |
triggers | 配列 | ターゲットリソースのスケールをアクティブにするトリガーのリスト。hpa.cpuとhpa.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 Distributionのauth.token.x設定を利用し、JWT 認証トークンを介してレジストリへの認証を制御します。
httpSecret
フィールドhttpSecretは、secretとkeyの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: secretGeoを利用し、コンテナレジストリをレプリケートすることを希望する場合は、次の2つの手順に従ってください:
プライマリサイトの設定で:
global: # To provide your own secret, as described above registry: notificationSecret: secret: gitlab-registry-notification key: secret geo: registry: replication: enabled: trueセカンダリサイトの設定で:
global: geo: registry: replication: enabled: true primaryApiUrl: <URL to primary registry>primaryApiUrlは、セカンダリサイトがプライマリサイトに対してプルを実行するために使用されます。
Redisキャッシュシークレット
Redisキャッシュシークレットは、global.redis.auth.enabledがtrueに設定されている場合に使用されます。
shared-secrets機能が有効になっている場合、gitlab-redis-secretシークレットオブジェクトは、提供されていない場合は自動的に作成されます。
このシークレットを手動で作成するには、Redisパスワードの指示を参照してください。
authEndpoint
authEndpointフィールドは文字列であり、レジストリが認証するGitLabインスタンスへのURLを提供します。
値にはプロトコルとホスト名のみを含める必要があります。チャートテンプレートは、必要なリクエストパスを自動的に追加します。結果の値は、コンテナ内のauth.token.realmに入力されます。例: authEndpoint: "https://gitlab.example.com"
デフォルトでは、このフィールドはグローバル設定によって設定されたGitLabホスト名設定で入力されます。
certificate
certificateフィールドは、secretとkeyの2つのアイテムを含むマップです。
secretは、GitLabインスタンスによって作成されたトークンを検証するために使用される証明書バンドルを収容するKubernetesシークレットの名前を含む文字列です。
keyは、レジストリコンテナにauth.token.rootcertbundleとして提供される証明書バンドルを収容するSecret内のkeyキーの名前です。
デフォルトの例:
certificate:
secret: gitlab-registry
key: registry-auth.crtReadinessおよびLivenessプローブ
デフォルトでは、デバッグポートである5001ポートで/debug/healthをチェックするようにReadinessおよびLivenessプローブが設定されています。
validation
validationフィールドは、レジストリ内のDockerイメージ検証プロセスを制御するマップです。イメージ検証が有効な場合、レジストリは外国のレイヤーを含むWindowsイメージを拒否します。ただし、検証スタンザ内のmanifests.urls.allowフィールドが明示的にこれらのレイヤーURLを許可するように設定されている場合は除きます。
検証はマニフェストプッシュ時にのみ行われるため、既にレジストリに存在するイメージは、このセクションの値の変更による影響を受けません。
イメージ検証はデフォルトでオフになっています。
イメージ検証を有効にするには、registry.validation.disabled: falseを明示的に設定する必要があります。
manifests
manifestsフィールドは、マニフェストに固有の検証ポリシーの設定を許可します。
urlsセクションにはallowとdenyの両方のフィールドが含まれています。検証を通過するためのURLを含むマニフェストレイヤーの場合、そのレイヤーはallowフィールドのいずれかの正規表現と一致する必要があり、同時にdenyフィールドのいずれの正規表現とも一致してはなりません。
| 名前 | 型 | デフォルト | 説明 |
|---|---|---|---|
referencelimit | 整数 | 0 | 単一のマニフェストが持つことができるレイヤー、イメージ設定、その他のマニフェストなどの参照の最大数。0(デフォルト)に設定すると、この検証は無効になります。 |
payloadsizelimit | 整数 | 0 | マニフェストペイロードの最大データサイズ(バイト単位)。0(デフォルト)に設定すると、この検証は無効になります。 |
urls.allow | 配列 | [] | マニフェストのレイヤー内のURLを有効にする正規表現のリスト。空のままの場合(デフォルト)、URLを含むレイヤーは拒否されます。 |
urls.deny | 配列 | [] | マニフェストのレイヤー内のURLを制限する正規表現のリスト。空のままの場合(デフォルト)、urls.allowリストを通過したURLを持つレイヤーは拒否されません。 |
notifications
notificationsフィールドは、レジストリ通知を設定するために使用されます。空のハッシュをデフォルト値として持ちます。
設定例は以下のとおりです:
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: truehpa
このhpaフィールドはオブジェクトで、設定の一部として作成するレジストリのインスタンス数を制御します。これはminReplicasの値が2、maxReplicasの値が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: truefilesystemドライバーを使用する場合:
- このデータには永続ボリュームを提供する必要があります。
hpa.minReplicasは1に設定する必要があります。hpa.maxReplicasは1に設定する必要があります。
回復性と簡素化のために、s3、gcs、azureなどの外部サービスまたはその他の互換性のあるオブジェクトストレージを利用することをお勧めします。
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 CDN | keyname |
| CloudFront | keypairid |
debug
デバッグポートはデフォルトで有効になっており、ライブネス/リードネスプローブに使用されます。さらに、Prometheusのメトリクスはmetricsの値で有効にできます。
debug:
addr:
port: 5001
metrics:
enabled: truehealth
healthプロパティはオプションであり、ストレージドライバーのバックエンドストレージに対する定期的なヘルスチェックのプリファレンスを含みます。詳細については、Dockerの設定ドキュメントを参照してください。
health:
storagedriver:
enabled: false
interval: 10s
threshold: 3reporting
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-registrydatabase
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: 5sRedisキャッシュ
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: 6379Sentinel
redis.cacheはglobal.redis.sentinels設定を使用できます。ローカル値を指定することができ、グローバル値よりも優先されます。例:
redis:
cache:
enabled: true
host: redis.example.com
sentinels:
- host: sentinel1.example.com
port: 16379
- host: sentinel2.example.com
port: 16379Sentinelパスワードのサポート
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: passwordRedisレートリミッター
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がオープンされています。
管理コマンドを実行するには:
Registryポッドに接続します:
kubectl exec -it <registry-pod> -- bashRegistryポッド内では、
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"