- 디자인 선택 사항
- 구성
- 설치 매개변수
- 차트 구성 예시
- 서브-차트 활성화
image
구성service
구성ingress
구성- TLS 구성
-
networkpolicy
구성 - KEDA 구성
- 레지스트리 구성 정의
- Garbage Collection
컨테이너 레지스트리 사용
registry
서브 차트는 쿠버네티스에서 완전한 클라우드 네이티브 GitLab 배포에 Registry 구성 요소를 제공합니다. 이 서브 차트는 상위 차트를 기반으로 하며 GitLab 컨테이너 레지스트리를 포함하고 있습니다.
이 차트는 3가지 핵심 부분으로 구성되어 있습니다:
모든 구성은 /etc/docker/registry/config.yml
변수에 제공되며 Deployment
에서 ConfigMap
에서 제공된 값을 포함합니다. ConfigMap
은 상위 기본값을 재정의하지만 그것들을 기반으로 합니다. 자세한 내용은 아래를 참조하십시오:
디자인 선택 사항
이 차트에서는 이러한 차트의 배포 방법으로 쿠버네티스 Deployment
를 선택하여 인스턴스의 간단한 스케일링을 허용하고 롤링 업데이트를 허용합니다.
이 차트는 두 가지 필수 시크릿과 하나의 선택적 시크릿을 사용합니다:
필수
-
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: '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
| 유효한 인증서 및 키를 포함하는 쿠버네티스 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
| 레지스트리가 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
| v4.10.0-gitlab
| 사용할 이미지 버전 |
… (이하 생략) … |
차트 구성 예시
pullSecrets
pullSecrets
를 사용하면 pod에서 이미지를 가져오기 위해 개인 레지스트리에 인증할 수 있습니다.
개인 레지스트리 및 해당 인증 방법에 대한 자세한 내용은 Kubernetes 문서에서 찾을 수 있습니다.
아래는 pullSecrets
의 사용 예시입니다:
image:
repository: my.registry.repository
tag: latest
pullPolicy: Always
pullSecrets:
- name: my-secret-name
- name: my-secondary-secret-name
serviceAccount
이 섹션은 ServiceAccount를 생성하고 기본 액세스 토큰을 pod에 마운트해야 하는지 여부를 제어합니다.
Name | Type | Default | Description |
---|---|---|---|
automountServiceAccountToken
| Boolean | false
| 기본 ServiceAccount 액세스 토큰을 pod에 마운트해야 하는지 여부를 제어합니다. 특정 사이드카에서 작동에 필요한 경우를 제외하고는 이를 활성화하지 않아야 합니다(예: Istio). |
enabled
| Boolean | false
| ServiceAccount를 사용할지 여부를 나타냅니다. |
tolerations
tolerations
를 사용하면 오염된 워커 노드에 pod를 예약할 수 있습니다.
아래는 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
와 일치하는 pod와 동일한 도메인에 pod를 예약하지 않습니다. -
podAntiAffinity
규칙의 두 가지 모드를 설정합니다: required(requiredDuringSchedulingIgnoredDuringExecution
) 및 preferred(preferredDuringSchedulingIgnoredDuringExecution
).values.yaml
에서antiAffinity
를 사용하여 설정을soft
로 지정하여 preferred 모드를 적용하거나hard
로 지정하여 required 모드를 적용합니다.
-
-
nodeAffinity
규칙:- 특정 존에 속하는 노드에 pod를 예약합니다.
-
nodeAffinity
규칙의 두 가지 모드를 설정합니다: required(requiredDuringSchedulingIgnoredDuringExecution
) 및 preferred(preferredDuringSchedulingIgnoredDuringExecution
).soft
로 설정하면 preferred 모드가 적용됩니다.hard
로 설정하면 required 모드가 적용됩니다. 이 규칙은registry
차트 및gitlab
차트와 그 하위 차트인webservice
및sidekiq
를 제외한 모든 서브차트에 대해서만 구현됩니다.
nodeAffinity
는 In
operator만 구현합니다.
더 자세한 내용은 관련 Kubernetes 문서를 참조하세요.
다음 예시는 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
를 사용하면 레지스트리 pod에 주석을 추가할 수 있습니다.
아래는 annotations
의 사용 예시입니다:
annotations:
kubernetes.io/example-annotation: annotation-value
서브-차트 활성화
우리가 선택한 구현된 칸막이 서브-차트는 특정 배포에서 원하지 않는 구성 요소를 비활성화할 수 있는 기능을 포함합니다. 따라서, 먼저 결정해야 하는 첫 번째 설정은 enabled
입니다.
기본적으로 레지스트리는 기본적으로 활성화되어 있습니다. 비활성화하려면 enabled: false
로 설정하세요.
image
구성
이 섹션은 이 서브-차트의 배포에서 사용되는 컨테이너 이미지의 설정을 자세히 설명합니다. 레지스트리 및 pullPolicy
의 모든 포함된 버전을 변경할 수 있습니다.
기본 설정:
tag: 'v4.10.0-gitlab'
pullPolicy: 'IfNotPresent'
service
구성
이 섹션은 Service의 이름과 유형을 제어합니다. 이러한 설정은 values.yaml
에 의해 채워집니다.
기본적으로 Service는 다음과 같이 구성됩니다:
Name | Type | Default | Description |
---|---|---|---|
name
| String | registry
| 서비스의 이름을 구성합니다. |
type
| String | ClusterIP
| 서비스의 유형을 구성합니다. |
externalPort
| Int | 5000
| 서비스에서 노출된 포트입니다. |
internalPort
| Int | 5000
| Pod가 서비스에서 요청을 수락하는 데 사용하는 포트입니다. |
clusterIP
| String | null
| 필요에 따라 사용자 정의 클러스터 IP를 구성합니다. |
loadBalancerIP
| String | null
| 필요에 따라 사용자 정의 로드 밸런서 IP 주소를 구성합니다. |
ingress
구성
이 섹션은 레지스트리 Ingress를 제어합니다.
Name | Type | Default | Description |
---|---|---|---|
apiVersion
| String |
apiVersion 필드에 사용할 값입니다.
| |
annotations
| String | 이 필드는 Kubernetes Ingress의 표준 annotations 과 정확히 일치합니다.
| |
configureCertmanager
| Boolean | Ingress 주석 cert-manager.io/issuer 및 acme.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 컨트롤러의 앞에서 TLS를 해제할 수 없는 경우에 유용합니다(예: TLS를 해제하는 프록시가 Ingress Controller 앞에 있을 때 등).
|
tls.secretName
| String | 레지스트리 URL에 대한 유효한 인증서와 키를 포함하는 Kubernetes TLS Secret의 이름입니다. 설정되지 않으면 global.ingress.tls.secretName 이 대신 사용됩니다. 기본적으로 설정되지 않습니다.
|
TLS 구성
컨테이너 레지스트리는 다른 구성 요소와의 통신을 보호하는 TLS를 지원하며, 이에는 nginx-ingress
가 포함됩니다.
TLS를 구성하기 위한 사전 요구 사항:
- TLS 인증서에는 레지스트리 서비스 호스트 이름
(예:
RELEASE-registry.default.svc
)이 공용 이름 (CN) 또는 대체 이름 (SAN)에 포함되어야 합니다. - TLS 인증서를 생성한 후:
- Kubernetes TLS Secret를 생성합니다.
- TLS 인증서의 CA 인증서만을 포함하는 다른 Secret을
ca.crt
키로 생성합니다.
TLS를 활성화하려면:
-
registry.tls.enabled
를true
로 설정합니다. -
global.hosts.registry.protocol
를https
로 설정합니다. -
registry.tls.secretName
및global.certificates.customCAs
에 Secret 이름을 전달합니다.
registry.tls.verify
가 true
일 때, CA 인증서 Secret
이름을 registry.tls.caSecretName
에 전달해야 합니다. 이것은 자체 서명된
인증서 및 사용자 정의 인증 기관에 필요합니다. 이 Secret은 레지스트리의 TLS
인증서를 NGINX가 확인하는 데 사용됩니다.
예:
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
로 설정합니다.
디버그 포트의 TLS 구성에 사용할 Kubernetes TLS Secret
을 지정할 수 있습니다. 별도의 Secret이 지정되지 않으면 디버그 구성은
레지스트리의 일반 TLS 구성인 registry.tls.secretName
을 공유하게 됩니다.
Prometheus가 https
를 사용하여 /metrics/
엔드포인트를 스크랩하기 위해
인증서의 공용 이름 속성 또는 대체 이름 항목에 대한 추가 구성이 필요합니다. 자세한 내용은
Prometheus에 TLS 활성 엔드포인트 스크랩 구성
을 참조하세요.
networkpolicy
구성
이 섹션은 레지스트리의 NetworkPolicy 를 제어합니다. 이 구성은 선택 사항이며, 레지스트리의 Egress 및 Ingress를 특정 엔드포인트로 제한하는 데 사용됩니다.
이름 | 유형 | 기본값 | 설명 |
---|---|---|---|
enabled
| 부울 | false
| 이 설정을 통해 레지스트리의 NetworkPolicy 를 활성화합니다.
|
ingress.enabled
| 부울 | false
|
true 로 설정하면 Ingress 네트워크 정책이 활성화됩니다. 이렇게 하면 규칙이 지정되지 않은 경우 모든 Ingress 연결이 차단됩니다.
|
ingress.rules
| 배열 | []
| Ingress 정책에 대한 규칙은 https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource 및 아래 예시를 참조하세요. |
egress.enabled
| 부울 | false
|
true 로 설정하면 Egress 네트워크 정책이 활성화됩니다. 이렇게 하면 규칙이 지정되지 않은 경우 모든 Egress 연결이 차단됩니다.
|
egress.rules
| 배열 | []
| Egress 정책에 대한 규칙은 https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource와 아래 예시를 참조하세요. |
내부 엔드포인트 연결 방지 정책 예시
레지스트리 서비스는 일반적으로 객체 저장소로의 egress 연결, Docker 클라이언트로부터의 ingress 연결 및 DNS 조회를 위해 kube-dns에 대한 egress 연결을 필요로 합니다. 이에 따라 레지스트리 서비스에 다음과 같은 네트워크 제한이 추가됩니다:
- 로컬 네트워크
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 및 메모리 트리거는 자동으로 추가됩니다. 설정된 CPU 및 메모리 임계값에 기초하여 CPU 및 메모리 트리거가 추가됩니다:
-
triggers
이 설정되지 않은 경우 - 해당하는
request.cpu.request
또는request.memory.request
설정도 0이 아닌 값으로 설정되어 있는 경우
트리거가 설정되지 않은 경우, ScaledObject
는 생성되지 않습니다.
이 설정에 대한 자세한 내용은 KEDA documentation를 참조하세요.
이름 | 유형 | 기본값 | 설명 |
---|---|---|---|
enabled
| 부울 | false
| 일반적인 HorizontalPodAutoscalers 대신 KEDA ScaledObjects 를 사용합니다.
|
pollingInterval
| 정수 | 30
| 각 트리거를 확인하는 간격 |
cooldownPeriod
| 정수 | 300
| 마지막 트리거가 활성 상태를 보고한 후 리소스를 0으로 조절하는데 대기할 기간 |
minReplicaCount
| 정수 | KEDA가 리소스의 최소 레플리카 수를 축소하는 데 사용합니다. 기본값은 hpa.minReplicas 입니다.
| |
maxReplicaCount
| 정수 | KEDA가 리소스의 최대 레플리카 수를 확대하는 데 사용합니다. 기본값은 hpa.maxReplicas 입니다.
| |
fallback
| 맵 | KEDA 후행 구성, 자세한 내용은 documentation를 참조하세요. | |
hpaName
| 문자열 | KEDA가 생성할 HPA 리소스의 이름으로 기본값은 keda-hpa-{scaled-object-name} 입니다.
| |
restoreToOriginalReplicaCount
| 부울 | “ScaledObject”가 삭제된 후 대상 리소스를 원래 레플리카 수로 축소해야 하는지 여부를 지정합니다. | |
behavior
| 맵 | 업 및 다운 스케일링 동작에 대한 사양으로 기본값은 hpa.behavior 입니다.
| |
triggers
| 배열 | 대상 리소스의 스케일링을 활성화하기 위한 트리거 목록으로 기본값은 hpa.cpu 와 hpa.memory 에서 계산된 트리거 목록입니다.
|
모든 내부 엔드포인트 연결 방지 정책 예시
레지스트리 서비스는 일반적으로 오브젝트 스토리지로의 이그레스 연결, 도커 클라이언트로부터의 인그레스 연결, 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
# 다음 규칙은 로컬을 제외한 모든 외부 엔드포인트로의 트래픽을 허용합니다
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
두 항목을 담고 있는 맵입니다.
이 링크는 레지스트리의 http.secret
값과 관련이 있습니다. 이 값은 암호화된 무작위 문자열로 채워져야 합니다.
shared-secrets
작업은 수동으로 제공되지 않을 경우 이 secret을 자동으로 생성합니다. 이 secret은 보안적으로 생성된 128자 알파벳 숫자 문자열을 base64로 인코딩합니다.
이 secret을 수동으로 생성하려면:
kubectl create secret generic gitlab-registry-httpsecret --from-literal=secret=strongrandomstring
Notification Secret
Notification Secret은 기존의 GitLab 애플리케이션으로 다양한 방식으로 되돌아가는 데 사용되며, 예를 들어 Geo에서 주(primary) 사이트와 보조(secondary) 사이트 간 컨테이너 레지스트리 데이터 동기화를 관리하는 데 도움이 됩니다.
notificationSecret
secret 객체는 shared-secrets
기능이 활성화된 경우 자동으로 생성됩니다.
이 secret을 수동으로 생성하려면:
kubectl create secret generic gitlab-registry-notification --from-literal=secret=[\"strongrandomstring\"]
그런 다음 다음을 설정하십시오
global:
# 사용자 지정 secret을 제공하려면
registry:
notificationSecret:
secret: gitlab-registry-notification
key: secret
# Geo를 사용하고 기본 저장소를 동기화하려는 경우
# 이것을 기본 사이트 설정에 정의합니다.
geo:
registry:
replication:
enabled: true
primaryApiUrl: <주(primary) 레지스트리로의 URL>
secret
값이 위에 생성된 secret 이름으로 설정되었는지 확인하십시오
Redis 캐시 Secret
Redis 캐시 Secret은 global.redis.auth.enabled
가 true
로 설정된 경우 사용됩니다.
shared-secrets
기능이 활성화된 경우, 이 gitlab-redis-secret
secret 객체는 수동으로 제공되지 않을 경우 자동으로 생성됩니다.
이 secret을 수동으로 생성하려면 Redis 패스워드 설명서를 참조하십시오.
authEndpoint
authEndpoint
필드는 레지스트리가 인증을 위해 GitLab 인스턴스들에 요청하는 URL을 제공하는 문자열입니다.
이 값은 프로토콜과 호스트명만 포함해야 합니다. 차트 템플릿은 필요한 요청 경로를 자동으로 추가합니다. 결과적인 값은 컨테이너 내부의 auth.token.realm
에 채워집니다. 예를 들어: authEndpoint: "https://gitlab.example.com"
기본적으로 이 필드는 Global Settings에서 설정된 GitLab 호스트명 구성과 일치합니다.
certificate
certificate
필드는 secret
와 key
두 항목을 담고 있는 맵입니다.
secret
은 해당하는 Kubernetes Secret의 이름을 담고 있는 문자열이며, 이 Secret은 GitLab 인스턴스에 의해 생성된 토큰을 확인하는 데 사용될 인증서 번들을 포함합니다.
key
는 Secret
내의 인증서 번들이 레지스트리 컨테이너에 auth.token.rootcertbundle
로 제공될 이름입니다.
기본 예시:
certificate:
secret: gitlab-registry
key: registry-auth.crt
readiness 및 liveness probe
기본적으로 /debug/health
경로와 5001 포트에서 디버그를 확인하는 readiness 및 livenes probe가 구성됩니다.
validation
validation
필드는 레지스트리에서 도커 이미지 유효성 검사 과정을 제어하는 맵입니다. 이미지 유효성 검사가 활성화되면 레지스트리는 외부 레이어를 포함한 Windows 이미지를 거부합니다. 유효성 검사는 manifest push 중에만 발생하므로 레지스트리에 이미 존재하는 이미지는 이 항목의 값이 변경되더라도 영향을 받지 않습니다.
이미지 유효성 검사는 기본적으로 비활성화되어 있습니다.
이미지 유효성 검사를 사용하려면 명시적으로 registry.validation.disabled: false
를 설정해야 합니다.
manifests
manifests
필드는 manifest에 관련된 유효성 정책을 특정할 수 있도록 합니다.
urls
섹션은 유효성을 확인할 manifest 레이어들을 포함합니다.
urls.allow
및 urls.deny
필드는 유효성을 검사할 레이어의 URL을 활성화하고, 거부할 정규 표현식 목록입니다. 여기에 정의되지 않은 레이어는 거부됩니다.
이름 | 유형 | 기본값 | 설명 |
---|---|---|---|
referencelimit
| Int | 0
| 단일 manifest가 가질 수 있는 참조(예: 레이어, 이미지 구성 등)의 최대 수. 0 (기본값)으로 설정하면 이 유효성 검사가 비활성화됩니다.
|
payloadsizelimit
| Int | 0
| manifest 페이로드의 최대 데이터 크기(바이트). 0 (기본값)으로 설정하면 이 유효성 검사가 비활성화됩니다.
|
urls.allow
| Array | []
| manifest 레이어의 URL을 활성화하는 정규 표현식 목록. 비워 두면(기본값) 모든 URL이 포함된 레이어가 거부됩니다. |
urls.deny
| Array | []
| manifest 레이어의 URL을 제한하는 정규 표현식 목록. 비워 두면(기본값) urls.allow 목록을 통과한 URL이 포함된 레이어가 거부되지 않습니다.
|
통지
notifications
필드는 Registry notifications를 구성하는 데 사용됩니다. 기본값으로 빈 해시가 있습니다.
이름 | 유형 | 기본값 | 설명 |
---|---|---|---|
endpoints
| 배열 | []
| 각 항목이 endpoint에 해당하는 항목 목록 |
events
| 해시 | {}
| 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
필드는 쿠버네티스 시크릿 및 해당 키에 대한 참조입니다. 이 비밀의 내용은 Registry Configuration: storage
에서 직접 가져옵니다. 자세한 내용은 해당 설명서를 참조하십시오.
AWS s3 및 Google GCS 드라이버에 대한 예제는 examples/objectstorage
에서 찾을 수 있습니다:
S3를 사용하는 경우 저장소 저장을 위한 올바른 권한을 부여해야 합니다. 저장 구성에 대한 자세한 내용은 관리 문서의 컨테이너 레지스트리 저장소 드라이버를 참조하십시오.
시크릿의 _내용_을 시크릿에 넣고 다음을 storage
맵의 아이템으로 제공하십시오:
-
secret
: YAML 블록을 수용하는 쿠버네티스 시크릿의 이름. -
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
저장 드라이버의 리디렉션을 해제할 수 있습니다. 이렇게 하면 모든 트래픽이 다른 백엔드로 리디렉팅되지 않고 레지스트리 서비스를 통해 흐르게 됩니다:
storage:
secret: example-secret
key: config
redirect:
disable: true
파일 시스템
드라이버를 사용하는 경우:
- 해당 데이터에 대한 지속적인 볼륨을 제공해야 합니다.
-
hpa.minReplicas
를1
로 설정해야 합니다. -
hpa.maxReplicas
를1
로 설정해야 합니다.
신뢰성 및 간소화를 위해 s3
, gcs
, azure
또는 기타 호환되는 Object Storage와 같은 외부 서비스를 활용하는 것이 좋습니다.
참고:
이 차트는 사용자가 명시하지 않은 경우 기본적으로 delete.enabled: true
을 이 구성으로 채웁니다. 이를 통해 MinIO의 기본 사용 및 Linux 패키지의 예상된 동작을 유지할 수 있습니다. 모든 사용자 제공 값은 이 기본값을 덮어씁니다.
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
쿠버네티스 시크릿의 내용입니다:
kubectl create secret generic cloudfront-secret-name --type=kubernetes.io/ssh-auth --from-file=private-key-ABC.pem=pk-ABCEDFGHIJKLMNOPQRST.pem
상기에서 사용한 privatekey
는 차트에 의해 프라이빗 키 시크릿의 내용이 자동으로 채워지며 명시된 경우 무시될 것입니다.
keypairid
변수
여러 벤더들은 동일한 구성을 위해 다른 필드 이름을 사용합니다:
벤더 | 필드 이름 |
---|---|
Google CDN | keyname
|
CloudFront | keypairid
|
참고:
현재 middleware.storage
섹션의 구성만 지원됩니다.
디버그
디버그 포트는 기본적으로 활성화되며 라이브/준비 상태를 확인하는 데 사용됩니다. 또한 프로메테우스 메트릭을 metrics
값을 통해 활성화할 수 있습니다.
debug:
addr:
port: 5001
metrics:
enabled: true
헬스
health
속성은 선택 사항이며, 주기적인 헬스 체크를 위한 우선순위를 포함합니다. 자세한 내용은 Docker의 [구성 문서]를 참조하세요(https://distribution.github.io/distribution/about/configuration/#health).
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
데이터베이스
- GitLab 16.4에 도입된 베타 기능입니다.
- GitLab 17.3에서 일반적으로 사용 가능해집니다.
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
Sentinel
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
Sentinel 비밀번호 지원
- GitLab 17.2에서 도입된 기능입니다.
redis.cache
는 또한 Redis Sentinel의 인증 비밀번호를 사용하기 위해global.redis.sentinelAuth
구성을 사용할 수 있습니다. 로컬 값은 전역 값보다 우선시됩니다. 예시:
redis:
cache:
enabled: true
host: redis.example.com
sentinels:
- host: sentinel1.example.com
port: 16379
- host: sentinel2.example.com
port: 16379
sentinelpassword:
enabled: true
secret: registry-redis-sentinel
key: password
Redis rate-limiter
경고: Redis rate-limiting은 개발 중입니다. 추가 기능 세부 정보가 이용 가능해지는 대로 이 섹션에 추가될 것입니다.
redis.rateLimiting
속성은 선택 사항이며 Redis rate-limiter에 관련된 옵션을 제공합니다.
예시:
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
Garbage Collection
Docker 레지스트리는 시간이 지남에 따라 쓸데없는 데이터가 축적될 수 있으며 이는 garbage collection을 사용하여 해제할 수 있습니다. 현재로서는 이 차트를 사용하여 가비지 수집을 완전히 자동화하거나 예약된 방식으로 실행할 수 있는 방법이 없습니다.
경고: 메타데이터 데이터베이스를 사용하여 온라인 가비지 수집을 해야 합니다. 메타데이터 데이터베이스에 대해 수동 가비지 수집을 사용하면 데이터 손실이 발생합니다. 온라인 가비지 수집은 수동 가비지 수집을 완전히 대체합니다.
수동 가비지 수집
수동 가비지 수집을 위해서는 레지스트리가 먼저 읽기 전용 모드여야 합니다. Helm을 사용하여 GitLab 차트를 이미 설치하고 mygitlab
이라는 이름을 지정하고 gitlabns
네임스페이스에 설치했다고 가정해 봅시다. 아래의 명령어에서 실제 구성에 따라 이 값들을 대체하세요.
# https://github.com/helm/helm/issues/2948로 인해 --reuse-values에 의존할 수 없으므로 현재 구성을 가져옵시다.
helm get values mygitlab > mygitlab.yml
# Helm 설치를 업그레이드하고 레지스트리를 읽기 전용으로 구성합니다.
# --wait 매개변수는 모든 리소스가 준비 상태로 될 때까지 기다리도록 하므로 계속 진행해도 안전합니다.
helm upgrade mygitlab gitlab/gitlab -f mygitlab.yml --set registry.maintenance.readonly.enabled=true --wait
# 이제 우리의 레지스트리는 읽기 전용 모드입니다. 그래서 레지스트리 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은 이 기능을 toolbox pod에서 제공하는 방법을 논의하기 위해 열려 있습니다.
관리 명령 실행:
-
레지스트리 pod에 연결합니다.
kubectl exec -it <registry-pod> -- bash
-
레지스트리 pod 내부로 진입하면
registry
이진 파일을PATH
에 사용할 수 있으며 직접 사용할 수 있습니다. 구성 파일은/etc/docker/registry/config.yml
에서 사용할 수 있습니다. 다음 예제는 데이터베이스 마이그레이션 상태를 확인합니다.registry database migrate status /etc/docker/registry/config.yml
자세한 내용 및 사용 가능한 기타 명령에 대해서는 관련 문서를 참조하세요: