- 전제 조건
- TLS 인증서 생성
- GitLab 인스턴스에 앱 등록
- SSH 호스트 키 생성
- GitLab URL 내보내기
- 프록시용 구성 시크릿 생성
- Kubernetes 리소스 확인
- DNS 레코드 업데이트
튜토리얼: GitLab 워크스페이스 프록시 설정
- GitLab 15.11에서 도입됨 관리 피처 플래그인
remote_development_feature_flag
로 비활성화됨.- GitLab 16.0에서 GitLab.com 및 Self-Managed형로 활성화됨.
- GitLab 16.7에서 일반 사용 가능함.
remote_development_feature_flag
피처 플래그 제거됨.
이 튜토리얼에서는 GitLab 워크스페이스 프록시를 설정하여 클러스터 내에서 워크스페이스를 인증하고 권한을 부여하는 방법을 배웁니다.
gitlab-workspaces-proxy
를 설정하기 위해 다음을 수행합니다.
- TLS 인증서 생성.
- GitLab 인스턴스에 앱 등록(#register-an-app-on-your-gitlab-instance).
- SSH 호스트 키 생성(#generate-an-ssh-host-key).
- GitLab URL 내보내기(#export-the-gitlab-url).
- 구성 시크릿 생성(#create-a-configuration-secret).
- Kubernetes 리소스 확인(#verify-the-kubernetes-resources).
- 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 인증서를 생성하려면 다음을 수행합니다.
-
HTTPS를 활성화하기 위해 Certbot을 설치합니다.
brew install certbot
-
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
-
출력에서 인증서 디렉터리로 다음 환경 변수를 업데이트합니다.
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 인스턴스에 앱을 등록하려면 다음을 수행합니다.
- GitLab을 OAuth 2.0 식별 공급자로 구성.
- 리디렉션 URI를
https://${GITLAB_WORKSPACES_PROXY_DOMAIN}/auth/callback
로 설정합니다. - 스코프를
api
,read_user
,openid
,profile
로 설정합니다. -
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"
- 클라이언트 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"
이제 프록시용 구성 시크릿을 생성합니다.
프록시용 구성 시크릿 생성
프록시용 구성 시크릿을 생성하려면 다음을 수행합니다.
- 서명 키를 생성하고 안전한 위치(예: 1Password)에 키를 저장합니다.
-
SIGNING_KEY
를 내보냅니다.export SIGNING_KEY="make_up_a_random_key_consisting_of_letters_numbers_and_special_chars"
-
helm
리포지터리를 추가합니다.helm repo add gitlab-workspaces-proxy \ https://gitlab.com/api/v4/projects/gitlab-org%2fremote-development%2fgitlab-workspaces-proxy/packages/helm/devel
-
다른 인그레스 클래스를 사용 중이라면
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"
인증서를 갱신해야 할 수 있습니다. 예를 들어, Let’s Encrypt 인증서는 기본적으로 세 달 동안 유효합니다. 새 인증서를 받으면 이전helm
명령을 다시 실행하여 인증서를 업데이트합니다.
이제 Kubernetes 리소스를 확인합니다.
Kubernetes 리소스 확인
-
다음 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>"
-
-
pod이 실행 중인지 확인합니다:
kubectl -n gitlab-workspaces get pods
이제 DNS 레코드를 업데이트할 수 있습니다.
DNS 레코드 업데이트
DNS 레코드를 업데이트하려면 다음을 수행하세요:
-
${GITLAB_WORKSPACES_PROXY_DOMAIN}
및${GITLAB_WORKSPACES_WILDCARD_DOMAIN}
을(를) 인그레스 컨트롤러에 의해 노출된 로드 밸런서로 지정합니다. -
터미널에서 다음 명령을 실행하여
gitlab-workspaces-proxy
에 액세스할 수 있는지 확인합니다:curl --verbose --location ${GITLAB_WORKSPACES_PROXY_DOMAIN}
이 명령은 GitLab에서 워크스페이스를 생성할 때까지
400 Bad Request
오류를 반환합니다. -
또 다른 터미널에서 다음 명령을 실행합니다:
kubectl -n gitlab-workspaces logs -f -l app.kubernetes.io/name=gitlab-workspaces-proxy
로그에
could not find upstream workspace upstream not found
오류가 표시됩니다.
모든 준비가 완료되었습니다! 이제 클러스터에서 워크스페이스를 인증하고 권한을 부여하기 위해 GitLab 워크스페이스 프록시를 사용할 수 있습니다.