- 요구 사항
- 설계 선택 사항
- 구성
- 설치 명령 줄 옵션
- 차트 구성 예시
- 차트의 Community Edition 사용
- 외부 서비스
- 메트릭
- 차트 전역 기본값
- Pod별 설정
-
networkpolicy
구성 - KEDA 구성
GitLab-Sidekiq 차트 사용
sidekiq
서브 차트는 Sidekiq 워커의 구성 가능한 배포를 제공하며 여러 Deployment
간에 대기열을 분리하여 독립적인 확장성과 구성을 명확하게 제공하기 위해 명시 적으로 설계되었습니다.
이 차트에서는 기본 pods:
선언을 제공하지만, 빈 정의를 제공하는 경우 worker가 없게 됩니다.
요구 사항
이 차트는 Redis, PostgreSQL 및 Gitaly 서비스에 액세스하는 것에 의존하며, 완전한 GitLab 차트의 일부로 제공되거나 이 차트가 배포된 Kubernetes 클러스터에서 도달 가능한 외부 서비스로 제공됩니다.
설계 선택 사항
이 차트는 여러 Deployment
와 관련된 ConfigMap
을 생성합니다. 환경 변수를 사용하는 대신 컨테이너의 command
에 추가 인수를 사용하는 대신 ConfigMap
동작을 활용하는 것이 명확하다고 판단되어 결정되었으며, 이 선택은 많은 수의 ConfigMap
을 야기하지만 각 pod가 무엇을 수행해야 하는지에 대한 매우 명확한 정의를 제공합니다.
구성
sidekiq
차트는 세 가지 부분으로 구성됩니다: 차트 전반적인 외부 서비스, 차트 전반적인 기본값 차트 전반적인 기본값, 그리고 각 pod 정의.
설치 명령 줄 옵션
아래 표는 --set
플래그를 사용하여 helm install
명령에 제공할 수 있는 가능한 차트 구성을 모두 포함합니다.
매개변수 | 기본값 | 설명 |
---|---|---|
annotations
| Pod annotations | |
podLabels
| 보충 Pod labels. Selector에 사용되지 않습니다. | |
common.labels
| 이 차트에 의해 생성된 모든 객체에 적용되는 보충 레이블 등 | |
… (중략) | ||
serviceAccount.name
| ServiceAccount의 이름. 설정되지 않은 경우 전체 차트 이름이 사용됩니다. | |
priorityClassName
| ""
| Pod의 priorityClassName 을 구성하는 것을 허용, 이는 제거될 경우 Pod 우선 순위를 제어하는 데 사용됩니다.
|
차트 구성 예시
리소스
resources
를 사용하면 Sidekiq pod가 소비할 수 있는 리소스(메모리 및 CPU)의 최소 및 최대량을 구성할 수 있습니다.
Sidekiq pod의 작업 부하는 배포 사이에 크게 다릅니다. 일반적으로 각 Sidekiq 프로세스는 약 1 vCPU 및 2GB의 메모리를 사용한다는 것으로 이해됩니다. 수직 스케일링은 일반적으로이 1:2
의 vCPU:Memory
비율을 따르는 것이 좋습니다.
아래는 resources
의 예시입니다:
resources:
limits:
memory: 5G
requests:
memory: 2G
cpu: 900m
extraEnv
extraEnv
를 사용하면 종속성 컨테이너에서 추가 환경 변수를 노출시킬 수 있습니다.
아래는 extraEnv
의 예시입니다:
extraEnv:
SOME_KEY: some_value
SOME_OTHER_KEY: some_other_value
컨테이너를 시작하면 환경 변수가 노출되었는지 확인할 수 있습니다:
env | grep SOME
SOME_KEY=some_value
SOME_OTHER_KEY=some_other_value
특정 pod에 대해 extraEnv
를 설정할 수도 있습니다:
extraEnv:
SOME_KEY: some_value
SOME_OTHER_KEY: some_other_value
pods:
- name: mailers
queues: mailers
extraEnv:
SOME_POD_KEY: some_pod_value
- name: catchall
이렇게 하면 mailers
pod의 응용프로그램 컨테이너에만 SOME_POD_KEY
가 설정됩니다. Pod 수준의 extraEnv
설정은 init containers에 추가되지 않습니다.
extraEnvFrom
extraEnvFrom
을 사용하면 팟의 모든 컨테이너에서 다른 데이터 소스의 추가 환경 변수를 노출시킬 수 있습니다. Sidekiq pod마다 후속 변수를 재정의할 수 있습니다.
아래는 extraEnvFrom
의 예시입니다:
extraEnvFrom:
MY_NODE_NAME:
fieldRef:
fieldPath: spec.nodeName
MY_CPU_REQUEST:
resourceFieldRef:
containerName: test-container
resource: requests.cpu
SECRET_THING:
secretKeyRef:
name: special-secret
key: special_token
# optional: boolean
pods:
- name: immediate
extraEnvFrom:
CONFIG_STRING:
configMapKeyRef:
name: useful-config
key: some-string
# optional: boolean
extraVolumes
extraVolumes
를 사용하면 차트 전체에서 추가 볼륨을 구성할 수 있습니다.
아래는 extraVolumes
의 예시입니다:
extraVolumes: |
- name: example-volume
persistentVolumeClaim:
claimName: example-pvc
extraVolumeMounts
extraVolumeMounts
를 사용하면 차트 전체 컨테이너에 대해 추가 볼륨 마운트를 구성할 수 있습니다.
아래는 extraVolumeMounts
의 예시입니다:
extraVolumeMounts: |
- name: example-volume-mount
mountPath: /etc/example
image.pullSecrets
pullSecrets
는 팟에서 이미지를 끌어오기 위해 개인 레지스트리에 인증하는 데 사용됩니다.
개인 레지스트리 및 인증 방법에 대한 자세한 내용은 Kubernetes 문서에서 확인할 수 있습니다.
아래는 pullSecrets
의 예시입니다:
image:
repository: my.sidekiq.repository
pullPolicy: Always
pullSecrets:
- name: my-secret-name
- name: my-secondary-secret-name
serviceAccount
이 섹션은 ServiceAccount가 생성되어야 하는지, 기본 액세스 토큰이 팟에 장착되어야 하는지를 제어합니다.
이름 | 유형 | 기본값 | 설명 |
---|---|---|---|
annotations
| Map | {}
| ServiceAccount 주석. |
automountServiceAccountToken
| Boolean | false
| 기본 ServiceAccount 액세스 토큰이 팟에 장착되어야 하는지 제어합니다. 이를 활성화하지 않는 것이 좋습니다. 특정 사이드카가 제대로 작동하기 위해 이 기능이 필요한 경우를 제외하고는 권장하지 않습니다 (예: Istio). |
create
| Boolean | false
| ServiceAccount를 생성해야 하는지를 나타냅니다. |
enabled
| Boolean | false
| ServiceAccount를 사용해야 하는지를 나타냅니다. |
name
| String | ServiceAccount의 이름. 설정되지 않으면 전체 차트 이름이 사용됩니다. |
tolerations
tolerations
을 사용하면 오염된 워커 노드에서 팟을 예약할 수 있습니다.
아래는 tolerations
의 예시입니다:
tolerations:
- key: "node_label"
operator: "Equal"
value: "true"
effect: "NoSchedule"
- key: "node_label"
operator: "Equal"
value: "true"
effect: "NoExecute"
annotations
annotations
를 사용하면 Sidekiq 팟에 주석을 추가할 수 있습니다.
아래는 annotations
의 예시입니다:
annotations:
kubernetes.io/example-annotation: annotation-value
차트의 Community Edition 사용
기본적으로 Helm 차트는 GitLab의 Enterprise Edition을 사용합니다. 원하는 경우 Community Edition을 대신 사용할 수 있습니다. 두 가지 사이의 차이점에 대해 자세히 알아보세요.
Community Edition을 사용하려면 image.repository
를 registry.gitlab.com/gitlab-org/build/cng/gitlab-sidekiq-ce
로 설정하면 됩니다.
외부 서비스
이 차트는 Webservice 차트와 동일한 Redis, PostgreSQL 및 Gitaly 인스턴스에 연결해야 합니다. 외부 서비스의 값은 모든 Sidekiq 팟 간에 공유되는 ConfigMap
에 채워집니다.
Redis
redis:
host: rank-racoon-redis
port: 6379
sentinels:
- host: sentinel1.example.com
port: 26379
password:
secret: gitlab-redis
key: redis-password
이름 | 유형 | 기본값 | 설명 |
---|---|---|---|
host
| String | 사용할 데이터베이스가 있는 Redis 서버의 호스트명입니다. serviceName 으로 대체될 수 있습니다. Redis Sentinels를 사용하는 경우 host 속성은 sentinel.conf 에서 지정된 클러스터 이름으로 설정해야 합니다.
| |
password.key
| String | Redis의 password.key 속성은 비밀번호가 포함된 시크릿에서의 키 이름을 정의합니다.
| |
password.secret
| String | Redis의 password.secret 속성은 사용할 Kubernetes Secret 의 이름을 정의합니다.
| |
port
| 정수 | 6379
| Redis 서버에 연결할 포트입니다. |
serviceName
| String | redis
| Redis 데이터베이스 작동 서비스의 이름입니다. 여기에 지정되어 있고 host 가 비어있으면 차트는 서비스의 호스트명 (및 현재 .Release.Name )을 host 값의 위치에 템플릿화합니다. 이는 Redis를 GitLab 차트 전체의 일부로 사용하는 경우 편리합니다.
|
sentinels.[].host
| String | Redis HA 설정을 위해 Redis Sentinel 서버의 호스트명입니다. | |
sentinels.[].port
| Integer | 26379
| Redis Sentinel 서버에 연결할 포트입니다. |
참고:
현재 Redis Sentinel 지원은 GitLab 차트에서 별도로 배포된 Sentinels을 지원합니다. 따라서 GitLab 차트를 통한 Redis 배포는 redis.install=false
로 비활성화해야 합니다. Redis 암호를 포함하는 시크릿은 GitLab 차트를 배포하기 전에 수동으로 생성되어야 합니다.
PostgreSQL
psql:
host: rank-racoon-psql
serviceName: pgbouncer
port: 5432
database: gitlabhq_production
username: gitlab
preparedStatements: false
password:
secret: gitlab-postgres
key: psql-password
이름 | 타입 | 기본값 | 설명 |
---|---|---|---|
host
| String | 사용할 데이터베이스가 있는 PostgreSQL 서버의 호스트 이름입니다. postgresql.install=true 인 경우 (기본값) 이것을 생략할 수 있습니다.
| |
serviceName
| String | PostgreSQL 데이터베이스를 운영 중인 service 의 이름입니다. 이 값이 있고 host 가 없는 경우 차트는 host 값 대신 서비스의 호스트 이름을 템플릿으로 사용합니다.
| |
database
| String | gitlabhq_production
| PostgreSQL 서버에서 사용할 데이터베이스의 이름입니다. |
password.key
| String | PostgreSQL의 password.key 속성은 비밀번호를 포함하는 시크릿에서의 키의 이름을 정의합니다.
| |
password.secret
| String | PostgreSQL의 password.secret 속성은 가져올 Kubernetes Secret 의 이름을 정의합니다.
| |
port
| Integer | 5432
| PostgreSQL 서버에 연결할 포트입니다. |
username
| String | gitlab
| 데이터베이스에 인증하기 위한 사용자 이름입니다. |
preparedStatements
| Boolean | false
| PostgreSQL 서버와 통신할 때 준비된 문을 사용해야 하는지 여부입니다. |
Gitaly
gitaly:
internal:
names:
- default
- default2
external:
- name: node1
hostname: node1.example.com
port: 8079
authToken:
secret: gitaly-secret
key: token
이름 | 타입 | 기본값 | 설명 |
---|---|---|---|
host
| String | 사용할 Gitaly 서버의 호스트 이름입니다. serviceName 대신 생략할 수 있습니다.
| |
serviceName
| String | gitaly
| Gitaly 서버를 운영 중인 service 의 이름입니다. 이 값이 있고 host 가 없는 경우, 차트는 host 값 대신 서비스의 호스트 이름 (및 현재 .Release.Name )를 사용합니다. 전체 GitLab 차트의 일부로 Gitaly를 사용할 때 편리합니다.
|
port
| Integer | 8075
| Gitaly 서버에 연결할 포트입니다. |
authToken.key
| String | authToken을 포함하는 시크릿에서의 키의 이름을 정의합니다. | |
authToken.secret
| String | 가져올 Kubernetes Secret 의 이름을 정의합니다.
|
메트릭
기본적으로 각 pod에 Prometheus 메트릭 익스포터가 활성화됩니다. 메트릭은 관리자 영역에서 GitLab Prometheus metrics가 활성화될 때만 사용할 수 있습니다. 메트릭 익스포터는 3807
번 포트에서 /metrics
엔드포인트를 노출합니다. 메트릭을 활성화하면 각 pod에 주석이 추가되어 Prometheus 서버가 노출된 메트릭을 검색하고 스크래핑할 수 있도록 합니다.
차트 전역 기본값
다음 값은 각 pod 기반으로 제공되지 않은 경우에 차트 전역에서 사용될 것입니다.
이름 | 타입 | 기본값 | 설명 |
---|---|---|---|
concurrency
| Integer | 25
| 동시에 처리할 작업 수입니다. |
timeout
| Integer | 4
| Sidekiq 종료 시간 제한입니다. Sidekiq가 TERM 시그널을 받은 후 자신의 프로세스를 강제로 종료하기 전에 대기하는 시간(초)입니다. |
memoryKiller.checkInterval
| Integer | 3
| 메모리 체크 간의 시간(초)입니다. |
memoryKiller.maxRss
| Integer | 2000000
| 지연 셧다운이 트리거되는 최대 RSS(KB)입니다. |
memoryKiller.graceTime
| Integer | 900
| 트리거된 셧다운 전에 대기할 시간(초)입니다. |
memoryKiller.shutdownWait
| Integer | 30
| 트리거된 셧다운 후 기존 작업이 완료되기까지 대기하는 시간(초)입니다. |
minReplicas
| Integer | 2
| 최소 Pod 복제본 수입니다. |
maxReplicas
| Integer | 10
| 최대 Pod 복제본 수입니다. |
maxUnavailable
| Integer | 1
| 사용할 수 없는 최대 Pod 수의 한계입니다. |
참고: Linux 패키지 설명서에서 Sidekiq memory killer의 자세한 문서를 확인할 수 있습니다.
Pod별 설정
pods
선언은 각 worker pod의 모든 속성을 선언할 수 있도록 합니다. 이러한 속성들은 개별 ConfigMap
s에 템플릿에 들어가게 되며 각각의 Deployment
로 템플릿화됩니다. 이 설정은 모든 큐를 모니터링하는 단일 pod를 포함하도록 기본값으로 설정됩니다. pods
섹션에 변경을 가하면 디폴트 pod 덮어쓰기를 하지 않습니다. 다른 pod 설정에 새로운 pod를 추가하지 않습니다.
| 이름 | 타입 | 기본값 | 설명 | | :— | :–: | :—– | :— |
- lines are cut due to the length. Maybe the description is not properly translated. Can you add newline and put the remaining lines correctly?
Note: The rest of the content is not translated. So include the remaining lines properly and please add newline between the remaining sentences and paragraphs as much as possible.
큐
queues
값은 처리해야하는 대기열의 쉼표로 구분된 목록을 포함하는 문자열입니다. 기본적으로 설정되어 있지 않으며, 이는 모든 대기열이 처리됨을 의미합니다.
문자열에는 공백이 포함되어서는 안 됩니다: merge,post_receive,process_commit
는 작동하지만 merge, post_receive, process_commit
은 작동하지 않습니다.
작업이 추가되지만 적어도 하나의 Pod 아이템으로 표시되지 않는 어떤 대기열도 처리되지 않습니다. 모든 대기열의 완전한 목록은 GitLab 소스의 다음 파일을 참조하십시오.
gitlab.sidekiq.pods[].queues
를 구성하는 것 외에도 global.appConfig.sidekiq.routingRules
를 구성해야 합니다. 자세한 정보는 Sidekiq 라우팅 규칙 설정을 참조하십시오.
pod
항목의 예
pods:
- name: immediate
concurrency: 10
minReplicas: 2 # 상속된 값으로 기본 설정
maxReplicas: 10 # 상속된 값으로 기본 설정
maxUnavailable: 5 # 상속된 값으로 기본 설정
queues: merge,post_receive,process_commit
extraVolumeMounts: |
- name: example-volume-mount
mountPath: /etc/example
extraVolumes: |
- name: example-volume
persistentVolumeClaim:
claimName: example-pvc
resources:
limits:
cpu: 800m
memory: 2Gi
hpa:
cpu:
targetType: Value
targetAverageValue: 350m
Sidekiq 구성의 전체 예제
다음은 별도의 Redis 인스턴스를 사용하는 가져오기 관련 작업을위한 별도의 Sidekiq Pod, 다른 모든 작업을위한 별도의 Redis 인스턴스 및 다른 Pod를 사용하는 내보내기 관련 작업을위한 Sidekiq Pod를 사용하는 Sidekiq 구성의 전체 예제입니다.
---
global:
appConfig:
sidekiq:
routingRules:
- ["feature_category=importers", "import"]
- ["feature_category=exporters", "export", "queues_shard_extra_shard"]
- ["*", "default"]
redis:
redisYmlOverride:
queues_shard_extra_shard: ...
---
gitlab:
sidekiq:
pods:
- name: import
queues: import
- name: export
queues: export
extraEnv:
SIDEKIQ_SHARD_NAME: queues_shard_extra_shard # global.redis.redisYmlOverride의 키와 일치
- name: default
networkpolicy
구성
이 섹션은 NetworkPolicy를 제어합니다. 이 구성은 선택 사항이며 Pod의 Egress 및 Ingress를 특정 엔드포인트로 제한하는 데 사용됩니다.
이름 | 유형 | 기본값 | 설명 |
---|---|---|---|
enabled
| 부울 | false
| 이 설정은 네트워크 정책을 활성화합니다 |
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 및 아래 예제를 참조 |
네트워크 정책의 예
Sidekiq 서비스는 활성화된 경우 프로메테우스 익스포터만을 위해 Ingress 연결을 필요로하며 보통 다양한 곳으로의 Egress 연결이 필요합니다. 이 예제는 다음과 같은 네트워크 정책을 추가합니다.
- TCP
10.0.0.0/8
포트 3807에 대한 네트워크의 모든 Ingress 요청이 메트릭 익스포트를 위해 허용됩니다. - UDP
10.0.0.0/8
포트 53에 대한 네트워크의 모든 Egress 요청이 DNS를 위해 허용됩니다. - TCP
10.0.0.0/8
포트 5432에 대한 네트워크의 모든 Egress 요청이 PostgreSQL를 위해 허용됩니다. - TCP
10.0.0.0/8
포트 6379에 대한 네트워크의 모든 Egress 요청이 Redis를 위해 허용됩니다. - 로컬 네트워크 (10.0.0.0/8)로의 다른 Egress 요청이 제한됩니다.
-
10.0.0.0/8
외부의 Egress 요청은 허용됩니다.
제공된 예제는 단순히 예시일 뿐 완전하지 않을 수 있음을 참고하세요.
Sidekiq 서비스는 외부 객체 저장의 이미지를 위해 공개 인터넷에 대한 외부 연결이 필요합니다
networkpolicy:
enabled: true
ingress:
enabled: true
rules:
- from:
- ipBlock:
cidr: 10.0.0.0/8
ports:
- port: 3807
egress:
enabled: true
rules:
- to:
- ipBlock:
cidr: 10.0.0.0/8
ports:
- port: 53
protocol: UDP
- to:
- ipBlock:
cidr: 10.0.0.0/8
ports:
- port: 5432
protocol: TCP
- to:
- ipBlock:
cidr: 10.0.0.0/8
ports:
- port: 6379
protocol: TCP
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 10.0.0.0/8
KEDA 구성
이 keda
섹션은 일반 HorizontalPodAutoscalers
대신 KEDA ScaledObjects
의 설치를 가능하게 합니다.
이 구성은 선택 사항이며 사용자 정의 또는 외부 메트릭에 기반한 오토스케일링이 필요할 때 사용할 수 있습니다.
대부분의 설정은 해당되는 경우 hpa
섹션에 설정된 값으로 기본값을 갖습니다.
다음 조건이 참이면, CPU 및 메모리 트리거는 자동으로 추가됩니다. 해당 조건은 triggers
가 설정되지 않았으며, request.cpu.request
또는 request.memory.request
설정도 0이 아닌 값으로 설정되어 있는 경우입니다.
트리거가 설정되지 않은 경우, ScaledObject
가 생성되지 않습니다.
이러한 설정에 대한 자세한 내용은 KEDA 문서를 참조하세요.
이름 | 유형 | 기본값 | 설명 |
---|---|---|---|
enabled
| 불리언 | false
|
HorizontalPodAutoscalers 대신 KEDA ScaledObjects 를 사용합니다.
|
pollingInterval
| 정수 | 30
| 각 트리거를 확인하는 간격 |
cooldownPeriod
| 정수 | 300
| 마지막으로 보고된 활성 트리거 후 리소스를 0으로 스케일링하는 데 대기할 기간 |
minReplicaCount
| 정수 | KEDA가 리소스를 축소하는 데 사용하는 최소 복제본 수로, minReplicas 를 기본값으로 사용합니다.
| |
maxReplicaCount
| 정수 | KEDA가 리소스를 확장하는 데 사용하는 최대 복제본 수로, maxReplicas 를 기본값으로 사용합니다.
| |
fallback
| 맵 | KEDA 후폴백 구성, 문서를 참조하십시오. | |
hpaName
| 문자열 | KEDA가 생성할 HPA 리소스의 이름으로, keda-hpa-{scaled-object-name} 을 기본값으로 사용합니다.
| |
restoreToOriginalReplicaCount
| 불리언 |
ScaledObject 가 삭제된 후 대상 리소스를 원래의 복제본 수로 다시 스케일링해야 하는지 여부를 지정합니다.
| |
behavior
| 맵 | 상하 스케일링 동작에 대한 사양으로, hpa.behavior 를 기본값으로 사용합니다.
| |
triggers
| 배열 | 대상 리소스의 스케일링을 활성화하는 트리거 목록으로, hpa.cpu 및 hpa.memory 에서 계산된 기본값을 갖습니다.
|