컨테이너 레지스트리 사용하기

Tier: Free, Premium, Ultimate Offering: Self-managed

registry 서브 차트는 Kubernetes에서 전체 클라우드 네이티브 GitLab 배포를 위한 레지스트리 컴포넌트를 제공합니다. 이 서브 차트는
업스트림 차트를 기반으로 하며, GitLab 컨테이너 레지스트리를 포함합니다.

이 차트는 3개의 주요 부분으로 구성됩니다:

모든 구성은
레지스트리 구성 문서에 따라 /etc/docker/registry/config.yml 변수를 사용하여 Deployment에 제공된 ConfigMap에서 채워집니다. ConfigMap는 업스트림 기본값을 재정의하지만,
기본값을 기반으로 합니다. 아래에서 자세한 내용을 참조하세요:

디자인 선택

Kubernetes Deployment는 인스턴스의 간단한 확장을 허용하기 위해 이 차트의 배포 방법으로 선택되었으며,
롤링 업데이트를 허용합니다.

이 차트는 두 개의 필수 비밀과 하나의 선택적 비밀을 사용합니다:

필수

  • global.registry.certificate.secret: 관련 GitLab 인스턴스에서 제공하는 인증 토큰을 확인하기 위해 공용 인증서 번들이 포함된 글로벌 비밀입니다. GitLab을 인증 엔드포인트로 사용하는 방법에 대한 문서를 참조하세요.
  • global.registry.httpSecret.secret: 레지스트리 포드 간의
    공유 비밀을 포함하는 글로벌 비밀입니다.

선택적

  • profiling.stackdriver.credentials.secret: Stackdriver 프로파일링이 활성화되고 명시적인 서비스 계정 자격 증명을 제공해야 하는 경우 이 비밀의 값(기본적으로 credentials 키에 있음)은 GCP 서비스 계정 JSON 자격 증명입니다.
    GKE를 사용하고 워크로드에 서비스 계정을 제공하는 경우
    워크로드 아이덴티티
    (또는 노드 서비스 계정, 권장하지 않음) 를 사용하는 경우 이 비밀은 필요하지 않으며 제공되지 않아야 합니다.
    두 경우 모두, 서비스 계정은 roles/cloudprofiler.agent 역할이 필요하며, 이와 동등한 수동 권한을 요구합니다.

구성

구성의 주요 섹션을 모두 설명하겠습니다. 상위 차트에서 구성할 때 이러한 값은 다음과 같습니다:

registry:
  enabled:
  maintenance:
    readonly:
      enabled: false
    uploadpurging:
      enabled: true
      age: 168h
      interval: 24h
      dryrun: false
  image:
    tag: 'v4.10.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: []
  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:

이 차트를 독립형으로 배포하기로 선택한 경우 최상위 수준의 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를 활성화합니다. 라이브니스 및 레디니스 프로브, 메트릭 엔드포인트(활성화된 경우)에 영향을 줍니다.
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 신호를 수신한 후 HTTP 연결이 소멸되기를 기다리는 시간(예: '10s')
relativeurls false 레지스트리가 위치 헤더에 상대 URL을 반환하도록 활성화합니다.
enabled true 레지스트리 플래그 활성화
hpa.behavior {scaleDown: {stabilizationWindowSeconds: 300 }} 동적 스케일링 동작에 대한 사양 포함(최소 autoscaling/v2beta2 필요)
hpa.customMetrics [] 원하는 복제 수를 계산하는 데 사용할 사양을 포함하는 사용자 정의 메트릭(기본 CPU 사용량 평균을 사용하도록 구성된 targetAverageUtilization 사용 재정의)
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.10.0-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 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.cpuhpa.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.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   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 연결을 기다리는 최대 시간. 0 또는 지정하지 않으면 무한정 기다립니다.
database.draintimeout 0 종료 시 모든 연결을 드레인하는 데 기다리는 최대 시간. 0 또는 지정하지 않으면 무한정 기다립니다.
database.preparedstatements false 준비된 명령문을 활성화합니다. PgBouncer와의 호환성을 위해 기본적으로 비활성화되어 있습니다.
database.primary false 대상 기본 데이터베이스 서버. 레지스트리 database.migrations를 실행할 때 대상 FQDN을 지정하는 데 사용됩니다. host가 지정되지 않은 경우 database.migrations를 실행하는 데 사용됩니다.
database.pool.maxidle 0 유휴 연결 풀의 최대 연결 수. maxopen보다 maxidle가 작으면 maxidlemaxopen 제한과 일치하도록 줄어듭니다. 0 또는 지정하지 않으면 유휴 연결이 없습니다.
database.pool.maxopen 0 데이터베이스에 대한 최대 열린 연결 수. maxopenmaxidle보다 작으면 maxidlemaxopen 제한과 일치하도록 줄어듭니다. 0 또는 지정하지 않으면 무제한 열린 연결이 됩니다.
database.pool.maxlifetime 0 연결이 재사용될 수 있는 최대 시간입니다. 만료된 연결은 재사용 전에 게으르게 닫힐 수 있습니다. 0 또는 지정하지 않으면 무제한 재사용됩니다.
database.pool.maxidletime 0 연결이 유휴일 수 있는 최대 시간입니다. 만료된 연결은 재사용 전에 게으르게 닫힐 수 있습니다. 0 또는 지정하지 않으면 무제한 지속됩니다.
database.migrations.enabled true 초기 배포 및 차트 업그레이드 시 마이그레이션을 자동으로 실행하는 마이그레이션 작업 활성화. 실행 중인 Registry 포드 내에서 수동으로 마이그레이션을 실행할 수도 있습니다.
database.migrations.activeDeadlineSeconds 3600 마이그레이션 작업에 대한 activeDeadlineSeconds를 설정합니다.
database.migrations.annotations {} 마이그레이션 작업에 추가할 추가 주석.
database.migrations.backoffLimit 6 마이그레이션 작업에 대한 backoffLimit를 설정합니다.
database.backgroundMigrations.enabled false 데이터베이스에 대한 백그라운드 마이그레이션을 활성화합니다. 이는 레지스트리 메타데이터 데이터베이스용 실험적 기능입니다. 생산 환경에서 사용하지 마십시오. 사양에는 작동 방식에 대한 자세한 설명이 나와 있습니다.
database.backgroundMigrations.jobInterval   각 백그라운드 마이그레이션 작업자 실행 간의 대기 간격. 지정되지 않은 경우 레지스트리가 기본 값을 설정합니다.
database.backgroundMigrations.maxJobRetries   실패한 백그라운드 마이그레이션 작업에 대한 최대 재시도 횟수. 지정되지 않은 경우 레지스트리가 기본 값을 설정합니다.
gc.disabled true true로 설정되면 온라인 GC 작업자가 비활성화됩니다.
gc.maxbackoff 24h 오류가 발생할 때 작업자 실행 간에 대기하는 데 사용되는 최대 지수 백오프 기간. 처리할 작업이 없을 때도 적용되며 gc.noidlebackofftrue가 아닌 경우에만 적용됩니다. 이 점을 유의하십시오. 항상 최대 33%의 무작위 변동 요소가 추가됩니다.
gc.noidlebackoff false true로 설정하면 처리할 작업이 없을 때 작업자 실행 간의 지수 백오프가 비활성화됩니다.
gc.transactiontimeout 10s 각 작업자 실행에 대한 데이터베이스 트랜잭션 시간 초과. 각 작업자는 시작 시 데이터베이스 트랜잭션을 시작합니다. 이 시간 초과를 초과하면 작업자 실행이 취소되어 지연되거나 오랜 시간이 걸리는 트랜잭션을 방지합니다.
gc.blobs.disabled false true로 설정하면 blobs를 위한 GC 작업자가 비활성화됩니다.
gc.blobs.interval 5s 각 작업자 실행 간의 초기 대기 시간 간격.
gc.blobs.storagetimeout 5s 저장 작업에 대한 시간 초과입니다. 스토리지 백엔드에서 남아있는 blobs를 삭제하는 요청의 지속 시간을 제한하는 데 사용됩니다.
gc.manifests.disabled false true로 설정하면 매니페스트를 위한 GC 작업자가 비활성화됩니다.
gc.manifests.interval 5s 각 작업자 실행 간의 초기 대기 시간 간격.
gc.reviewafter 24h 가비지 수집기가 검토할 레코드를 선택하는 데 필요한 최소 시간. -1은 대기하지 않음을 의미합니다.
securityContext.fsGroup 1000 포드가 시작되는 그룹 ID
securityContext.runAsUser 1000 포드가 시작되는 사용자 ID
securityContext.fsGroupChangePolicy   볼륨의 소유권 및 권한을 변경하기 위한 정책(쿠버네티스 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 액세스 토큰이 포드에 마운트되는지 여부를 나타냅니다.
serviceAccount.enabled false ServiceAccount를 사용할지 여부를 나타냅니다.
serviceLabels {} 보조 서비스 레이블
tokenService container_registry JWT 토큰 서비스
tokenIssuer gitlab-issuer JWT 토큰 발급자
tolerations [] 포드 할당에 대한 허용 레이블
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.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.sentinelpassword.enabled false Redis 센티넬이 비밀번호로 보호되는지 여부를 나타냅니다. redis.cache.sentinelpassword가 비어 있으면 global.redis.sentinelAuth의 값이 사용됩니다. redis.cache.sentinels가 정의된 경우에만 사용됩니다.
redis.cache.sentinelpassword.secret gitlab-redis-secret Redis 센티넬 비밀번호를 포함하는 비밀의 이름.
redis.cache.sentinelpassword.key redis-sentinel-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 true로 설정하여 TLS를 활성화합니다.
redis.cache.tls.insecure false TLS를 통해 연결할 때 서버 이름 검증을 비활성화하려면 true로 설정합니다.
redis.cache.pool.size 10 최대 소켓 연결 수. 기본값은 10개의 연결입니다.
redis.cache.pool.maxlifetime 1h 클라이언트가 연결을 종료하는 연결의 최대 연령. 기본값은 노수가 오래된 연결을 닫지 않습니다.
redis.cache.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-name

serviceAccount

이 섹션은 ServiceAccount를 생성할지 여부와 기본 액세스 토큰이 팟에 마운트될지 여부를 제어합니다.

이름 유형 기본값 설명
automountServiceAccountToken Boolean false 기본 ServiceAccount 액세스 토큰이 팟에 마운트될지를 제어합니다. 특정 사이드카가 제대로 작동하는 데 필요하지 않는 한 이 옵션은 활성화하지 않아야 합니다 (예: Istio).
enabled Boolean false ServiceAccount를 사용할지 여부를 나타냅니다.

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 규칙:
    • 표현식에 해당하는 팟과 동일한 도메인에 팟을 스케줄하지 않도록 설정합니다.
    • 두 가지 모드의 podAntiAffinity 규칙을 설정합니다: 필수(requiredDuringSchedulingIgnoredDuringExecution) 및 선호(preferredDuringSchedulingIgnoredDuringExecution). values.yaml에서 antiAffinity 변수를 사용하여 설정을 soft로 설정하여 선호 모드가 적용되도록 하거나, hard로 설정하여 필수 모드가 적용되도록 합니다.
  • nodeAffinity 규칙:
    • 특정 존 또는 존에 속하는 노드에 팟을 스케줄합니다.
    • 두 가지 모드의 nodeAffinity 규칙을 설정합니다: 필수(requiredDuringSchedulingIgnoredDuringExecution) 및 선호(preferredDuringSchedulingIgnoredDuringExecution). soft로 설정할 경우 선호 모드가 적용되며, hard로 설정할 경우 필수 모드가 적용됩니다. 이 규칙은 registry 차트와 gitlab 차트 및 모든 하위 차트에서만 구현됩니다. 단, webservicesidekiq는 제외됩니다.

nodeAffinityIn 연산자만 구현합니다.

자세한 내용은 관련 Kubernetes 문서를 참조하세요.

다음 예시는 affinity를 설정하며, nodeAffinityantiAffinity 모두 hard로 설정됩니다:

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

주석

annotations는 레지스트리 팟에 주석을 추가할 수 있게 해줍니다.

아래는 annotations 사용 예시입니다.

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

서브 차트 활성화

우리가 선택한 컴파트먼트 서브 차트 구현 방식은 주어진 배포에서 원하지 않는 구성 요소를 비활성화할 수 있는 기능을 포함합니다. 이러한 이유로 먼저 결정해야 할 설정은 enabled입니다.

기본적으로 레지스트리는 기본 설정으로 활성화되어 있습니다. 이를 비활성화하길 원하신다면 enabled: false로 설정하세요.

image 구성

이 섹션은 이 서브 차트의 배포에서 사용되는 컨테이너 이미지의 설정을 자세히 설명합니다.

레지스트리의 포함된 버전과 pullPolicy를 변경할 수 있습니다.

기본 설정:

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

service 구성

이 섹션은 서비스의 이름과 유형을 제어합니다.

이 설정들은 values.yaml로 채워집니다.

기본적으로 서비스는 다음과 같이 구성됩니다:

이름 유형 기본값 설명
name String registry 서비스의 이름을 구성합니다.
type String ClusterIP 서비스의 유형을 구성합니다.
externalPort Int 5000 서비스가 노출하는 포트
internalPort Int 5000 서비스로부터 요청을 수락하는 데 사용되는 포드의 포트
clusterIP String null 필요에 따라 사용자 정의 클러스터 IP를 구성할 수 있습니다.
loadBalancerIP String null 필요에 따라 사용자 정의 로드 밸런서 IP 주소를 구성할 수 있습니다.

ingress 구성

이 섹션은 레지스트리 인그레스를 제어합니다.

이름 유형 기본값 설명
apiVersion String   apiVersion 필드에 사용할 값입니다.
annotations String   이 필드는 Kubernetes Ingress에 대한 표준 annotations와 정확히 일치합니다.
configureCertmanager Boolean   Ingress 주석 cert-manager.io/issueracme.cert-manager.io/http01-edit-in-place를 토글합니다. 더 많은 정보는 GitLab Pages의 TLS 요구 사항을 참조하세요.
enabled Boolean false 서비스에 대한 Ingress 객체 생성 여부를 제어하는 설정입니다. false일 경우 global.ingress.enabled 설정이 사용됩니다.
tls.enabled Boolean true false로 설정하면 레지스트리 서브차트의 TLS가 비활성화됩니다. 이는 Ingress Controller 앞에 TLS 종료 프록시가 있는 경우와 같이 Ingress 수준에서 TLS 종료를 사용할 수 없는 경우에 유용합니다.
tls.secretName String   레지스트리 URL에 대한 유효한 인증서 및 키를 포함하는 Kubernetes TLS 비밀의 이름입니다. 설정되지 않을 경우 global.ingress.tls.secretName이 대신 사용됩니다. 설정되지 않은 기본값입니다.

TLS 구성

Container Registry는 TLS를 지원하여 다른 구성 요소와의 통신을 보호합니다,
nginx-ingress를 포함하여.

TLS 구성을 위한 전제 조건:

  • TLS 인증서에는 Registry 서비스 호스트 이름
    (예: RELEASE-registry.default.svc)이 Common
    Name(CN) 또는 Subject Alternate Name(SAN)에 포함되어야 합니다.
  • TLS 인증서가 생성된 후:
    • Kubernetes TLS Secret 생성
    • CA 인증서로만 구성된 다른 Secret을 ca.crt 키와 함께 생성합니다.

TLS를 활성화하려면:

  1. registry.tls.enabledtrue로 설정합니다.
  2. global.hosts.registry.protocolhttps로 설정합니다.
  3. Secret 이름을 registry.tls.secretNameglobal.certificates.customCAs에 각각 전달합니다.

registry.tls.verifytrue일 때, CA 인증서 Secret
이름을 registry.tls.caSecretName에 전달해야 합니다. 이는
자체 서명된 인증서 및 사용자 정의 인증 기관에 필요합니다. 이 Secret은 NGINX가 Registry의 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 구성

Registry 디버그 포트는 TLS를 지원합니다. 디버그 포트는
Kubernetes 생존성 및 준비 상태 검사에 사용되며, /metrics
엔드포인트를 Prometheus(활성화된 경우)용으로 노출합니다.

TLS는 registry.debug.tls.enabledtrue로 설정하여 활성화할 수 있습니다.
디버그 포트의 TLS 구성에서 사용할 전용 Kubernetes TLS Secretregistry.debug.tls.secretName에 제공될 수 있습니다.
전용 Secret이 지정되지 않은 경우, 디버그 구성은 레지스트리의 일반 TLS 구성과 registry.tls.secretName을 공유하도록 되돌아갑니다.

Prometheus가 https를 사용하여 /metrics/ 엔드포인트를 스크랩하려면
인증서의 CommonName 속성이나 SubjectAlternativeName 항목에 대한 추가 구성이 필요합니다.
그 요구 사항은
TLS 활성화된 엔드포인트를 스크랩하기 위한 Prometheus 구성을 참조하세요.

networkpolicy 구성

이 섹션은 레지스트리의
NetworkPolicy를 제어합니다.
이 구성은 선택 사항이며, 레지스트리의 외부 발신 및 수신을 특정 엔드포인트로 제한하는 데 사용됩니다.
및 수신을 특정 엔드포인트로 제한하는 데 사용됩니다.

이름 유형 기본값 설명
enabled Boolean false 이 설정은 레지스트리의 NetworkPolicy를 활성화합니다.
ingress.enabled Boolean false true로 설정 시, Ingress 네트워크 정책이 활성화됩니다. 이는 규칙이 지정되지 않은 경우 모든 Ingress 연결을 차단합니다.
ingress.rules Array [] Ingress 정책의 규칙으로, 자세한 내용은 https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource 및 아래 예제를 참조하세요.
egress.enabled Boolean false true로 설정 시, Egress 네트워크 정책이 활성화됩니다. 이는 규칙이 지정되지 않은 경우 모든 외부 발신 연결을 차단합니다.
egress.rules Array [] 외부 발신 정책의 규칙으로, 자세한 내용은 https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource 및 아래 예제를 참조하세요.

모든 내부 엔드포인트에 대한 연결 방지를 위한 정책 예시

Registry 서비스는 일반적으로 오브젝트 스토리지에 대한 egress 연결, Docker 클라이언트로부터의 ingress 연결, DNS 조회를 위한 kube-dns를 필요로 합니다. 이는 Registry 서비스에 다음과 같은 네트워크 제약을 추가합니다:

  • 10.0.0.0/8 포트 53에 대한 모든 egress 요청이 허용됩니다 (kubeDNS 용)
  • 10.0.0.0/8에 대한 기타 egress 요청은 제한됩니다
  • 10.0.0.0/8 외부의 egress 요청은 허용됩니다

레지스트리 서비스는 외부 오브젝트 스토리지의 이미지를 위해 공용 인터넷에 대한 아웃바운드 연결이 필요합니다.

networkpolicy:
  enabled: true
  egress:
    enabled: true
    # 다음 규칙은 모든 외부
    # 엔드포인트로의 트래픽을 가능하게 하며, 
    # 로컬 네트워크는 제외합니다 
    # (DNS 요청 제외)
    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 섹션에 설정된 값으로 기본값이 설정됩니다.

다음 조건이 참이면 CPU 및 메모리 트리거가 hpa 섹션에서 설정된 CPU 및 메모리 임계값에 따라 자동으로 추가됩니다:

  • triggers가 설정되어 있지 않습니다.
  • 해당 request.cpu.request 또는 request.memory.request 설정이 0이 아닌 값으로 설정되어 있습니다.

트리거가 설정되지 않으면 ScaledObject가 생성되지 않습니다.

해당 설정에 대한 더 자세한 내용은 KEDA 문서를 참조하세요.

이름 유형 기본값 설명
enabled Boolean false KEDA ScaledObjects를 사용하여 HorizontalPodAutoscalers 대신 활용합니다.
pollingInterval Integer 30 각 트리거를 확인하는 간격입니다.
cooldownPeriod Integer 300 마지막 트리거가 활성 상태로 보고된 후 리소스를 다시 0으로 스케일링하기 전 기다리는 기간입니다.
minReplicaCount Integer   KEDA가 리소스를 축소할 최소 복제본 수로, 기본값은 hpa.minReplicas입니다.
maxReplicaCount Integer   KEDA가 리소스를 확장할 최대 복제본 수로, 기본값은 hpa.maxReplicas입니다.
fallback Map   KEDA의 폴백 구성으로, 문서를 참조하세요.
hpaName String   KEDA가 생성할 HPA 리소스의 이름으로, 기본값은 keda-hpa-{scaled-object-name}입니다.
restoreToOriginalReplicaCount Boolean   ScaledObject가 삭제된 후 목표 리소스를 원래 복제본 수로 되돌릴지 여부를 지정합니다.
behavior Map   업스케일 및 다운스케일 동작의 사양으로, 기본값은 hpa.behavior입니다.
triggers Array   목표 리소스의 스케일링을 활성화하는 트리거 목록으로, 기본값은 hpa.cpuhpa.memory에서 계산된 트리거입니다.

모든 내부 엔드포인트에 대한 연결을 방지하기 위한 정책 예시

Registry 서비스는 일반적으로 객체 저장소에 대한 egress 연결, Docker 클라이언트로부터의 ingress 연결, 그리고 DNS 조회를 위한 kube-dns를 필요로 합니다. 이는 Registry 서비스에 다음과 같은 네트워크 제한을 추가합니다:

  • 10.0.0.0/8 포트 53에 대한 모든 egress 요청이 허용됩니다 (kubeDNS를 위해)
  • 10.0.0.0/8에 대한 다른 egress 요청은 제한됩니다
  • 10.0.0.0/8 외부에 대한 egress 요청은 허용됩니다

Registry 서비스는 외부 객체 저장소의 이미지를 위해 공용 인터넷에 대한 아웃바운드 연결을 필요로 합니다.

networkpolicy:
  enabled: true
  egress:
    enabled: true
    # 다음 규칙은 로컬
    # 네트워크(및 DNS 요청 제외)를 제외한 모든 외부
    # 엔드포인트에 대한 트래픽을 허용합니다.
    rules:
      - to:
        - ipBlock:
            cidr: 10.0.0.0/8
        ports:
        - port: 53
          protocol: UDP
      - to:
        - ipBlock:
            cidr: 0.0.0.0/0
            except:
            - 10.0.0.0/8

Registry 구성 정의

이 차트의 다음 속성은 기본 registry 컨테이너의 구성과 관련이 있습니다. GitLab과의 통합을 위해 가장 중요한 값만 노출됩니다. 이 통합에서는 JWT 인증 토큰을 통해 registry에 대한 인증을 제어하는 auth.token.x 설정을 사용합니다.

httpSecret

필드 httpSecretsecretkey라는 두 가지 항목을 포함하는 맵입니다.

여기서 참조하는 키의 내용은 registryhttp.secret 값과 관련이 있습니다. 이 값은 암호학적으로 생성된 랜덤 문자열로 채워져야 합니다.

shared-secrets 작업은 제공되지 않은 경우 이 비밀을 자동으로 생성합니다. 이는 안전하게 생성된 128자리 알파-넘 문자 문자열로 채워지며 base64로 인코딩됩니다.

이 비밀을 수동으로 생성하려면:

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

알림 비밀

알림 비밀은 다양한 방식으로 GitLab 애플리케이션에 콜백을 요청하는 데 사용되며, 예를 들어 Geo가 기본 및 보조 사이트 간에 Container Registry 데이터를 동기화하는 데 도움을 줍니다.

제공되지 않은 경우, shared-secrets 기능이 활성화되면 notificationSecret 비밀 객체가 자동으로 생성됩니다.

이 비밀을 수동으로 생성하려면:

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

그런 다음 설정을 진행합니다:

global:
  # 자신의 비밀을 제공하기 위해
  registry:
    notificationSecret:
        secret: gitlab-registry-notification
        key: secret

  # Geo를 활용하고 컨테이너 레지스트리를 동기화하려는 경우.
  # 이 설정은 기본 사이트 구성에서만 정의합니다.
  geo:
    registry:
      replication:
        enabled: true
        primaryApiUrl: <기본 레지스트리에 대한 URL>

위에서 생성한 비밀의 secret 값을 설정해야 합니다.

Redis 캐시 비밀

Redis 캐시 비밀은 global.redis.auth.enabledtrue로 설정된 경우에 사용됩니다.

shared-secrets 기능이 활성화되면, 제공되지 않은 경우 gitlab-redis-secret 비밀 객체가 자동으로 생성됩니다.

이 비밀을 수동으로 생성하려면 Redis 비밀번호 지침을 참조하세요.

authEndpoint

authEndpoint 필드는 문자열로, registry가 인증할 GitLab 인스턴스의 URL을 제공합니다.

값에는 프로토콜과 호스트 이름만 포함되어야 합니다. 차트 템플릿은 필요한 요청 경로를 자동으로 추가합니다. 결과 값은 컨테이너 내의 auth.token.realm에 채워집니다. 예: authEndpoint: "https://gitlab.example.com"

기본적으로 이 필드는 Global Settings에서 설정한 GitLab 호스트 이름 구성으로 채워집니다.

certificate

certificate 필드는 secretkey라는 두 항목을 포함하는 맵입니다.

secret은 GitLab 인스턴스에서 생성한 토큰을 검증하는 데 사용될 인증서 번들을 포함하는 Kubernetes Secret의 이름을 포함하는 문자열입니다.

key는 인증서 번들을 포함하는 Secret에서 제공될 key의 이름으로, registry 컨테이너에 auth.token.rootcertbundle으로 제공됩니다.

기본 예시:

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

readiness and liveness probe

기본적으로 /debug/health에서 포트 5001로 확인하는 readiness 및 liveness probe가 구성되어 있습니다. 이는 디버그 포트입니다.

validation

validation 필드는 registry에서 Docker 이미지 검증 프로세스를 제어하는 맵입니다. 이미지 검증이 활성화되면 registry는 manifests.urls.allow 필드 내에서 명시적으로 해당 레이어 URL을 허용하지 않는 한 외래 레이어가 있는 Windows 이미지를 거부합니다.

검증은 manifest 푸시 중에만 발생하므로, 이 섹션의 값 변경에 영향을 받지 않는 이미지는 이미 registry에 존재할 수 있습니다.

이미지 검증은 기본적으로 비활성화되어 있습니다.

이미지 검증을 활성화하려면 registry.validation.disabled: false를 명시적으로 설정해야 합니다.

manifests

manifests 필드는 manifests에 특정한 검증 정책 구성을 허용합니다.

urls 섹션에는 allowdeny 필드가 모두 포함되어 있습니다. 검증을 통과하는 URL이 포함된 manifest 레이어는 allow 필드의 정규 표현식 중 하나와 일치해야 하며, deny 필드의 정규 표현식에는 일치하지 않아야 합니다.

Name Type Default Description
referencelimit Int 0 단일 manifest가 가질 수 있는 최대 참조 수로, 레이어, 이미지 구성 및 기타 manifests를 포함합니다. 0으로 설정할 경우(기본값) 이 검증은 비활성화됩니다.
payloadsizelimit Int 0 manifest payload의 최대 데이터 크기(바이트)입니다. 0으로 설정할 경우(기본값) 이 검증은 비활성화됩니다.
urls.allow Array [] manifests의 레이어에서 URL을 허용하는 정규 표현식 목록입니다. 비워두면(기본값) URL이 포함된 레이어는 거부됩니다.
urls.deny Array [] manifests의 레이어에서 URL을 제한하는 정규 표현식 목록입니다. 비워두면(기본값) urls.allow 목록을 통과한 URL이 있는 레이어는 거부됩니다.

알림

notifications 필드는 Registry notifications를 구성하는 데 사용됩니다. 기본값으로 빈 해시를 가집니다.

이름 тип 기본값 설명
endpoints Array [] 각 항목이 endpoint에 해당하는 항목 목록
events Hash {} event 알림에 제공된 정보

예시 설정은 다음과 같이 보일 것입니다:

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

hpa

hpa 필드는 registry 인스턴스의 수를 제어하는 객체입니다. 기본적으로 minReplicas 값이 2, maxReplicas 값이 10으로 설정되어 있으며, cpu.targetAverageUtilization이 75%로 구성됩니다.

저장소

storage:
  secret:
  key: config
  extraKey:

storage 필드는 Kubernetes Secret 및 관련 키를 참조합니다. 이 비밀의 내용은 Registry Configuration: storage에서 직접 가져옵니다. 더 자세한 내용은 해당 문서를 참조하십시오.

AWS s3Google GCS 드라이버의 예시는 examples/objectstorage에서 찾을 수 있습니다:

S3의 경우, 올바른 registry storage 권한을 부여했는지 확인하십시오. 저장소 구성에 대한 더 많은 정보는 Container Registry storage driver 관리 문서에서 확인할 수 있습니다.

storage 블록의 내용을 비밀에 넣고 다음 항목을 storage 맵에 제공하십시오:

  • secret: YAML 블록을 포함하는 Kubernetes Secret의 이름.
  • key: 사용할 비밀의 키 이름. 기본값은 config입니다.
  • extraKey: (선택적) 비밀에서 추가 키의 이름으로, 이는 컨테이너 내에서 /etc/docker/registry/storage/${extraKey}에 마운트됩니다. 이는 gcs 드라이버의 keyfile을 제공하는 데 사용될 수 있습니다.
# S3 사용 예시
kubectl create secret generic registry-storage \
    --from-file=config=registry-storage.yaml

# JSON 키로 GCS 사용 예시
# - 참고: `registry.storage.extraKey=gcs.json`
kubectl create secret generic registry-storage \
    --from-file=config=registry-storage.yaml \
    --from-file=gcs.json=example-project-382839-gcs-bucket.json

저장소 드라이버에 대해 리디렉션을 비활성화할 수 있습니다, 이렇게 하면 모든 트래픽이 다른 백엔드로 리디렉션되는 대신 Registry 서비스로 흐릅니다:

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

filesystem 드라이버를 사용하기로 선택한 경우:

  • 이 데이터에 대해 지속적인 볼륨을 제공해야 합니다.
  • hpa.minReplicas1로 설정되어야 합니다.
  • hpa.maxReplicas1로 설정되어야 합니다.

회복력과 단순성을 위해 s3, gcs, azure 또는 기타 호환 가능한 객체 저장소와 같은 외부 서비스를 사용하는 것이 좋습니다.

참고: 차트는 기본적으로 사용자가 지정하지 않는 한 이 구성에 delete.enabled: true를 채워 넣습니다. 이는 기본적으로 MinIO의 사용 및 Linux 패키지와 일치하도록 기대되는 동작을 유지합니다. 사용자가 제공한 값은 이 기본값을 초과합니다.

middleware.storage

middleware.storage의 구성은 업스트림 규약을 따릅니다.

구성은 꽤 일반적이며 유사한 패턴을 따릅니다:

middleware:
  # https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#middleware 참조
  storage:
    - name: cloudfront
      options:
        baseurl: https://abcdefghijklmn.cloudfront.net/
        # `privatekey`는 privatekey Secret의 내용으로 자동 채워집니다.
        privatekeySecret:
          secret: cloudfront-secret-name
          # "key" 값은 PEM 저장소의 파일 이름을 생성하는 데 사용됩니다:
          #   /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 Secret에서 차트에 의해 자동 채워지며 지정된 경우 무시됩니다.

keypairid 변형

다양한 공급자는 동일한 구조에 대해 서로 다른 필드 이름을 사용합니다:

공급자 필드 이름
Google CDN keyname
CloudFront keypairid

주석: 현재 middleware.storage 섹션의 구성만 지원됩니다.

debug

디버그 포트는 기본적으로 활성화되어 있으며, 생존성/준비성 프로브에 사용됩니다. 추가적으로, metrics 값을 통해 Prometheus 메트릭을 활성화할 수 있습니다.

debug:
  addr:
    port: 5001

metrics:
  enabled: true

health

health 속성은 선택적이며, 저장 드라이버의 백엔드 저장소에 대한 주기적인 건강 검사를 위한 기본 설정을 포함합니다. 자세한 내용은 Docker의 구성 문서를 참조하세요.

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

reporting

reporting 속성은 선택적이며 보고를 활성화합니다.

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

profiling

profiling 속성은 선택적이며 지속적인 프로파일링을 활성화합니다.

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

database

database 속성은 선택적이며 메타데이터 데이터베이스를 활성화합니다.

이 기능을 활성화하기 전에 관리 문서를 참조하세요.

주석: 이 기능은 PostgreSQL 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
  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

데이터베이스 관리

데이터베이스 생성에 대한 자세한 내용은 컨테이너 레지스트리 메타데이터 데이터베이스 페이지를 참조하세요.

gc 속성

gc 속성은 온라인 가비지 컬렉션 옵션을 제공합니다.

온라인 가비지 컬렉션을 사용하려면 메타데이터 데이터베이스가 활성화되어야 합니다. 데이터베이스를 사용할 때 온라인 가비지 컬렉션을 사용해야 하지만, 유지 관리 및 디버깅을 위해 임시로 온라인 가비지 컬렉션을 비활성화할 수 있습니다.

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

Redis 캐시

참고:
Redis 캐시는 16.4 버전 이상에서 베타 기능입니다. 이 기능을 활성화하기 전에 피드백 문제와 관련 문서를 검토하세요.

redis.cache 속성은 선택 사항이며 Redis 캐시와 관련된 옵션을 제공합니다. 레지스트리와 함께 redis.cache를 사용하려면 메타데이터 데이터베이스를 활성화해야 합니다.

예를 들어:

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

클러스터

redis.rateLimiting.cluster 속성은 Redis 클러스터에 연결할 호스트 및 포트 목록입니다. 예를 들어:

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

센티넬

redis.cacheglobal.redis.sentinels 구성을 사용할 수 있습니다. 로컬 값은 제공될 수 있으며 글로벌 값보다 우선합니다. 예를 들어:

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

센티넬 비밀번호 지원

redis.cache는 또한 global.redis.sentinelAuth 구성을 사용하여 Redis 센티넬의 인증 비밀번호를 사용할 수 있습니다. 로컬 값은 제공될 수 있으며 글로벌 값보다 우선합니다. 예를 들어:

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

Redis 속도 제한기

경고:

Redis 속도 제한 기능은 개발 중입니다.

기능에 대한 자세한 내용은 제공되는 대로 이 섹션에 추가됩니다.

redis.rateLimiting 속성은 선택 사항이며 다음과 관련된 옵션을 제공합니다.

Redis 속도 제한기.

예를 들어:

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

가비지 수집

Docker 레지스트리는 시간이 지남에 따라 불필요한 데이터를 축적하며, 이를 사용하여 가비지 수집을 통해 해제할 수 있습니다.

현재로는 이 차트와 함께 가비지 수집을 실행하는 완전 자동화되거나 예약된 방법이 없습니다.

경고:

메타데이터 데이터베이스와 함께 온라인 가비지 수집을 사용해야 합니다. 메타데이터 데이터베이스로 수동 가비지 수집을 사용하면 데이터 손실이 발생합니다. 온라인 가비지 수집은 수동 가비지 수집을 완전히 대체합니다.

수동 가비지 수집

수동 가비지 수집을 위해서는 먼저 레지스트리를 읽기 전용 모드로 전환해야 합니다. 이미 Helm을 사용하여 GitLab 차트를 설치했으며, 이를 mygitlab라고 명명하고 gitlabns 네임스페이스에 설치했다고 가정합니다.

아래 명령어에서 이러한 값을 실제 구성에 맞게 교체하세요.

# https://github.com/helm/helm/issues/2948로 인해 --reuse-values에 의존할 수 없으므로 현재 구성을 가져옵니다.
helm get values mygitlab > mygitlab.yml
# Helm 설치를 업그레이드하고 레지스트리를 읽기 전용으로 설정합니다.
# --wait 매개변수는 Helm이 모든 리소스가 준비 상태가 될 때까지 기다리게 하므로 안전하게 계속할 수 있습니다.
helm upgrade mygitlab gitlab/gitlab -f mygitlab.yml --set registry.maintenance.readonly.enabled=true --wait
# 이제 레지스트리가 읽기 전용 모드에 있으므로 레지스트리 Pod 중 하나의 이름을 가져옵니다.
# Pod 이름을 기록하고 아래의 '<registry-pod>' 자리 표시자를 해당 값으로 교체하세요.
# Windows의 cmd.exe와 함께 사용하는 경우 작은따옴표를 큰따옴표로 교체하세요 (' => ") .
kubectl get pods -n gitlabns -l app=registry -o jsonpath='{.items[0].metadata.name}'
# 실제 가비지 수집을 실행합니다. '-m' 매개변수를 정말로 원하신다면 레지스트리의 매뉴얼을 확인하세요.
kubectl exec -n gitlabns <registry-pod> -- /bin/registry garbage-collect -m /etc/docker/registry/config.yml
# 레지스트리를 원래 상태로 되돌립니다.
helm upgrade mygitlab gitlab/gitlab -f mygitlab.yml --wait
# 모두 완료되었습니다 :)

컨테이너 레지스트리에 대한 관리 명령 실행

관리 명령은 컨테이너 레지스트리에서만 실행할 수 있으며, 여기에는 registry 바이너리와 필수 구성 파일이 모두 제공되는 레지스트리 pod에서만 가능합니다. 이슈 #2629에서 툴박스 pod에서 이 기능을 제공하는 방법을 논의 중입니다.

관리 명령을 실행하려면:

  1. 레지스트리 pod에 연결합니다:

    kubectl exec -it <registry-pod> -- bash
    
  2. 레지스트리 pod 내부에 들어가면 registry 바이너리가 PATH에 있으며 직접 사용할 수 있습니다. 구성 파일은 /etc/docker/registry/config.yml에 있습니다. 다음 예제는 데이터베이스 마이그레이션의 상태를 확인합니다:

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

추가 세부정보 및 다른 사용 가능한 명령어에 대해서는 관련 문서를 참조하세요: