- 設計の選択
- 設定
- インストールパラメータ
- Chart設定例
- サブチャートを有効にします。
- 設定
image
- 設定
service
- 設定
ingress
- TLSの設定
-
設定
networkpolicy
- KEDAの設定
- レジストリ設定の定義
- ガベージコレクション
コンテナレジストリの使用
registry
サブチャートは、Kubernetes上での完全なクラウドネイティブGitLabデプロイへのレジストリコンポーネントを提供します。このサブチャートは、Dockerディストリビューションを含むアップストリームレジストリコンテナを利用します。このChartは3つの主要な部分で構成されています:Service、Deployment、ConfigMapです。
すべての設定は、公式のレジストリ設定ドキュメントに従って処理されます。ConfigMap
. ConfigMap
Mapから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で作成されたすべてのオブジェクトに適用される補助ラベル。 | |
authAutoRedirect | true | Auth auto-redirect(Windowsクライアントの場合はtrueにする必要があります。) |
authEndpoint | global.hosts.gitlab.name | 認証エンドポイント(ホストとポートのみ) |
certificate.secret | gitlab-registry | JWT証明書 |
debug.addr.port | 5001 | デバッグポート |
debug.tls.enabled | false | レジストリのデバッグ・ポートのTLSを有効にします。LivenessおよびReadiness Probe、ならびにメトリクス・エンドポイント(有効な場合)に影響します。 |
debug.tls.secretName | レジストリのデバッグエンドポイント用の有効な証明書とキーを含むKubernetes TLSシークレットの名前。設定されておらず、debug.tls.enabled=true - デバッグTLS設定は、レジストリのTLS証明書をデフォルトとします。 | |
debug.prometheus.enabled | false |
廃止用途metrics.enabled
|
debug.prometheus.path | "" |
廃止用途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 シグナル (例:'10s' ) を受信した後、HTTP 接続が枯渇するまでの待機時間。 |
relativeurls | false | Locationヘッダで相対URLを返すようにレジストリを有効にします。 |
enabled | true | レジストリを有効にするフラグ |
hpa.behavior | {scaleDown: {stabilizationWindowSeconds: 300 }} | ビヘイビアには、アップスケーリングとダウンスケーリングのビヘイビアの仕様が含まれます(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 | v3.80.0-gitlab | 使用するイメージのバージョン |
init.image.repository | initContainer 画像 | |
init.image.tag | initContainer画像タグ | |
init.containerSecurityContext | initContainer コンテナ固有のsecurityContext | |
keda.enabled | false | の代わりにKEDA ScaledObjects を使用します。HorizontalPodAutoscalers
|
keda.pollingInterval | 30 | 各トリガーを |
keda.cooldownPeriod | 300 | リソースを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.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 | ポッドに割り当てられる優先度クラス。 | |
reporting.sentry.enabled | false | Sentryを使用してレポーターを有効にします。 |
reporting.sentry.dsn | Sentry DSN (データソース名) | |
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 (テンプレート化されたサービス名) | プロファイルを記録するStackdriverサービス名 |
profiling.stackdriver.projectid | 実行中のGCPプロジェクト | プロファイルを報告するGCPプロジェクト |
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 | SSL モード。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.pool.maxidle | 0 | アイドル接続プール内の最大接続数。を下回るmaxopen maxidle 場合は maxidle maxopen 、制限maxopen 値に合わせて減らさ maxopen れます。ゼロまたは指定されていない場合は、アイドル接続がないことを意味します。 |
database.pool.maxopen | 0 | データベースへのオープン接続の最大数。maxopen maxidle を maxidle maxopen 下回る場合は、制限値に合うmaxopen ように減らさ maxopen れます。ゼロまたは指定されていない場合は、無制限のオープン接続を意味します。 |
database.pool.maxlifetime | 0 | 接続を再利用できる最大時間。期限切れの接続は、再利用の前に遅延的に閉じることができます。ゼロまたは指定なしは、再利用が無制限であることを意味します。 |
database.pool.maxidletime | 0 | 接続がアイドルである最大時間。期限切れになった接続は、再利用する前に強制的に閉じることができます。ゼロまたは指定なしは、無制限を意味します。 |
database.migrations.enabled | true | マイグレーションジョブを有効にすると、Chartの初期デプロイ時およびアップグレード時にマイグレーションが自動的に実行されます。マイグレーションは、実行中のレジストリポッド内から手動で実行することもできます。 |
database.migrations.activeDeadlineSeconds | 3600 | マイグレーションジョブのactiveDeadlineSecondsを設定します。 |
database.migrations.backoffLimit | 6 | マイグレーションジョブにbackoffLimitを設定します。 |
database.discovery.enabled | false | データベースのサービス検出を有効にします。これはレジストリ・メタデータ・データベースの実験的な機能です。本番環境では使用しないでください。 |
database.discovery.nameserver | サービス検出用のネームサーバー(DNS) のサーバーアドレスまたは FQDN を設定します。database.discovery.enabled がtrue に設定されている場合に必要です。 | |
database.discovery.port | 53 | ネームサーバーのポートを設定します。デフォルトは53 です。 |
database.discovery.primaryrecord |
nameserver から取得する必要がある SRV リソースレコード。primaryrecord はdatabase.migrations を実行するために使用されます。 | |
database.discovery.tcp | false | UDP ではなく TCP 接続が必要な場合は、true に設定します。 |
gc.disabled | true |
true に設定すると、オンライン GC ワーカーが無効になります。 |
gc.maxbackoff | 24h | エラー発生時のワーカー実行間のスリープに使用される最大指数バックオフ時間。gc.noidlebackoff がtrue でない限り、処理するタスクがないときにも適用されます。最大 33% のランダムなジッター要因が常に追加されるため、これは絶対的な最大値ではないことに注意してください。 |
gc.noidlebackoff | false |
true に設定すると、処理するタスクがないときのワーカー実行間の指数関数的なバックオフを無効にします。 |
gc.transactiontimeout | 10s | 各 Worker が実行するデータベーストランザクションのタイムアウト。各 Worker は開始時にデータベーストランザクションを開始します。このタイムアウトを超えるとワーカーの実行はキャンセルされ、停止したり長時間実行されたりするトランザクションを回避します。 |
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 が必要) | |
containerSecurityContext | コンテナが起動するコンテナsecurityContext をオーバーライドします。 | |
containerSecurityContext.runAsUser | 1000 | コンテナが起動される特定のセキュリティコンテキストを上書きできるようにします。 |
serviceLabels | {} | 補足サービスラベル |
tokenService | container_registry | JWTトークンサービス |
tokenIssuer | gitlab-issuer | JWTトークン発行者 |
tolerations | [] | ポッド割り当て用のトレラベル |
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.sentinels | [] | センチネルをホストとポートでリストします。 |
redis.cache.mainname | メインサーバー名。センチネルにのみ適用されます。 | |
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.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 | 非アクティブな接続を閉じるまでの待ち時間。 |
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 | サービスのタイプを設定します。 |
externalPort | Int | 5000 | サービスが公開するポート |
internalPort | Int | 5000 | サービスからのリクエストを受け付けるためにポッドが使用するポート |
clusterIP | 文字列 | null | 必要に応じてカスタムクラスタIPを設定できます。 |
loadBalancerIP | 文字列 | null | 必要に応じてカスタム LoadBalancer IP アドレスを設定できます。 |
設定ingress
このセクションでは、レジストリIngressを制御します。
名前 | 種類 | デフォルト | 説明 |
---|---|---|---|
apiVersion | 文字列 |
apiVersion フィールドで使用する値。 | |
annotations | 文字列 | このフィールドは、Kubernetes Ingressの標準annotations 。 | |
configureCertmanager | ブール値 | Ingress 注釈cert-manager.io/issuer とacme.cert-manager.io/http01-edit-in-place を切り替えます。詳細はGitLab Pages の TLS 要件をご覧ください。 | |
enabled | ブール値 | false | Ingressオブジェクトをサポートするサービスに対して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証明書が生成された後:
- 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
の場合、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.enabled
をtrue
に設定することで有効にできます。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.cpu とhpa.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
は、secret
とkey
の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.enabled
がtrue
に設定されている場合に使用されます。
shared-secrets
機能が有効な場合、gitlab-redis-secret
シークレットオブジェクトが提供されなければ自動的に作成されます。
このシークレットを手動で作成するには、Redisパスワードの説明を参照してください。
authEndpoint
authEndpoint
フィールドは文字列で、レジストリで認証する GitLab インスタンスの URL を指定します。
値にはプロトコルとホスト名のみを含める必要があります。Chart テンプレートは、必要なリクエストパスを自動的に追加します。結果の値は、コンテナ内部でauth.token.realm
に入力されます。例えばauthEndpoint: "https://gitlab.example.com"
デフォルトでは、このフィールドにはグローバル設定で設定された GitLab ホスト名が入力されます。
証明書
certificate
フィールドは、secret
とkey
の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
セクションはallow
とdeny
フィールドの両方を含みます。URL を含むマニフェストレイヤーがバリデーションを通過するには、そのレイヤーがallow
フィールドの正規表現のいずれかにマッチし、かつdeny
フィールドの正規表現にはマッチしない必要があります。
名前 | 種類 | デフォルト | 説明 |
---|---|---|---|
referencelimit | Int | 0 | レイヤー、画像設定、その他のマニフェストなど、1 つのマニフェストが持つことのできる参照の最大数。0 (デフォルト) に設定すると、この検証は無効になります。 |
payloadsizelimit | Int | 0 | マニフェストペイロードの最大データサイズ (バイト単位)。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
の値は2
、maxReplicas
の値は 10、cpu.targetAverageUtilization
の値は 75% に設定されます。
ストレージ
storage:
secret:
key: config
extraKey:
storage
フィールドはKubernetesシークレットと関連キーへの参照です。このシークレットの内容は、レジストリ設定:storage
から直接取得されます。詳細については、そのドキュメントを参照してください。
AWS s3とGoogle GCSドライバの例は、examples/objectstorage
にあります:
S3 の場合、レジストリストレージに正しい権限が与えられていることを確認してください。ストレージ設定の詳細については、管理ドキュメントのコンテナレジストリストレージドライバを参照してください。
storage
ブロックの内容をシークレットに storage
配置し、マップのstorage
項目として以下を指定 storage
します:
-
secret
YAML ブロックを格納する 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
弾力性と簡素化のために、s3
、gcs
、azure
またはその他の互換性のあるオブジェクトストレージなどの外部サービスを利用することをお勧めします。
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 CDN | keyname |
クラウドフロント | keypairid |
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
プロパティはオプションで、メタデータ・データベースを有効にします。
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
データベースの作成
レジストリデータベースが有効になっている場合、レジストリはその状態を追跡するために独自のデータベースを使用します。
以下の手順に従って、手動でデータベースとロールを作成してください。
-
データベースのパスワードでシークレットを作成します:
kubectl create secret generic RELEASE_NAME-registry-database-password --from-literal=password=randomstring
-
データベースインスタンスにログインしてください:
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
-
データベースユーザーを作成します:
CREATE ROLE registry WITH LOGIN;
-
データベースユーザーのパスワードを設定します。
-
パスワードを取得してください:
kubectl get secret RELEASE_NAME-registry-database-password -o jsonpath="{.data.password}" | base64 --decode
-
psql
プロンプトでパスワードを設定します:\password registry
-
-
データベースを作成します:
CREATE DATABASE registry WITH OWNER registry;
-
PostgreSQL コマンドラインから安全に終了し、
exit
を使用してコンテナから終了します:template1=# exit ...@gitlab-postgresql-0/$ exit
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 キャッシュに関連するオプションを指定 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.cache
はglobal.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でガベージコレクションを実行する完全自動化された方法やスケジュールされた方法はありません。
手動ガベージコレクション
手動でガベージ・コレクションを行うには、まずレジストリを読み込み専用モードにする必要があります。すでに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では、この機能をツールボックスポッドから提供する方法について議論しています。
管理コマンドを実行するには
-
レジストリポッドに接続します:
kubectl exec -it <registry-pod> -- bash
-
レジストリポッドの内部では、
PATH
にregistry
のバイナリがあり、直接使用することができます。設定ファイルは/etc/docker/registry/config.yml
にあります。次の例は、データベースのマイグレーションの状態をチェックします:registry database migrate status /etc/docker/registry/config.yml
その他の詳細や使用可能なコマンドについては、関連ドキュメントを参照してください: