튜토리얼: GitLab 워크스페이스 프록시 설정

Tier: Premium, Ultimate Offering: GitLab.com, Self-Managed, GitLab Dedicated

이 튜토리얼에서는 GitLab 워크스페이스 프록시를 설정하여 클러스터 내에서 워크스페이스를 인증하고 권한을 부여하는 방법을 배웁니다.

gitlab-workspaces-proxy를 설정하기 위해 다음을 수행합니다.

  1. TLS 인증서 생성.
  2. GitLab 인스턴스에 앱 등록(#register-an-app-on-your-gitlab-instance).
  3. SSH 호스트 키 생성(#generate-an-ssh-host-key).
  4. GitLab URL 내보내기(#export-the-gitlab-url).
  5. 구성 시크릿 생성(#create-a-configuration-secret).
  6. Kubernetes 리소스 확인(#verify-the-kubernetes-resources).
  7. DNS 레코드 업데이트(#update-your-dns-records).

전제 조건

  • 설치된 인그레스 컨트롤러
  • 실행 중인 Kubernetes 클러스터
  • 로컬 머신에 helm 3.11.0 이상 및 kubectl 필요

TLS 인증서 생성

다음에 대한 TLS 인증서를 생성해야 합니다.

  • gitlab-workspaces-proxy가 수신 대기하는 도메인(GITLAB_WORKSPACES_PROXY_DOMAIN).
  • 워크스페이스가 사용 가능한 도메인(GITLAB_WORKSPACES_WILDCARD_DOMAIN).

어떠한 인증 기관에서도 인증서를 생성할 수 있습니다.

TLS 인증서를 생성하려면 다음을 수행합니다.

  1. HTTPS를 활성화하기 위해 Certbot을 설치합니다.

    brew install certbot
    
  2. ACME DNS를 사용하여 Let’s Encrypt 인증서를 생성하고 DNS 제공업체에 TXT 레코드를 만듭니다.

    export EMAIL="YOUR_EMAIL@example.dev"
    export GITLAB_WORKSPACES_PROXY_DOMAIN="workspaces.example.dev"
    export GITLAB_WORKSPACES_WILDCARD_DOMAIN="*.workspaces.example.dev"
       
    certbot -d "${GITLAB_WORKSPACES_PROXY_DOMAIN}" \
      -m "${EMAIL}" \
      --config-dir ~/.certbot/config \
      --logs-dir ~/.certbot/logs \
      --work-dir ~/.certbot/work \
      --manual \
      --preferred-challenges dns certonly
       
    certbot -d "${GITLAB_WORKSPACES_WILDCARD_DOMAIN}" \
      -m "${EMAIL}" \
      --config-dir ~/.certbot/config \
      --logs-dir ~/.certbot/logs \
      --work-dir ~/.certbot/work \
      --manual \
      --preferred-challenges dns certonly
    
  3. 출력에서 인증서 디렉터리로 다음 환경 변수를 업데이트합니다.

     export WORKSPACES_DOMAIN_CERT="${HOME}/.certbot/config/live/${GITLAB_WORKSPACES_PROXY_DOMAIN}/fullchain.pem"
     export WORKSPACES_DOMAIN_KEY="${HOME}/.certbot/config/live/${GITLAB_WORKSPACES_PROXY_DOMAIN}/privkey.pem"
     export WILDCARD_DOMAIN_CERT="${HOME}/.certbot/config/live/${GITLAB_WORKSPACES_WILDCARD_DOMAIN}/fullchain.pem"
     export WILDCARD_DOMAIN_KEY="${HOME}/.certbot/config/live/${GITLAB_WORKSPACES_WILDCARD_DOMAIN}/privkey.pem"
    

    ‘certbot’ 명령은 와일드카드 도메인에 대해 다른 경로를 만들 수 있습니다. 이에 따라 명령을 업데이트합니다.

     export WORKSPACES_DOMAIN_CERT="${HOME}/.certbot/config/live/${GITLAB_WORKSPACES_PROXY_DOMAIN}/fullchain.pem"
     export WORKSPACES_DOMAIN_KEY="${HOME}/.certbot/config/live/${GITLAB_WORKSPACES_PROXY_DOMAIN}/privkey.pem"
     export WILDCARD_DOMAIN_CERT="${HOME}/.certbot/config/live/${GITLAB_WORKSPACES_PROXY_DOMAIN}-0001/fullchain.pem"
     export WILDCARD_DOMAIN_KEY="${HOME}/.certbot/config/live/${GITLAB_WORKSPACES_PROXY_DOMAIN}-0001/privkey.pem"
    

이제 인증서를 생성했으니 GitLab 인스턴스에 앱을 등록합니다.

GitLab 인스턴스에 앱 등록

GitLab 인스턴스에 앱을 등록하려면 다음을 수행합니다.

  1. GitLab을 OAuth 2.0 식별 공급자로 구성.
  2. 리디렉션 URI를 https://${GITLAB_WORKSPACES_PROXY_DOMAIN}/auth/callback로 설정합니다.
  3. 스코프를 api, read_user, openid, profile로 설정합니다.
  4. CLIENT_ID, CLIENT_SECRET, REDIRECT_URI를 내보냅니다.

    export CLIENT_ID="your_application_id"
    export CLIENT_SECRET="your_application_secret"
    export REDIRECT_URI="https://${GITLAB_WORKSPACES_PROXY_DOMAIN}/auth/callback"
    
  5. 클라이언트 ID 및 생성된 시크릿을 안전한 위치(예: 1Password)에 저장합니다.

다음으로 SSH 호스트 키를 생성하고 GitLab URL을 내보냅니다.

SSH 호스트 키 생성

RSA 키를 생성하려면 다음 명령을 실행합니다.

ssh-keygen -f ssh-host-key -N '' -t rsa
export SSH_HOST_KEY=$(pwd)/ssh-host-key

ECDSA 키를 생성할 수도 있습니다.

GitLab URL 내보내기

GITLAB_URL 환경 변수를 내보내려면 다음 명령을 실행합니다.

export GITLAB_URL="https://gitlab.com"

이제 프록시용 구성 시크릿을 생성합니다.

프록시용 구성 시크릿 생성

프록시용 구성 시크릿을 생성하려면 다음을 수행합니다.

  1. 서명 키를 생성하고 안전한 위치(예: 1Password)에 키를 저장합니다.
  2. SIGNING_KEY를 내보냅니다.

    export SIGNING_KEY="make_up_a_random_key_consisting_of_letters_numbers_and_special_chars"
    
  3. helm 리포지터리를 추가합니다.

    helm repo add gitlab-workspaces-proxy \
      https://gitlab.com/api/v4/projects/gitlab-org%2fremote-development%2fgitlab-workspaces-proxy/packages/helm/devel
    
  4. 다른 인그레스 클래스를 사용 중이라면 ingress.className 매개변수를 수정합니다.

    helm repo update
       
    helm upgrade --install gitlab-workspaces-proxy \
      gitlab-workspaces-proxy/gitlab-workspaces-proxy \
      --version 0.1.12 \
      --namespace=gitlab-workspaces \
      --create-namespace \
      --set="auth.client_id=${CLIENT_ID}" \
      --set="auth.client_secret=${CLIENT_SECRET}" \
      --set="auth.host=${GITLAB_URL}" \
      --set="auth.redirect_uri=${REDIRECT_URI}" \
      --set="auth.signing_key=${SIGNING_KEY}" \
      --set="ingress.host.workspaceDomain=${GITLAB_WORKSPACES_PROXY_DOMAIN}" \
      --set="ingress.host.wildcardDomain=${GITLAB_WORKSPACES_WILDCARD_DOMAIN}" \
      --set="ingress.tls.workspaceDomainCert=$(cat ${WORKSPACES_DOMAIN_CERT})" \
      --set="ingress.tls.workspaceDomainKey=$(cat ${WORKSPACES_DOMAIN_KEY})" \
      --set="ingress.tls.wildcardDomainCert=$(cat ${WILDCARD_DOMAIN_CERT})" \
      --set="ingress.tls.wildcardDomainKey=$(cat ${WILDCARD_DOMAIN_KEY})" \
      --set="ssh.host_key=$(cat ${SSH_HOST_KEY})" \
      --set="ingress.className=nginx"
    
    note
    인증서를 갱신해야 할 수 있습니다. 예를 들어, Let’s Encrypt 인증서는 기본적으로 세 달 동안 유효합니다. 새 인증서를 받으면 이전 helm 명령을 다시 실행하여 인증서를 업데이트합니다.

이제 Kubernetes 리소스를 확인합니다.

Kubernetes 리소스 확인

  1. 다음 Kubernetes 리소스를 확인합니다:

    • 구성 시크릿:

      kubectl -n gitlab-workspaces get secret gitlab-workspaces-proxy  -o=go-template='{{index .data "config.yaml"}}' | base64 -d
      
    • gitlab-workspaces 네임스페이스에 대한 인그레스 클래스:

      kubectl -n gitlab-workspaces get ingress
      

      만약 GitLab Helm 차트를 gitlab-workspaces 외의 다른 네임스페이스에 배포한다면, GitLab 에이전트 구성에서 네임스페이스를 업데이트하세요:

      remote_development:
        gitlab_workspaces_proxy:
          namespace: "<custom-gitlab-workspaces-proxy-namespace>"
      
  2. pod이 실행 중인지 확인합니다:

    kubectl -n gitlab-workspaces get pods
    

이제 DNS 레코드를 업데이트할 수 있습니다.

DNS 레코드 업데이트

DNS 레코드를 업데이트하려면 다음을 수행하세요:

  1. ${GITLAB_WORKSPACES_PROXY_DOMAIN}${GITLAB_WORKSPACES_WILDCARD_DOMAIN}을(를) 인그레스 컨트롤러에 의해 노출된 로드 밸런서로 지정합니다.
  2. 터미널에서 다음 명령을 실행하여 gitlab-workspaces-proxy에 액세스할 수 있는지 확인합니다:

    curl --verbose --location ${GITLAB_WORKSPACES_PROXY_DOMAIN}
    

    이 명령은 GitLab에서 워크스페이스를 생성할 때까지 400 Bad Request 오류를 반환합니다.

  3. 또 다른 터미널에서 다음 명령을 실행합니다:

    kubectl -n gitlab-workspaces logs -f -l app.kubernetes.io/name=gitlab-workspaces-proxy
    

    로그에 could not find upstream workspace upstream not found 오류가 표시됩니다.

모든 준비가 완료되었습니다! 이제 클러스터에서 워크스페이스를 인증하고 권한을 부여하기 위해 GitLab 워크스페이스 프록시를 사용할 수 있습니다.