런북

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

런북은 특정 프로세스를 시작, 중지, 디버깅 또는 특정 시스템에 대한 문제 해결 방법을 설명하는 문서화된 절차들의 집합입니다.

Jupyter NotebooksRubix 라이브러리를 사용하면 사용자들은 자체 실행 가능한 런북을 작성하는 방법에 대해 시작할 수 있습니다.

과거에 런북은 조건이나 시스템에 따라 의사 결정 트리 또는 상세한 단계별 안내서 형식으로 존재했습니다.

현대적인 구현은 “실행 가능한 런북”이라는 개념을 도입했는데, 여기에는 명확히 정의된 프로세스와 함께 운영자들이 미리 작성된 코드 블록이나 주어진 환경에 대한 데이터베이스 쿼리를 실행할 수 있는 기능이 포함되어 있습니다.

실행 가능한 런북

GitLab Kubernetes 통합을 통해 제공되는 JupyterHub 앱은 이제 Nurtch의 Rubix 라이브러리를 함께 제공하여 DevOps 런북을 만들 수 있는 간단한 방법을 제공합니다. 일반적인 작업을 보여주는 샘플 런북이 제공됩니다. Rubix를 사용하면 일반적인 Kubernetes 및 AWS 워크플로우를 간단히 만들 수 있지만 Rubix 없이도 매뉴얼으로 만들 수 있습니다.

비디오를 시청하여 GitLab에서 이 작업이 어떻게 수행되는지 살펴보세요!

요구 사항

실행 가능한 런북을 작성하려면 다음이 필요합니다:

  • Kubernetes - 나머지 응용 프로그램을 배포하기 위해 Kubernetes 클러스터가 필요합니다. 시작하는 가장 간단한 방법은 GitLab 에이전트를 사용하여 클러스터를 연결하는 것입니다.
  • Ingress - 인그레스는 응용 프로그램을 위한 웹 프록시 역할을 하며 부하 분산, SSL 해제 및 이름 기반 가상 호스팅을 제공할 수 있습니다.
  • JupyterHub - JupyterHub은 팀 전체에서 노트북을 관리하는 다중 사용자 서비스입니다. Jupyter 노트북은 데이터 분석, 시각화 및 머신 러닝에 사용되는 웹 기반 대화형 프로그래밍 환경을 제공합니다.

Nurtch

Nurtch는 Rubix 라이브러리의 기업입니다. Rubix는 Jupyter 노트북 내에서 일반적인 DevOps 작업을 수행하기 쉽게 만드는 오픈 소스 Python 라이브러리입니다. Cloudwatch 메트릭을 플로팅하거나 ECS/Kubernetes 앱을 롤백하는 등의 작업들을 몇 줄의 코드로 간소화할 수 있습니다. 자세한 내용은 Nurtch 문서를 참조하세요.

GitLab에서 실행 가능한 런북 구성

위에서 설명한 컴포넌트와 미리로드된 데모 런북을 사용하여 GitLab에서 실행 가능한 런북을 구성하는 단계별 가이드를 따르세요.

  1. JupyterHub용 OAuth 애플리케이션 생성.
  2. Helm을 사용하여 JupyterHub 설치 시, 다음 값들을 사용하세요:

    #-----------------------------------------------------------------------------
    # The hub.config.GitLabOAuthenticator section must be customized!
    #-----------------------------------------------------------------------------
       
    hub:
      config:
        GitLabOAuthenticator:
          # 특정 프로젝트나 그룹의 구성원 또는 특정 사용자의 액세스 제한:
          # allowedGitlabGroups: [ "my-group-1", "my-group-2" ]
          # allowedProjectIds: [ 12345, 6789 ]
          # allowed_users: ["user-1", "user-2"]
          client_id: <Your OAuth Application ID>
          client_secret: <Your OAuth Application ID>
          enable_auth_state: true
          gitlab_url: https://gitlab.example.com
          oauth_callback_url: http://<Jupyter Hostname>/hub/oauth_callback
          scope:
            - read_user
            - read_api
            - openid
            - profile
            - email
        JupyterHub:
          authenticator_class: gitlab
       extraConfig: 
         gitlab-config: |   
            c.KubeSpawner.cmd = ['jupyter-labhub']
            c.GitLabOAuthenticator.scope = ['api read_repository write_repository']
               
            async def add_auth_env(spawner):
               '''
               JupyterHub에서 리포지터리 통합을 가능하게 하기 위해 사용자의 ID, 로그인 및 액세스 토큰을
               사용자 단일 이미지에 설정합니다.
               참조: https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47138#note_154294790
               '''
               auth_state = await spawner.user.get_auth_state()
                  
               if not auth_state:
                  spawner.log.warning("No auth state for %s", spawner.user)
                  return
                  
               spawner.environment['GITLAB_ACCESS_TOKEN'] = auth_state['access_token']
               spawner.environment['GITLAB_USER_LOGIN'] = auth_state['gitlab_user']['username']
               spawner.environment['GITLAB_USER_ID'] = str(auth_state['gitlab_user']['id'])
               spawner.environment['GITLAB_USER_EMAIL'] = auth_state['gitlab_user']['email']
               spawner.environment['GITLAB_USER_NAME'] = auth_state['gitlab_user']['name']
               
            c.KubeSpawner.pre_spawn_hook = add_auth_env
       
    singleuser:
       defaultURL: "/lab"
       image:
          name: registry.gitlab.com/gitlab-org/jupyterhub-user-image
          tag: latest
       lifecycleHooks:
          postStart:
             exec:
             command:
                - "sh"
                - "-c"
                - >
                   git clone https://gitlab.com/gitlab-org/nurtch-demo.git DevOps-Runbook-Demo || true;
                   echo "https://oauth2:${GITLAB_ACCESS_TOKEN}@${GITLAB_HOST}" > ~/.git-credentials;
                   git config --global credential.helper store;
                   git config --global user.email "${GITLAB_USER_EMAIL}";
                   git config --global user.name "${GITLAB_USER_NAME}";
                   jupyter serverextension enable --py jupyterlab_git
       
    proxy:
       service:
          type: ClusterIP
    
  3. JupyterHub를 성공적으로 설치한 후 브라우저에서 을 엽니다. **Sign in with GitLab** 버튼을 선택하여 JupyterHub에 로그인하고 서버를 시작하세요. OAuth2로 GitLab 인스턴스의 모든 사용자에 대해 인증이 가능하도록 설정되어 있습니다. 이 버튼을 선택하면 GitLab에서 JupyterHub이 GitLab 계정을 사용할 수 있도록 권한을 요청하는 페이지로 이동합니다.

    authorize Jupyter

  4. Authorize를 선택하고 GitLab에서 JupyterHub 애플리케이션으로 리디렉션됩니다.
  5. Start My Server를 선택하여 몇 초 안에 서버를 시작하세요.
  6. 런북이 GitLab 프로젝트에 대한 액세스를 구성하려면 Setup 섹션에서 GitLab 액세스 토큰 및 프로젝트 ID를 입력해야 합니다:

    1. 왼쪽 패널에서 DevOps-Runbook-Demo 폴더를 선택합니다.

      demo runbook

    2. Nurtch-DevOps-Demo.ipynb 런북을 선택합니다.

      sample runbook

      Jupyter는 오른쪽 화면에 런북 내용을 표시합니다. Setup 섹션에 PRIVATE_TOKENPROJECT_ID가 표시됩니다. 이 값을 다음과 같이 작은 따옴표로 유지하면서 입력하세요:

      PRIVATE_TOKEN = '<your_access_token>'
      PROJECT_ID = '1234567'
      
    3. 이 섹션의 마지막 줄에서 사용 중인 변수의 이름을 액세스 토큰에 대해 사용하는 변수의 이름과 일치하도록 업데이트하세요. 이 예에서는 변수 이름이 PRIVATE_TOKEN입니다.

      VARIABLE_VALUE = project.variables.get('PRIVATE_TOKEN').value
      
  7. 런북의 작동을 구성하려면 변수를 만들고 구성하세요. 이 예에서는 샘플 런북에 있는 Run SQL queries in Notebook 섹션을 사용하여 PostgreSQL 데이터베이스에 쿼리를 실행하는 작업을 합니다. 아래 코드 블록의 첫 네 줄은 이 쿼리가 작동하려면 필요한 변수들을 정의합니다:

    %env DB_USER={project.variables.get('DB_USER').value}
    %env DB_PASSWORD={project.variables.get('DB_PASSWORD').value}
    %env DB_ENDPOINT={project.variables.get('DB_ENDPOINT').value}
    %env DB_NAME={project.variables.get('DB_NAME').value}
    
    1. 프로젝트의 Settings > CI/CD > Variables로 이동하여 프로젝트에서 변수를 생성하세요.

      GitLab variables

    2. Save variables를 선택하세요.

    3. Jupyter에서 Run SQL queries in Notebook 제목을 선택한 다음 Run을 선택하세요. 결과는 다음과 같이 인라인으로 표시됩니다:

      PostgreSQL query

기타 작업을 시도할 수 있으며 셸 스크립트를 실행하거나 Kubernetes 클러스터와 상호 작용할 수도 있습니다. 자세한 내용은 Nurtch 문서를 참조하세요.