Auto DevOps를 사용하여 Google Kubernetes Engine에 애플리케이션 배포하기

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

이 튜토리얼에서는 Auto DevOps를 시작하는 데 도움을 드리겠습니다. Google Kubernetes Engine (GKE)에 애플리케이션을 배포하는 예제를 통해.

GitLab 기본 Kubernetes 통합을 사용하므로 Google Cloud Platform 콘솔을 사용하여 매뉴얼으로 Kubernetes 클러스터를 만들 필요가 없습니다. GitLab 템플릿에서 생성한 애플리케이션을 만들고 배포할 예정입니다.

이 지침은 Self-Managed GitLab 인스턴스에도 적용됩니다. 러너(runners)가 구성되어 있고 Google OAuth가 활성화되어 있는지 확인하십시오.

프로젝트를 Google Kubernetes Engine에 배포하려면 다음 단계를 따르세요:

  1. Google 계정 구성
  2. Kubernetes 클러스터 생성 및 에이전트 배포
  3. GitLab 템플릿에서 새 프로젝트 생성
  4. 에이전트 구성
  5. 인그레스 설치
  6. Auto DevOps 구성
  7. Auto DevOps 활성화 및 파이프라인 실행

Google 계정 구성

GitLab 프로젝트에 Kubernetes 클러스터를 만들고 연결하기 전에 Google Cloud Platform 계정이 필요합니다. Gmail이나 Google 드라이브에 액세스하는 데 사용하는 기존 Google 계정으로 로그인하거나 새로운 계정을 만들어야 합니다.

  1. Kubernetes Engine 설명서의 “시작하기 전에” 섹션에 설명된 단계를 따라 필요한 API 및 관련 서비스를 활성화하십시오.
  2. Google Cloud Platform에 청구 계정을 만든 것을 확인하십시오.
note
모든 새로운 Google Cloud Platform (GCP) 계정은 $300의 크레딧을 받으며, Google과의 파트너십을 통해 GitLab은 Google Kubernetes Engine과의 통합을 시작하기 위해 새로운 GCP 계정에 추가 $200을 제공할 수 있습니다. 이 링크를 따라 크레딧을 신청하십시오.

Kubernetes 클러스터 생성

Google Kubernetes Engine (GKE)에서 새 클러스터를 만들려면 Infrastructure as Code (IaC) 접근 방식을 사용하여 Terraform을 사용하여 GKE 클러스터를 만들고 Kubernetes용 GitLab 에이전트를 설치하는 Google GKE 클러스터 만들기 가이드의 단계를 따르세요. 이 가이드에서는 GitLab 에이전트 구성을 위한 프로젝트가 필요합니다.

템플릿에서 애플리케이션 프로젝트 생성

GitLab 프로젝트 템플릿을 사용하여 시작하십시오. 이름에서 알 수 있듯이, 이러한 프로젝트들은 일부 잘 알려진 프레임워크로 구축된 간소화된 애플리케이션을 제공합니다.

caution
애플리케이션 프로젝트를 허용된 디렉터리에 추가하지 않고 그룹 계층 구조 기준에 따라 애플리케이션 프로젝트를 생성하면 실패합니다.
  1. 왼쪽 사이드바에서 맨 위에있는 Create new ()와 New project/repository를 선택하십시오.
  2. 템플릿에서 생성을 선택하십시오.
  3. Ruby on Rails 템플릿을 선택하십시오.
  4. 프로젝트에 이름을 지정하고 선택적으로 설명을 추가하고, GitLab Ultimate 요금제에서 사용 가능한 기능을 활용할 수 있도록 퍼블릭으로 만들기를 선택하십시오.
  5. 프로젝트 생성을 선택하십시오.

이제 GKE 클러스터에 배포할 애플리케이션 프로젝트가 준비되었습니다.

에이전트 구성

이제 애플리케이션 프로젝트를 배포하기 위해 GitLab Kubernetes 에이전트를 구성해야 합니다.

  1. 클러스터를 관리하는 프로젝트로 이동하십시오.
  2. 에이전트 구성 파일 (.gitlab/agents/<에이전트-이름>/config.yaml)로 이동하여 편집하십시오.
  3. ci_access:projects 속성 구성. 애플리케이션 프로젝트 경로를 id로 사용하십시오:

    ci_access:
      projects:
        - id: path/to/application-project
    

인그레스 설치

클러스터가 실행 중인 경우, 인터넷에서 애플리케이션으로 트래픽을 라우팅하기 위해 로드 밸런서로 NGINX Ingress Controller를 설치해야 합니다. GitLab Cluster management project template을 통해 NGINX Ingress Controller를 설치하거나 Google Cloud Shell로 매뉴얼으로 설치하십시오:

  1. 클러스터 세부 정보 페이지로 이동하여 고급 설정 탭을 선택하십시오.
  2. Google Kubernetes Engine 링크를 선택하여 Google Cloud Console에서 클러스터를 방문하십시오.
  3. GKE 클러스터 페이지에서 연결을 선택한 다음 Cloud Shell에서 실행을 선택하십시오.
  4. Cloud Shell이 시작되면 다음 명령을 실행하여 NGINX Ingress Controller를 설치하십시오:

    helm upgrade --install ingress-nginx ingress-nginx \
    --repo https://kubernetes.github.io/ingress-nginx \
    --namespace gitlab-managed-apps --create-namespace
       
    # ingress 컨트롤러가 성공적으로 설치되었는지 확인
    kubectl get service ingress-nginx-controller -n gitlab-managed-apps
    

Auto DevOps 구성

Auto DevOps에 필요한 기본 도메인 및 설정을 구성하려면 다음 절차를 따르세요.

  1. NGINX를 설치한 후 몇 분 후에 로드 밸런서가 IP 주소를 획들하게 되며, 다음 명령어로 외부 IP 주소를 가져올 수 있습니다:

    kubectl get service ingress-nginx-controller -n gitlab-managed-apps -ojson | jq -r '.status.loadBalancer.ingress[].ip'
    

    네임스페이스를 변경했다면, gitlab-managed-apps를 대체하십시오.

    이 IP 주소를 복사하여 다음 단계에서 사용하십시오.

  2. 애플리케이션 프로젝트로 돌아가십시오.
  3. 왼쪽 사이드바에서 Settings > CI/CD를 선택하고 Variables를 확장하십시오.
    • KUBE_INGRESS_BASE_DOMAIN이라는 키를 추가하고 애플리케이션 배포 도메인을 값으로 지정하십시오. 이 예제에서는 도메인 <IP 주소>.nip.io를 사용하십시오.
    • KUBE_NAMESPACE 키를 추가하고 배포 대상인 Kubernetes 네임스페이스의 값을 지정하십시오. 환경마다 다른 네임스페이스를 사용할 수 있습니다. 환경을 구성하고, 환경 스코프를 사용하십시오.
    • KUBE_CONTEXT 키를 추가하고 값으로 <path/to/agent/project>:<에이전트-이름>를 지정하십시오. 사용하려는 환경 스코프를 선택하십시오.
    • Save changes를 선택하십시오.

Auto DevOps 활성화 및 파이프라인 실행

Auto DevOps는 기본적으로 활성화되어 있지만 Auto DevOps를 비활성화할 수도 있습니다 (Self-Managed 인스턴스의 경우). Auto DevOps를 비활성화한 경우, Auto DevOps를 활성화하려면 다음 단계를 완료하십시오:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 애플리케이션 프로젝트를 찾습니다.
  2. Settings > CI/CD를 선택하십시오.
  3. Auto DevOps를 확장하십시오.
  4. 자동 배포 전략에서 [운영 환경으로 애플리케이션을 배포하는 연속 배포 전략]을 선택하십시오.
  5. Save changes를 선택하십시오.
  6. .gitlab-ci.yml 파일을 편집하여 Auto DevOps 템플릿을 포함하고 변경 사항을 master 브랜치에 커밋하십시오:

    include:
    - template: Auto-DevOps.gitlab-ci.yml
    

커밋하면 파이프라인이 트리거됩니다. 다음 섹션에서 파이프라인의 각 작업이 무엇을 하는지 설명합니다.

애플리케이션 배포

파이프라인이 실행될 때 무엇을 하고 있는 걸까요?

파이프라인의 작업을 보려면 파이프라인의 상태 배지를 선택하세요. 아이콘은 파이프라인 작업이 실행 중일 때 표시되며, 작업이 완료되면 페이지 새로고침 없이 (성공) 또는 (실패)로 업데이트됩니다.

작업은 다음과 같은 단계로 나뉩니다:

파이프라인 단계

  • 빌드 - 애플리케이션은 Docker 이미지를 빌드하고 프로젝트의 컨테이너 레지스트리(자동 빌드)에 업로드합니다.
  • 테스트 - GitLab은 애플리케이션에 여러 가지 체크를 실행하지만 test를 제외한 모든 작업은 테스트 단계에서 실패할 수 있습니다:

    • test 작업은 언어와 프레임워크를 감지하여 단위 및 통합 테스트를 실행합니다 (자동 테스트)
    • code_quality 작업은 코드 품질을 점검하며 실패하여도 됩니다 (자동 코드 품질)
    • container_scanning 작업은 Docker 컨테이너에 취약점이 있는지 확인하며 실패하여도 됩니다 (자동 컨테이너 스캐닝)
    • dependency_scanning 작업은 취약점이 있는 의존성을 확인하며 실패하여도 됩니다 (자동 의존성 스캐닝)
    • -sast로 끝나는 작업은 현재 코드에 대한 정적 분석을 실행하여 잠재적인 보안 문제를 확인하며 실패하여도 됩니다 (자동 SAST)
    • secret-detection 작업은 누설된 비밀 정보를 확인하며 실패하여도 됩니다 (자동 비밀 감지)
  • 리뷰 - 기본 브랜치의 파이프라인에는 dast_environment_deploy 작업이 포함됩니다. 자세한 내용은 동적 응용프로그램 보안 테스트(DAST)를 참조하세요.

  • 프로덕션 - 테스트 및 체크가 완료되면 애플리케이션을 Kubernetes에 배포합니다 (자동 배포).

  • 성능 - 배포된 애플리케이션에 대해 성능 테스트를 실행합니다 (자동 브라우저 성능 테스트).

  • 정리 - 기본 브랜치의 파이프라인에는 stop_dast_environment 작업이 포함됩니다.

파이프라인 실행 후에는 배포된 웹사이트를 확인하고 모니터링하는 방법을 학습해야 합니다.

프로젝트 모니터링

애플리케이션을 성공적으로 배포한 후 운영 > 환경으로 이동하여 환경 페이지에서 애플리케이션 웹사이트를 확인하고 건강 상태를 확인할 수 있습니다. 이 페이지는 배포된 응용프로그램에 대한 세부 정보를 표시하며, 오른쪽 열에는 일반적인 환경 작업에 연결하는 아이콘이 표시됩니다:

환경

  • 실시간 환경 열기 () - 프로덕션에 배포된 애플리케이션의 URL 열기
  • 모니터링 () - 프로메테우스가 Kubernetes 클러스터에 대한 데이터를 수집하고 애플리케이션이 메모리 사용, CPU 사용 및 대기 시간에 영향을 미치는 지표 페이지 열기
  • 배포 대상 ( ) - 배포할 수 있는 환경 디렉터리 표시
  • 터미널 () - 애플리케이션이 실행 중인 컨테이너 내부의 웹 터미널 세션 열기
  • 환경에 다시 배포 () - 자세한 정보는 재시도 및 롤백을 참조하세요.
  • 환경 중지 () - 자세한 정보는 환경 중지를 참조하세요.

GitLab은 환경 정보 아래에 배포 보드를 표시하며, 이 보드는 Kubernetes 클러스터의 pod을 나타내는 사각형을 상태에 따라 색으로 표시합니다. 배포 보드에서 사각형 위에 마우스를 올리면 배포 상태가 표시되며, 사각형을 선택하면 pod 로그 페이지로 이동합니다.

note
현재 애플리케이션을 호스팅하는 pod이 하나만 표시되지만, 설정 > CI/CD > 변수에서 REPLICAS CI/CD 변수를 정의하여 pod을 추가할 수 있습니다.

브랜치 작업

다음으로, 애플리케이션에 콘텐츠를 추가하기 위해 기능 브랜치를 생성하세요:

  1. 프로젝트 리포지터리에서 다음 파일로 이동: app/views/welcome/index.html.erb. 이 파일에는 <p>You're on Rails!</p>라는 단락이 포함되어 있어야 합니다.
  2. 변경 사항을 만들기 위해 GitLab 웹 IDE를 엽니다.
  3. 파일을 열어 다음 내용으로 수정하세요:

    <p>You're on Rails! Powered by GitLab Auto DevOps.</p>
    
  4. 파일을 스테이징하세요. 커밋 메시지를 추가한 다음 커밋을 선택하여 새 브랜치와 머지 요청을 생성하세요.

    웹 IDE 커밋

머지 요청을 제출하면 GitLab은 파이프라인 및 모든 작업을 이전에 설명한 대로 실행하고 추가로 기본 브랜치 이외의 브랜치에서만 실행되는 몇 가지 더 실행합니다.

몇 분 후에 테스트가 실패하면 변경으로 테스트가 ‘손상’됐다는 것을 의미합니다. 실패한 test 작업을 선택하여 더 많은 정보를 확인하세요:

실패:
WelcomeControllerTest#test_should_get_index [/app/test/controllers/welcome_controller_test.rb:7]:
<You're on Rails!>을(를) 기대했지만
<You're on Rails! Powered by GitLab Auto DevOps.>가(이) 나왔습니다...
1 이상이어야 한다고 예상했습니다.

bin/rails test test/controllers/welcome_controller_test.rb:4

손상된 테스트를 수정하려면:

  1. 머지 요청으로 돌아가세요.
  2. 오른쪽 상단에서 코드를 선택한 다음 Gitpod에서 열기를 선택하세요.
  3. 파일 디렉터리에서 test/controllers/welcome_controller_test.rb 파일을 찾아 선택하여 엽니다.
  4. 7번 라인을 You're on Rails! Powered by GitLab Auto DevOps.로 변경하세요.
  5. 커밋을 선택하세요.
  6. 왼쪽 열에서 스테이징되지 않은 변경 사항 아래에서 확인 표시 아이콘 ()을 선택하여 변경 사항을 스테이징하세요.
  7. 커밋 메시지를 작성한 다음 커밋을 선택하세요.

머지 요청 개요 페이지로 돌아가면 테스트가 통과했고 변경 사항이 리뷰 애플리케이션으로 배포된 것을 확인할 수 있습니다. 변경 사항 확인 버튼을 선택하여 변경된 내용을 확인할 수 있습니다.

머지 요청을 Merge한 후, GitLab은 기본 브랜치에서 파이프라인을 실행한 다음 애플리케이션을 프로덕션 환경에 배포합니다.

결론

이 프로젝트를 구현한 후에는 Auto DevOps의 기본 사항에 대해 확실한 이해를 갖게 될 것입니다. GitLab에서 빌드, 테스트, 배포 및 모니터링을 모두 자동으로 처리할 수 있습니다. 자동의 특성에도 불구하고, Auto DevOps는 사용자의 작업흐름에 맞게 구성 및 사용자 정의할 수 있습니다. 추가 독서를 위한 유용한 자료:

  1. Auto DevOps
  2. 다중 Kubernetes 클러스터
  3. 프로덕션으로 점진적 롤아웃
  4. CI/CD 변수를 사용하여 필요하지 않은 작업 비활성화하기](../cicd_variables.md)
  5. 애플리케이션 빌드에 사용자 정의 빌드팩 사용