런북

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

런북은 특정 프로세스를 시작하거나 중지하거나 디버깅하거나 문제 해결하는 방법을 설명하는 문서화된 절차의 모음입니다.

Jupyter NotebooksRubix 라이브러리를 사용하면 사용자가 실행 가능한 런북을 작성할 수 있습니다.

과거에 런북은 조건이나 시스템에 따라 의사 결정 트리나 자세한 단계별 안내 형식을 취했습니다.

현대적인 구현은 “실행 가능한 런북”이라는 개념을 소개했습니다. 여기에는 명확히 정의된 프로세스뿐만 아니라 운영자가 특정 환경에서 미리 작성된 코드 블록이나 데이터베이스 쿼리를 실행할 수 있는 기능이 포함됩니다.

실행 가능한 런북

GitLab 쿠버네티스 통합을 통해 제공되는 JupyterHub 앱은 이제 Nurtch의 Rubix 라이브러리가 함께 제공되어 DevOps 런북을 간단히 만들 수 있는 방법을 제공합니다. 공통 작업을 보여주는 샘플 런북이 제공됩니다. Rubix를 사용하면 일반적인 쿠버네티스 및 AWS 워크플로를 간단하게 만들 수 있지만 Rubix를 사용하지 않고 수동으로 만들 수도 있습니다.

이 비디오를 시청하여 GitLab에서 이를 어떻게 수행하는지에 대한 개요를 확인하세요!

요구 사항

실행 가능한 런북을 만들려면 다음이 필요합니다:

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

Nurtch

NurtchRubix 라이브러리 뒤에 있는 회사입니다. Rubix는 Jupyter Notebooks 내에서 공통 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):
               '''
               We set user's id, login and access token on single user image to
               enable repository integration for JupyterHub.
               See: 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_EMAIL'] = auth_state['gitlab_user']['email']
               spawner.environment['GITLAB_USER_ID'] = str(auth_state['gitlab_user']['id'])
               spawner.environment['GITLAB_USER_LOGIN'] = auth_state['gitlab_user']['username']
               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가 성공적으로 설치된 후 브라우저에서 Jupyter Hostname을 엽니다. GitLab으로 로그인 버튼을 선택하여 JupyterHub에 로그인하고 서버를 시작하세요. OAuth2로 GitLab 인스턴스의 모든 사용자에게 인증이 활성화됩니다. 이 버튼을 선택하면 GitLab에서 JupyterHub이 귀하의 GitLab 계정을 사용하도록 권한을 요청하는 페이지로 리디렉션됩니다.

    Jupyter 승인

  4. 승인하기를 선택하고 GitLab이 JupyterHub 애플리케이션으로 리디렉션합니다.
  5. 몇 초 후 내 서버 시작을 선택하여 서버를 시작하세요.
  6. 런북의 액세스를 구성하려면 귀하의 GitLab 액세스 토큰 및 프로젝트 ID를 설정 섹션에 입력해야 합니다.

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

      데모 런북

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

      샘플 런북

      Jupyter는 오른쪽에 런북 내용을 표시합니다. 설정 섹션에는 귀하의 PRIVATE_TOKENPROJECT_ID가 표시됩니다. 이 값을 ‘ ‘로 유지하면서 입력하세요.

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

      VARIABLE_VALUE = project.variables.get('PRIVATE_TOKEN').value
      
  7. 런북의 작동을 구성하려면 변수를 만들고 구성하세요. 이 예에서는 샘플 런북의 노트북에서 SQL 쿼리 실행 섹션을 사용하여 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 변수

    2. 변수 저장을 선택합니다.

    3. Jupyter에서 노트북에서 SQL 쿼리 실행 제목을 선택한 다음 실행을 선택합니다. 결과가 다음과 같이 내부에 표시됩니다.

      PostgreSQL 쿼리

기타 작업을 시도할 수 있습니다. 예를 들어 셸 스크립트를 실행하거나 쿠버네티스 클러스터와 상호 작용할 수 있습니다. 자세한 정보는 Nurtch 문서를 방문하세요.