Amazon Elastic Kubernetes Service (EKS)를 사용하여 애플리케이션을 배포하는 Auto DevOps 사용

이 튜토리얼에서는 Amazon Elastic Kubernetes Service (EKS)에 애플리케이션을 배포하는 방법을 예를 통해 Auto DevOps를 시작하는 데 도움을 드립니다.

이 튜토리얼은 GitLab의 기본 Kubernetes 통합을 사용하므로 AWS 콘솔을 사용하여 매뉴얼으로 Kubernetes 클러스터를 생성할 필요가 없습니다.

Self-managed 인스턴스에서도 이 튜토리얼을 따를 수 있습니다. 러너(runner)가 구성되어 있는지 확인하세요.

EKS로 프로젝트를 배포하려면:

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

Amazon 계정 구성

GitLab 프로젝트에 Kubernetes 클러스터를 생성하고 연결하기 전에 Amazon Web Services 계정이 필요합니다. 기존의 Amazon 계정으로 로그인하거나 새로 생성하세요.

Kubernetes 클러스터 생성

Amazon EKS에서 새 클러스터를 생성하려면:

이외에도 eksctl을 사용하여 매뉴얼으로 클러스터를 생성할 수 있습니다.

템플릿에서 새 프로젝트 생성

GitLab 프로젝트 템플릿을 사용하여 시작하세요. 이름에서 알 수 있듯이, 이러한 프로젝트는 잘 알려진 프레임워크를 기반으로 한 베어본 애플리케이션을 제공합니다.

caution
에이전트를 인가하기 위해 애플리케이션 프로젝트를 클러스터 관리 프로젝트와 동일한 수준 또는 그 아래 그룹 계층에 생성하세요.
  1. 왼쪽 사이드바에서 상단에 있는 새로 만들기() 및 새 프로젝트/리포지터리를 선택하세요.
  2. 템플릿에서 생성을 선택하세요.
  3. Ruby on Rails 템플릿을 선택하세요.
  4. 프로젝트에 이름을 지정하고 선택적으로 설명을 추가한 후, GitLab Ultimate 요금제에서 제공되는 기능을 활용하기 위해 공개로 설정하세요.
  5. 프로젝트 생성을 선택하세요.

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

에이전트 구성

다음으로 GitLab Kubernetes용 에이전트를 구성하여 애플리케이션 프로젝트를 배포할 수 있도록 설정합니다.

  1. 클러스터 관리를 위해 생성한 프로젝트로 이동하세요.
  2. 에이전트 구성 파일(.gitlab/agents/eks-agent/config.yaml)로 이동하여 편집하세요.
  3. ci_access:projects 속성을 구성하세요. id로 애플리케이션 프로젝트 경로를 사용하세요.
ci_access:
  projects:
    - id: path/to/application-project

Ingress 설치

클러스터가 실행 중인 상태에서 인터넷에서 애플리케이션으로 트래픽을 라우팅하기 위해 로드 밸런서로 NGINX Ingress Controller를 설치해야 합니다. NGINX Ingress Controller를 Cluster 관리 프로젝트 템플릿 또는 명령줄을 통해 매뉴얼으로 설치할 수 있습니다.

  1. 머신에 kubectl 및 Helm이 설치되어 있는지 확인하세요.
  2. 클러스터에 액세스할 IAM 역할을 생성하세요.
  3. 클러스터에 액세스할 액세스 토큰을 생성하세요.
  4. 다음 명령어를 사용하여 클러스터에 연결하세요:

    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 all -n gitlab-managed-apps --selector app.kubernetes.io/instance=ingress-nginx
    

    다른 네임스페이스를 사용 중이라면 gitlab-managed-apps를 대체하세요.

    다음 명령어를 사용하여 클러스터의 실제 외부 IP 주소를 찾으세요:

    nslookup [External IP]
    

    [External IP]는 이전 명령으로 찾은 호스트 이름입니다.

    IP 주소는 응답의 Non-authoritative answer: 섹션에 나열될 수 있습니다.

    이 IP 주소를 다음 단계에서 사용해야 합니다.

  2. 애플리케이션 프로젝트로 돌아가세요.
  3. 왼쪽 사이드바에서 설정 > CI/CD를 선택하고 Variables를 확장하세요.
    • KUBE_INGRESS_BASE_DOMAIN 키를 추가하고 애플리케이션 배포 도메인을 값으로 설정하세요. 이 예제에서는 도메인 <IP 주소>.nip.io를 사용하세요.
    • KUBE_NAMESPACE 키를 추가하고 배포 대상인 Kubernetes 네임스페이스의 값을 설정하세요. 환경마다 다른 네임스페이스를 사용할 수 있습니다. 환경을 구성하려면 환경 스코프를 사용하세요.
    • KUBE_CONTEXT 키를 추가하고 path/to/agent/project:eks-agent와 같은 값을 설정하세요. 선택한 환경 스코프를 선택하세요.
    • 변경 사항 저장을 선택하세요.

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

Auto DevOps는 기본적으로 활성화되어 있지만, Auto DevOps는 인스턴스 수준(Self-managed 인스턴스의 경우) 및 그룹 수준에서 비활성화할 수 있습니다. 비활성화되어 있다면 Auto DevOps를 활성화하려면 다음 단계를 완료하세요:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 애플리케이션 프로젝트를 찾으세요.
  2. 설정 > CI/CD를 선택하세요.
  3. Auto DevOps를 확장하세요.
  4. 기본 Auto DevOps 파이프라인으로 설정을 선택하여 더 많은 옵션을 표시하세요.
  5. 배포 전략에서 지속적 배포 전략을 선택하여 기본 브랜치에서 파이프라인이 성공적으로 실행된 후 애플리케이션을 프로덕션 환경에 배포합니다.
  6. 변경 사항 저장을 선택하세요.
  7. .gitlab-ci.yml 파일을 편집하여 Auto DevOps 템플릿을 포함하고 변경 사항을 기본 브랜치에 커밋하세요:

    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 열기
  • 모니터링 () - Prometheus가 Kubernetes 클러스터에 대한 데이터 및 애플리케이션의 메모리 사용, CPU 사용 및 지연 시간에 미치는 영향에 대한 지표 페이지 열기
  • 배포 대상 ( ) - 배포할 수 있는 환경 디렉터리 표시
  • 터미널 () - 애플리케이션이 실행 중인 컨테이너 내에서 웹 터미널 세션 열기
  • 환경 재배포 () - 자세한 내용은 다시 시도 및 되감기를 참조하십시오
  • 환경 중지 () - 자세한 내용은 환경 중지를 참조하십시오

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

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

브랜치 작업

다음으로, 애플리케이션에 콘텐츠를 추가하기 위해 기능 브랜치를 만듭니다:

  1. 프로젝트 리포지터리에서 다음 파일로 이동합니다: app/views/welcome/index.html.erb. 이 파일은 단락만 포함해야합니다: <p>You're on Rails!</p>.
  2. 변경 사항을 적용하려면 GitLab Web IDE를 엽니다.
  3. 파일을 다음과 같이 편집합니다:

    <p>You're on Rails! Powered by GitLab Auto DevOps.</p>
    
  4. 파일을 스테이징합니다. 커밋 메시지를 추가한 다음, 커밋을 선택하여 새 브랜치 및 Merge Request를 만듭니다.

    Web IDE 커밋

Merge Request를 제출하면 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.>인데..
예상 결과는 0보다 크거나 같아야 합니다.

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

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

  1. Merge Request 페이지로 돌아갑니다.
  2. 오른쪽 상단에서 코드를 선택한 다음 Gitpod에서 열기를 선택합니다.
  3. 파일 디렉터리에서 test/controllers/welcome_controller_test.rb 파일을 찾아 선택하여 엽니다.
  4. 7번째 줄을 You're on Rails! Powered by GitLab Auto DevOps.로 변경합니다.
  5. 커밋을 선택합니다.
  6. Unstaged changes 아래의 좌측 열에서 확인 표시 아이콘 ()을 선택하여 변경 사항을 스테이징합니다.
  7. 커밋 메시지를 작성한 다음, 커밋을 선택합니다.

Merge Request의 개요 페이지로 돌아가면, 테스트가 통과되었을 뿐만 아니라 리뷰 애플리케이션으로서의 애플리케이션 배포도 확인할 수 있습니다. 변경 사항을 확인하려면 애플리케이션 보기 버튼을 선택하십시오.

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

결론

이 프로젝트를 구현한 후에는 Auto DevOps의 기본 개념을 확실하게 이해해야 합니다. 애플리케이션을 빌드하고 테스트하는 것에서 시작하여 배포하고 모니터링하는 모든 과정을 GitLab에서 수행했습니다. 자동화된 성격에도 불구하고, Auto DevOps는 워크플로우에 맞게 구성하고 사용자 정의할 수도 있습니다. 추가 독해를 위한 유용한 자료는 다음과 같습니다:

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