Praefect 차트 사용하기

Tier: Free, Premium, Ultimate Offering: Self-Managed Status: Experiment
caution
Praefect 차트는 아직 개발 중입니다. 알파 버전은 아직 제품 환경에서 사용하기에 적합하지 않습니다. 업그레이드에는 중요한 매뉴얼 개입이 필요할 수 있습니다. 자세한 내용은 Praefect GA 릴리즈 Epic을 참조하십시오.

Praefect 차트는 Helm 차트로 배포된 GitLab 설치 내에서 Gitaly 클러스터를 관리하는 데 사용됩니다.

알려진 제한 사항 및 문제점

  1. 데이터베이스는 매뉴얼으로 생성해야 합니다.
  2. 클러스터 크기는 고정됩니다: Gitaly 클러스터는 현재 오토스케일링을 지원하지 않습니다.
  3. 클러스터 내의 Praefect 인스턴스를 사용하여 클러스터 외부의 Gitaly 인스턴스를 관리하는 것은 지원되지 않습니다.

요구 사항

이 차트는 Gitaly 차트를 사용합니다. 이 차트에서 생성된 인스턴스를 구성하는 데 global.gitaly의 설정이 사용됩니다. 이러한 설정의 설명은 Gitaly 차트 문서에서 찾을 수 있습니다.

중요 사항: global.gitaly.tlsglobal.praefect.tls와 독립적입니다. 따라서 이들은 별도로 구성됩니다.

기본적으로이 차트는 3개의 Gitaly 레플리카를 생성합니다.

구성

이 차트는 기본적으로 비활성화되어 있습니다. 차트 배포의 일환으로 활성화하려면 global.praefect.enabled=true를 설정하십시오.

레플리카

배포할 기본적인 레플리카 수는 3입니다. 원하는 레플리카 수로 변경하려면 global.praefect.virtualStorages[].gitalyReplicas를 설정하십시오. 예를 들면:

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1

여러 가상 스토리지

여러 가상 스토리지를 구성할 수 있습니다(Gitaly 클러스터 문서 참조). 예를 들면:

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1
    - name: vs2
      gitalyReplicas: 5
      maxUnavailable: 2

이렇게 하면 Gitaly를 위한 두 세트의 리소스가 생성됩니다. 이는 두 개의 Gitaly StatefulSet을 포함합니다(가상 스토리지 당 하나씩).

그런 다음 관리자는 새로운 리포지터리가 저장되는 위치를 구성할 수 있습니다.

지속성

가상 스토리지별로 지속성 구성이 가능합니다.

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1
      persistence:
        enabled: true
        size: 50Gi
        accessMode: ReadWriteOnce
        storageClass: storageclass1
    - name: vs2
      gitalyReplicas: 5
      maxUnavailable: 2
      persistence:
        enabled: true
        size: 100Gi
        accessMode: ReadWriteOnce
        storageClass: storageclass2

defaultReplicationFactor

defaultReplicationFactor를 각 가상 스토리지에 구성할 수 있습니다(복제 요소 구성 문서 참조).

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 5
      maxUnavailable: 2
      defaultReplicationFactor: 3
    - name: secondary
      gitalyReplicas: 4
      maxUnavailable: 1
      defaultReplicationFactor: 2

Praefect로 마이그레이션

note
현재 그룹 레벨 위키는 API를 사용하여 이동할 수 없습니다.

독립 Gitaly 인스턴스에서 Praefect 설정으로 마이그레이션할 때 global.praefect.replaceInternalGitalyfalse로 설정할 수 있습니다. 이렇게 하면 기존의 Gitaly 인스턴스가 보존되고 새로운 Praefect에서 관리되는 Gitaly 인스턴스가 생성됩니다.

global:
  praefect:
    enabled: true
    replaceInternalGitaly: false
    virtualStorages:
    - name: virtualStorage2
      gitalyReplicas: 5
      maxUnavailable: 2
note
Praefect로 마이그레이션할 때, Praefect의 가상 스토리지 중 하나도 default로 명명할 수 없습니다. 이는 항상 default로 명명된 가상 스토리지가 있어야 하기 때문입니다. 따라서 이름이 기존 Praefect 구성에 이미 사용 중입니다.

[:::부터:::EndTabs]

마지막으로, 리포지터리 저장 경로 문서를 참조하여 새 리포지터리가 저장되는 위치를 구성하세요.

데이터베이스 생성

Praefect는 자체 데이터베이스를 사용하여 상태를 추적합니다. 이는 Praefect가 정상적으로 작동하려면 매뉴얼으로 생성해야 합니다.

note
이 지침은 번들로 제공된 PostgreSQL 서버를 사용한다고 가정합니다. 자체 서버를 사용하는 경우 연결 방법에 약간의 차이가 있을 수 있습니다.
  1. 데이터베이스 인스턴스에 로그인합니다:

    kubectl exec -it $(kubectl get pods -l app.kubernetes.io/name=postgresql -o custom-columns=NAME:.metadata.name --no-headers) -- bash
    
    PGPASSWORD=$(echo $POSTGRES_POSTGRES_PASSWORD) psql -U postgres -d template1
    
  2. 데이터베이스 사용자를 생성합니다:

    CREATE ROLE praefect WITH LOGIN;
    
  3. 데이터베이스 사용자 비밀번호를 설정합니다.

    기본적으로 shared-secrets 작업은 비밀번호를 생성합니다.

    1. 비밀번호를 가져옵니다:

      kubectl get secret RELEASE_NAME-praefect-dbsecret -o jsonpath="{.data.secret}" | base64 --decode
      
    2. psql 프롬프트에서 비밀번호를 설정합니다:

      \password praefect
      
  4. 데이터베이스를 생성합니다:

    CREATE DATABASE praefect WITH OWNER praefect;
    

TLS를 통해 Praefect 실행하기

Praefect는 클라이언트 및 Gitaly 노드와의 통신을 TLS로 지원합니다. 이는 global.praefect.tls.enabledglobal.praefect.tls.secretName 설정으로 제어됩니다. TLS를 통해 Praefect를 실행하려면 다음 단계를 따르세요:

  1. Helm 차트는 Praefect와의 TLS 통신을 위해 인증서가 제공되기를 기대합니다. 이 인증서는 모든 존재하는 Praefect 노드에 적용되어야 합니다. 따라서 각 노드의 모든 호스트 이름은 인증서의 대체 이름(SAN)으로 추가되어야 합니다. 또는 와일드카드를 사용할 수 있습니다.

    사용할 호스트 이름을 알아보려면 Toolbox Pod의 /srv/gitlab/config/gitlab.yml 파일을 확인하고 그 안에 지정된 repositories.storages 키 아래의 다양한 gitaly_address 필드를 확인하세요.

    kubectl exec -it <Toolbox Pod> -- grep gitaly_address /srv/gitlab/config/gitlab.yml
    
note
내부 Praefect Pod를 위한 사용자 지정 서명된 인증서를 생성하는 기본 스크립트는 이 리포지터리에서 찾을 수 있습니다. 사용자는 해당 스크립트를 사용하거나 참조하여 적절한 SAN 속성이 있는 인증서를 생성할 수 있습니다.
  1. 생성된 인증서를 사용하여 TLS Secret를 생성합니다.

    kubectl create secret tls <secret name> --cert=praefect.crt --key=praefect.key
    
  2. --set global.praefect.tls.enabled=true를 전달하여 Helm 차트를 다시 배포합니다.

Gitaly를 TLS로 실행할 때는 각 가상 리포지터리에 대해 시크릿 이름을 제공해야 합니다.

global:
  gitaly:
    tls:
      enabled: true
  praefect:
    enabled: true
    tls:
      enabled: true
      secretName: praefect-tls
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1
      tlsSecretName: default-tls
    - name: vs2
      gitalyReplicas: 5
      maxUnavailable: 2
      tlsSecretName: vs2-tls

설치 명령줄 옵션

아래 표는 helm install 명령에 --set 플래그를 사용하여 제공할 수 있는 모든 가능한 차트 구성을 포함하고 있습니다.

매개변수 기본값 설명
common.labels {} 이 차트에 의해 생성된 모든 객체에 적용되는 보조 라벨들.
failover.enabled true Praefect가 노드 장애 시 장애 조치를 수행해야 하는지 여부
failover.readonlyAfter false 장애 조치 후 노드가 읽기 전용 모드여야 하는지 여부
autoMigrate true 시작 시 자동으로 마이그레이션 실행
image.repository registry.gitlab.com/gitlab-org/build/cng/gitaly 사용할 기본 이미지 리포지터리. Praefect는 Gitaly 이미지의 일부로 묶여 있습니다.
podLabels {} 보조 Pod 라벨. 셀렉터에는 사용되지 않을 것입니다.
ntpHost pool.ntp.org Praefect가 현재 시간을 요청할 NTP 서버를 구성합니다.
service.name praefect 생성할 서비스의 이름
service.type ClusterIP 생성할 서비스 유형
service.internalPort 8075 Praefect pod이 수신할 내부 포트 번호
service.externalPort 8075 Praefect 서비스가 클러스터에서 노출해야 하는 포트 번호
init.resources    
init.image    
extraEnvFrom   노출할 다른 데이터 소스의 추가 환경 변수 디렉터리
logging.level   로그 레벨
logging.format json 로그 형식
logging.sentryDsn   Go 서버에서 예외 - Sentry DSN URL
logging.sentryEnvironment   로깅에 사용할 Sentry 환경
metrics.enabled true 스크래핑할 메트릭 엔드포인트가 제공되어야 하는지 여부
metrics.port 9236 메트릭 엔드포인트 포트 번호
metrics.separate_database_metrics true true인 경우 메트릭 스크래핑에는 데이터베이스 쿼리가 수행되지 않으며, false로 설정하면 성능 문제를 일으킬 수 있습니다
metrics.path /metrics 메트릭 엔드포인트 경로
metrics.serviceMonitor.enabled false 프로메테우스 오퍼레이터가 메트릭 스크래핑을 관리하도록 ServiceMonitor를 생성해야 하는지 여부, 이 설정을 활성화하면 prometheus.io 스크레이프 어노테이션을 제거합니다
metrics.serviceMonitor.additionalLabels {} ServiceMonitor에 추가할 라벨
metrics.serviceMonitor.endpointConfig {} ServiceMonitor용 추가 엔드포인트 구성
securityContext.runAsUser 1000  
securityContext.fsGroup 1000  
securityContext.fsGroupChangePolicy   볼륨의 소유권 및 권한을 변경하는 데 사용되는 정책(Kubernetes 1.23 이상 필요)
serviceLabels {} 보조 서비스 라벨
statefulset.strategy {} statefulset이 사용하는 업데이트 전략을 구성할 수 있게 합니다.