작업공간 구성

세부정보:

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

작업공간을 사용하여 GitLab 프로젝트에 대한 격리된 개발 환경을 생성하고 관리할 수 있습니다.
각 작업공간에는 각각의 의존성, 라이브러리 및 도구 세트가 포함되어 있으며,
각 프로젝트의 특정 요구 사항을 충족하도록 사용자 정의할 수 있습니다.

작업공간 인프라 설정

작업공간을 생성하기 전에 인프라를 한 번만 설정해야 합니다.
작업공간에 대한 인프라를 설정하려면:

  1. GitLab 에이전트가 지원하는 Kubernetes 클러스터를 설정합니다.
    지원되는 Kubernetes 버전을 참조하십시오.
  2. Kubernetes 클러스터에 대한 자동 확장이 활성화되었는지 확인합니다.
  3. Kubernetes 클러스터에서:
    1. 기본 스토리지 클래스가 정의되어 있는지 확인하여 각 작업공간에 대해 볼륨이 동적으로 프로비저닝될 수 있도록 합니다.
    2. 선택한 Ingress 컨트롤러(예: ingress-nginx)를 설치합니다.
    3. 설치하고 구성한 GitLab 에이전트를 설치합니다.
    4. dns_zone*.<dns_zone>을 Ingress 컨트롤러에서 노출된 로드 밸런서로 지정합니다. 이 로드 밸런서는 WebSockets를 지원해야 합니다.
    5. GitLab 작업공간 프록시 설정합니다.
  4. 선택 사항. 작업공간에 대한 sudo 액세스 구성합니다.

작업공간 생성

전제 조건:

  • 작업공간 인프라를 설정해야 합니다.
  • 작업공간 및 에이전트 프로젝트에 대해 최소한의 개발자 역할이 있어야 합니다.
  • 작업공간을 생성하려는 각 프로젝트에서 devfile를 생성합니다:
    1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
    2. 프로젝트의 루트 디렉토리에 devfile이라는 이름의 파일을 생성합니다.
      예제 구성을 사용할 수 있습니다.
  • Devfile에서 사용하는 컨테이너 이미지가 임의 사용자 ID를 지원하는지 확인합니다.

작업공간을 생성하려면:

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

작업공간이 시작되는 데 몇 분이 걸릴 수 있습니다.
작업공간을 열려면 미리보기에서 작업공간을 선택합니다.
터미널에도 접근할 수 있으며 필요한 종속성을 설치할 수 있습니다.

작업 공간에 대한 sudo 액세스 구성

사전 요구 사항:

  • Devfile에서 사용하는 컨테이너 이미지가 임의 사용자 ID를 지원하는지 확인하세요.
    작업 공간에 대한 sudo 액세스는 devfile에서 사용하는 컨테이너 이미지가 사용자 ID 0으로 실행될 수 있음을 의미하지 않습니다.

개발 환경은 종종 런타임 중 의존성을 설치, 구성 및 사용하기 위해 sudo 권한이 필요합니다.

다음과 함께 작업 공간에 대한 안전한 sudo 액세스를 구성할 수 있습니다:

Sysbox 사용

Sysbox는 컨테이너 격리를 개선하고 컨테이너가 VM과 같은 워크로드를 실행할 수 있도록 하는 컨테이너 런타임입니다.

작업 공간이 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 <workspace_name>@<ssh_proxy_IP_address>
    
  4. 비밀번호로는 최소 read_api 범위를 가진 개인 액세스 토큰을 입력합니다.

gitlab-workspaces-proxy에 TCP 로드 밸런서를 통해 연결하면,
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

관련 주제

문제 해결

작업 공간을 사용할 때 다음과 같은 문제를 겪을 수 있습니다.

오류: Failed to renew lease

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 모듈을 포함한 리더 전용 모듈이 종료됩니다. 이 문제를 해결하려면 에이전트 인스턴스를 재시작하십시오.

오류: No agents available to create workspaces

프로젝트에서 작업 공간을 생성할 때 다음과 같은 오류가 발생할 수 있습니다:

No agents available to create workspaces. Please consult Workspaces documentation for troubleshooting.

이 문제를 해결하려면:

  • 작업 공간 및 에이전트 프로젝트에 대해 최소한 개발자 역할이 없으면 관리자에게 문의하십시오.
  • 프로젝트의 조상 그룹 중 허용된 에이전트가 없는 경우, 에이전트 허용합니다.
  • GitLab 에이전트에 대해 remote_development 모듈이 비활성화된 경우, enabledtrue로 설정합니다.