런북

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

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

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

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

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

실행 가능한 런북

GitLab Kubernetes 통합을 통해 제공되는 JupyterHub 앱은 Nurtch의 Rubix 라이브러리를 함께 제공하여 DevOps 런북을 만드는 간단한 방법을 제공합니다. 일반 작업을 보여주는 샘플 런북이 제공되며, Rubix를 사용하지 않고 수동으로도 생성할 수 있습니다.

GitLab에서 이 작업을 수행하는 방법에 대한 개요를 보려면 이 비디오를 시청하세요!

요구 사항

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

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

Nurtch

Nurtch는 Rubix 라이브러리 뒤에 있는 회사입니다. Rubix는 Jupyter Notebook 내에서 일반적인 DevOps 작업을 수행하기 쉽게 해주는 오픈 소스 Python 라이브러리입니다. 예를 들어 Cloudwatch 메트릭 플로팅 및 ECS/Kubernetes 앱 롤링과 같은 작업은 몇 줄의 코드로 단순화됩니다. 자세한 내용은 Nurtch 문서를 참조하세요.

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

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

  1. JupyterHub를 위한 OAuth 애플리케이션 생성.
  2. Helm으로 JupyterHub를 설치할 때 다음 값을 사용하세요:

    #-----------------------------------------------------------------------------
    # gitlab 및 ingress 섹션을 사용자 정의해야 함!
    #-----------------------------------------------------------------------------
    
    gitlab:
       clientId: <Your OAuth Application ID>
       clientSecret: <Your OAuth Application Secret>
       callbackUrl: http://<Jupyter Hostname>/hub/oauth_callback,
       # 특정 프로젝트 또는 그룹의 멤버에게만 액세스 권한 제한:
       # allowedGitlabGroups: [ "my-group-1", "my-group-2" ]
       # allowedProjectIds: [ 12345, 6789 ]
    
    # OAuth 작동을 위해 ingress가 필요함
    ingress:
       enabled: true
       host: <JupyterHostname>
       # tls:
       #    - hosts:
       #       - <JupyterHostanme>
       #         secretName: jupyter-cert
       # annotations:
       #    kubernetes.io/ingress.class: "nginx"
       #    kubernetes.io/tls-acme: "true"
    
    #-----------------------------------------------------------------------------
    # 이후 더 이상의 수정이 필요하지 않음
    #-----------------------------------------------------------------------------
    
    hub:
       extraEnv:
          JUPYTER_ENABLE_LAB: 1
       extraConfig: |
          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_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
    
    auth:
       type: gitlab
       state:
          enabled: true
    
    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을 엽니다. Sign in with GitLab 버튼을 선택하여 JupyterHub에 로그인하여 서버를 시작하세요. OAuth2로 GitLab 인스턴스의 모든 사용자에 대해 인증이 활성화됩니다. 이 버튼을 클릭하면 GitLab의 페이지로 리디렉션되어 JupyterHub이 GitLab 계정을 사용할 수 있는 권한을 요청합니다.

    Jupyter에 권한 부여

  4. Authorize를 선택하고, GitLab이 여러분을 JupyterHub 애플리케이션으로 리디렉션시킵니다.
  5. 몇 초 후 Start My Server를 선택하여 서버 시작.
  6. 런북이 GitLab 프로젝트에 액세스하도록 구성하려면, GitLab Access Token 및 프로젝트 ID를 Setup 섹션에 입력해야 합니다.

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

      데모 런북

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

      샘플 런북

      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 변수

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

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

      PostgreSQL 쿼리

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