워크스페이스 구성

Tier: 프리미엄, 얼티메이트 Offering: GitLab.com, Self-managed, GitLab Dedicated

Workspaces를 사용하여 GitLab 프로젝트를 위해 격리된 개발 환경을 생성하고 관리할 수 있습니다.
각 워크스페이스는 해당 프로젝트의 특정한 요구 사항을 충족시키기 위해 사용자 정의할 수 있는 종속성, 라이브러리 및 도구의 고유한 모음을 포함합니다.

워크스페이스 인프라 구성

워크스페이스를 생성하기 전에, 인프라를 한 번만 설정해야 합니다.
워크스페이스 인프라를 설정하려면 다음을 수행하세요:

  1. GitLab 에이전트가 지원하는 Kubernetes 클러스터를 설정합니다. 지원되는 Kubernetes 버전을 확인하세요.
  2. Kubernetes 클러스터의 오토스케일링이 활성화되어 있는지 확인합니다.
  3. Kubernetes 클러스터에서:
    1. 각 워크스페이스에 대해 볼륨을 동적으로 할당할 수 있도록 기본 저장소 클래스가 정의되어 있는지 확인합니다.
    2. 선택한 Ingress 컨트롤러(예: ingress-nginx)를 설치합니다.
    3. GitLab 에이전트를 설치하고 구성합니다.
    4. dns_zone*.<dns_zone>을 Ingress 컨트롤러가 노출하는 로드 밸런서로 지정합니다. 이 로드 밸런서는 웹소켓을 지원해야 합니다.
    5. GitLab 워크스페이스 프록시를 설정합니다.
  4. 선택 사항. 워크스페이스의 sudo 액세스를 구성합니다.

워크스페이스 생성

필수 사항:

  • 워크스페이스 인프라를 설정해야 합니다.
  • 워크스페이스 및 에이전트 프로젝트에 적어도 개발자 역할이 있어야 합니다.
  • 워크스페이스를 생성하려는 각 프로젝트에 devfile을 생성하세요:
    1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
    2. 프로젝트의 루트 디렉터리에 devfile이라는 이름의 파일을 생성합니다. 예제 구성 중 하나를 사용할 수 있습니다.
  • devfile에서 사용하는 컨테이너 이미지가 임의의 사용자 ID를 지원하는지 확인하세요.

워크스페이스를 생성하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 편집 > 새 워크스페이스를 선택합니다.
  3. 클러스터 에이전트 드롭다운 목록에서 프로젝트가 속한 그룹이 소유한 클러스터 에이전트를 선택합니다.
  4. Git 참조 드롭다운 목록에서 GitLab이 워크스페이스를 생성하는 데 사용하는 브랜치, 태그 또는 커밋 해시를 선택합니다.
  5. Devfile 위치에는 워크스페이스를 구성하는 데 사용하는 devfile의 경로를 입력합니다. devfile이 프로젝트의 루트 디렉터리에 있지 않으면 상대 경로를 지정합니다.
  6. 워크스페이스 자동으로 종료에는 워크스페이스가 자동으로 종료되기까지의 시간(시간 단위)을 입력합니다. 이 시간 제한은 워크스페이스가 과도한 리소스를 소비하거나 무기한 실행되는 것을 방지하는 안전 장치입니다.
  7. 변수에는 워크스페이스로 주입하려는 환경 변수의 키와 값을 입력합니다. 새 변수를 추가하려면 변수 추가를 선택합니다.
  8. 워크스페이스 생성을 선택합니다.

워크스페이스가 시작하는 데 몇 분이 소요될 수 있습니다.
워크스페이스를 열려면 미리 보기에서 워크스페이스를 선택합니다.
터미널에도 액세스할 수 있으며 필요한 종속성을 설치할 수 있습니다.

워크스페이스에 대한 sudo 액세스 구성

필수 사항:

  • 사용되는 devfile의 컨테이너 이미지가 임의의 사용자 ID를 지원하는지 확인하세요. 워크스페이스용 sudo 액세스는 devfile에서 사용되는 컨테이너 이미지가 사용자 ID 0로 실행되는 것을 의미하지 않습니다.

개발 환경은 종종 실행 중에 종속성을 설치, 구성 및 사용하기 위해 sudo 권한이 필요합니다.
워크스페이스용 안전한 sudo 액세스를 다음으로 구성할 수 있습니다:

Sysbox 사용

Sysbox는 컨테이너를 개선하여 컨테이너 격리를 향상시키고 동일한 작업 부하를 수행할 수 있도록 하는 컨테이너 런타임입니다.

Sysbox를 사용하도록 워크스페이스를 구성하려면:

  1. Kubernetes 클러스터에 Sysbox 설치합니다.
  2. GitLab 에이전트에서 워크스페이스용 다음 설정을 구성합니다:

Kata Containers와 함께

Kata Containers는 가벼운 가상 머신(VM)의 표준 구현으로, 컨테이너와 유사한 느낌과 성능을 제공하지만 VM의 워크로드 격리 및 보안 이점을 제공합니다.

Kata Containers를 사용하도록 워크스페이스를 구성하려면:

  1. Kubernetes 클러스터에 Kata Containers 설치.
  2. 다음과 같이 GitLab 에이전트를 구성하십시오:

사용자 네임스페이스로

사용자 네임스페이스는 컨테이너 내에서 실행 중인 사용자를 호스트의 사용자로부터 격리합니다. Kubernetes 1.30에는 이 기능이 베타 상태입니다.

Kubernetes에서 사용자 네임스페이스 기능을 사용하도록 워크스페이스를 구성하려면:

  1. 사용자 네임스페이스로 Kubernetes 클러스터 구성.
  2. GitLab 에이전트에서 다음 설정을 구성하십시오:

SSH로 워크스페이스에 연결

필수 조건:

SSH 클라이언트로 워크스페이스에 연결하려면:

  1. gitlab-workspaces-proxy-ssh 서비스 외부 IP 주소를 가져옵니다.

    kubectl -n gitlab-workspaces get service gitlab-workspaces-proxy-ssh
    
  2. 워크스페이스의 이름을 가져옵니다.

    1. 왼쪽 사이드바에서 검색 또는 이동을 선택합니다.
    2. 귀하의 작업을 선택합니다.
    3. 워크스페이스를 선택합니다.
    4. 연결하려는 워크스페이스의 이름을 복사합니다.
  3. 다음 명령을 실행합니다.

    ssh <작업공간_이름>@<ssh_프록시_IP_주소>
    
  4. 패스워드로, 적어도 read_api 스코프가 있는 개인 액세스 토큰을 입력합니다.

TCP 로드 밸런서를 통해 gitlab-workspaces-proxy에 연결하는 경우, gitlab-workspaces-proxy는 사용자 이름(작업공간 이름)을 확인하고 다음을 확인하기 위해 GitLab과 상호 작용합니다:

  • 개인 액세스 토큰
  • 사용자의 워크스페이스 액세스

워크스페이스 컨테이너 이미지 업데이트

SSH 연결용 런타임 이미지를 업데이트하려면:

  1. 런타임 이미지에 sshd를 설치합니다.
  2. 암호 없이 컨테이너에 액세스를 허용하기 위해 gitlab-workspaces라는 사용자를 만듭니다.
FROM golang:1.20.5-bullseye

# `openssh-server` 및 기타 종속성 설치
RUN apt update \
    && apt upgrade -y \
    && apt install  openssh-server sudo curl git wget software-properties-common apt-transport-https --yes \
    && rm -rf /var/lib/apt/lists/*

# 빈 암호를 허용합니다
RUN sed -i 's/nullok_secure/nullok/' /etc/pam.d/common-auth
RUN echo "PermitEmptyPasswords yes" >> /etc/ssh/sshd_config

# 워크스페이스 호스트 키 생성
RUN ssh-keygen -A
RUN chmod 775 /etc/ssh/ssh_host_rsa_key && \
    chmod 775 /etc/ssh/ssh_host_ecdsa_key && \
    chmod 775 /etc/ssh/ssh_host_ed25519_key

# `gitlab-workspaces` 사용자 생성
RUN useradd -l -u 5001 -G sudo -md /home/gitlab-workspaces -s /bin/bash gitlab-workspaces
RUN passwd -d gitlab-workspaces
ENV HOME=/home/gitlab-workspaces
WORKDIR $HOME
RUN mkdir -p /home/gitlab-workspaces && chgrp -R 0 /home && chmod -R g=u /etc/passwd /etc/group /home

# `/etc/shadow`에 서명 액세스를 허용
RUN chmod 775 /etc/shadow

USER gitlab-workspaces

관련 주제

문제 해결

워크스페이스를 사용할 때 다음과 같은 문제가 발생할 수 있습니다.

오류: 리스 갱신에 실패했습니다

GitLab Kubernetes 에이전트의 알려진 문제로 인해 워크스페이스를 만들 수 없을 수 있습니다. 에이전트 로그에 다음과 같은 오류 메시지가 나타날 수 있습니다:

{"level":"info","time":"2023-01-01T00:00:00.000Z","msg":"failed to renew lease gitlab-agent-remote-dev-dev/agent-123XX-lock: timed out waiting for the condition\n","agent_id":XXXX}

이 문제는 에이전트 인스턴스가 리더십 리스를 갱신할 수 없는 경우에 발생하며, 이로 인해 리더 전용 모듈인 remote_development 모듈이 종료됩니다. 이 문제를 해결하려면 에이전트 인스턴스를 다시 시작하십시오.

오류: 워크스페이스를 만들 수 있는 에이전트가 없음

프로젝트에서 워크스페이스를 만들 때 다음과 같은 오류가 발생할 수 있습니다.

워크스페이스를 만들 수 있는 에이전트가 없습니다. 문제 해결을 위해 Workspaces 문서를 참조하세요.

이 문제를 해결하려면:

  • 워크스페이스 및 에이전트 프로젝트에 대해 최소한 Developer 역할이 없는 경우, 관리자에게 문의하십시오.
  • 프로젝트의 조상 그룹에서 허용된 에이전트가 없는 경우, 이러한 그룹 중 하나에 에이전트를 허용하십시오.
  • GitLab 에이전트에 대해 remote_development 모듈이 비활성화된 경우, enabledtrue로 설정하십시오.