VSTS 및 Kubernetes Engine으로 CI/CD 파이프라인 만들기

이 가이드에서는 Visual Studio Team Services(VSTS), Google Kubernetes Engine, Container Registry를 사용하여 지속적 통합/지속적 배포(CI/CD) 파이프라인을 만드는 방법을 알아봅니다. 이 가이드에서는 ASP.NET Core를 기반으로 하는 ASP.NET MusicStore 웹 애플리케이션을 사용합니다.

CI/CD 파이프라인은 분리된 GKE 클러스터 2개(테스트용 및 프로덕션용)를 사용합니다. 파이프라인 시작 부분에서 개발자는 예제 코드베이스에 대한 변경사항을 커밋합니다. 이 작업은 파이프라인을 트리거하여 릴리스를 만들고 개발 클러스터에 배포합니다. 그러면 릴리스 관리자는 프로덕션 클러스터에 배포되도록 릴리스를 승격할 수 있습니다. 다음 다이어그램은 이 프로세스를 설명합니다.

개발자 및 최종 사용자가 애플리케이션과 상호작용하는 방법을 보여주는 CI/CD 파이프라인의 개념 다이어그램

이 가이드는 여러분이 .NET Core, VSTS, GKE에 대한 기본 지식이 있다고 전제합니다. 이 가이드를 사용하려면 VSTS 계정 및 이미 VSTS 계정에 연결되어 있는 Visual Studio 2017 설치에 대한 관리 액세스 권한이 있어야 합니다.

목표

  • Docker 이미지 게시를 위해 Container Registry를 VSTS에 연결합니다.
  • GKE에 배포할 .NET Core 샘플 애플리케이션을 준비합니다.
  • 이전 인증을 사용하지 않고도 GKE에 대해 안전하게 인증합니다.
  • VSTS 릴리스 관리를 사용하여 GKE 배포를 조정합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud Platform 구성요소를 사용합니다.

가격 계산기를 사용하면 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다. VSTS 사용에 적용될 수 있는 수수료를 알아보려면 VSTS 가격 책정 페이지를 확인하세요.

시작하기 전에

일반적으로 ID 및 액세스 관리(IAM) 역할 및 권한을 개별적으로 부여할 수 있도록 개발 및 프로덕션 작업 부하에 별도의 프로젝트를 사용하는 것이 좋습니다. 이 가이드에서는 편의상 2가지 GKE 클러스터(개발용 및 프로덕션용)에 대해 단일 프로젝트를 사용합니다.

  1. Select or create a Google Cloud Platform project.

    Go to the Manage resources page

  2. 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

  3. VSTS 계정과 관리자 액세스 권한이 있어야 합니다. 아직 VSTS 계정이 없는 경우 VSTS 홈페이지에서 가입하면 됩니다.
  4. Visual Studio 2017이 설치되어 있고 VSTS 계정에 연결되어 있는지 확인합니다.

VSTS 프로젝트 만들기

VSTS를 사용하여 소스 코드를 관리하고, 빌드 및 테스트를 실행하고, GKE로 배포를 조정합니다. 시작하려면 VSTS 계정에서 새 프로젝트를 만듭니다.

  1. VSTS 홈페이지(https://[YOUR_VSTS_ACCOUNT_NAME].visualstudio.com/_projects)로 이동합니다.
  2. New Project(새 프로젝트)(새 탐색 UI를 사용 중인 경우 Create Project(프로젝트 만들기))를 클릭합니다.
  3. Music Store와 같은 프로젝트 이름을 입력합니다.
  4. 버전 제어로 Git를 선택한 다음 Create(만들기)를 클릭합니다.
  5. 프로젝트가 생성되면 상단 메뉴에서 Code(코드)를 클릭합니다.

    저장소를 복제, 푸시, 가져오기, 초기화할 것인지 묻는 메시지가 표시됩니다.

  6. Import(가져오기)를 클릭하여 GitHub에서 MusicStore 저장소를 포크합니다. 다음 값을 설정합니다.

    • Source type(소스 유형): Git
    • Clone URL(URL 복제): https://github.com/aspnet/MusicStore.git
    • Requires authorization(승인 필요) 체크박스를 선택 해제된 상태로 유지합니다.

    'Git 저장소 가져오기' 대화상자의 스크린샷

  7. Import(가져오기)를 클릭합니다.

  8. Code(코드) > Files(파일)를 선택합니다.

    이제 MusicStore 애플리케이션의 소스 코드가 표시됩니다.

지속적으로 빌드

이제 VSTS를 사용하여 지속적 통합을 설정할 수 있습니다. Git 저장소로 푸시되는 커밋마다 VSTS는 코드를 빌드하고 빌드 아티팩트를 Docker 컨테이너로 패키징합니다. 그러면 컨테이너가 Container Registry에 게시됩니다.

테스트 브랜치 만들기

이 가이드의 안내가 제대로 작동하도록 하려면 소스 코드의 특정 버전을 기반으로 하는 코드의 브랜치를 만들어야 합니다. 이렇게 하면 이후에 GitHub에서 코드를 변경해도 이 가이드의 내용에서 벗어나지 않게 됩니다.

  1. VSTS에서 Code(코드) > Tags(태그)를 선택합니다.
  2. 태그 목록에서 rel을 확장한 다음 2.0.0을 마우스 오른쪽 버튼으로 클릭합니다.
  3. New branch(새 브랜치)를 선택합니다.
  4. 브랜치 이름으로 testing을 입력한 다음 Create branch(브랜치 만들기)를 클릭하여 선택 사항을 확인합니다.

    VSTS의 'Create a branch(브랜치 만들기)' 대화상자의 스크린샷

코드 빌드

브랜치를 만든 후에는 빌드 자동화를 시작할 수 있습니다. MusicStore는 ASP.NET Core 애플리케이션이므로 빌드는 네 단계로 이루어집니다.

  • 종속 항목 다운로드 및 설치
  • 코드 컴파일
  • 단위 테스트 실행
  • 빌드 결과 게시

이후에 GKE로 배포하기 위한 다른 단계를 추가합니다. GKE는 Linux 기반 환경이므로 Linux 기반 빌드 에이전트에서 실행되도록 전체 빌드 프로세스를 설정해야 합니다.

  1. VSTS에서 Build and Release(빌드 및 릴리스) > Builds(빌드)를 선택한 다음 New Definition(새 정의)을 클릭합니다.
  2. VSTS Git를 선택하여 수동에 대한 기본 브랜치를 설정합니다.
  3. Default branch for manual and scheduled builds(수동 및 예약된 빌드에 대한 기본 브랜치) 목록에서 testing(테스트)을 선택한 다음 Continue(계속)를 클릭합니다.
  4. ASP.NET Core 템플릿을 선택한 다음 Apply(적용)를 클릭합니다. ASP.NET 또는 ASP.NET Core(.NET Framework)가 아닌 ASP.NET Core를 선택해야 합니다.
  5. 다음 페이지에서 아래와 같은 설정을 적용합니다.

    • Name(이름): MusicStore-CI. 공백 문자가 포함되지 않은 이름을 사용할 수 있습니다.
    • Agent queue(에이전트 대기열): Hosted Linux Preview. 이 옵션은 VSTS가 Linux 기반 머신에서 빌드를 수행하도록 지시합니다.
    • Project(s) to restore and build(복원 및 빌드할 프로젝트): samples/**/*.csproj
    • Project(s) to test(테스트할 프로젝트): test/MusicStore.Test/*.csproj
  6. 왼쪽 탐색 창에서 Restore(복원)를 클릭하고 다음 설정을 구성합니다. 기타 설정은 현재 상태로 유지해도 됩니다.

    • Feeds and authentication(피드 및 인증): Feeds in my NuGet.config(내 NuGet.config의 피드) 옵션입니다.
    • Path to NuGet.config(NuGet.config 경로): NuGet.config
  7. Build(빌드)를 클릭하고 다음 설정만 구성합니다.

    • Arguments(인수): --configuration $(BuildConfiguration) --framework=$(TargetFramework)
  8. Test(테스트)를 클릭하고 다음 설정을 구성합니다.

    • Arguments(인수): --configuration $(BuildConfiguration) --framework=$(TargetFramework)
  9. Publish(게시)를 클릭하고 다음 설정을 구성합니다.

    • Arguments(인수): --configuration $(BuildConfiguration) --framework=$(TargetFramework)

    미리 채워진 --output 매개변수를 삭제해야 합니다.

    • 나중에 패키지 해제된 파일에 액세스해야 하는 단계를 추가하게 되므로 Zip Published Projects(Zip 게시 프로젝트) 체크박스를 선택 취소합니다.
    • Add project name to publish path(게시 경로에 프로젝트 이름 추가) 체크박스를 선택 취소합니다.
  10. Variables(변수) 탭을 클릭하고 다음 변수를 추가합니다.

    • Name(이름): TargetFramework
    • Value(값): netcoreapp2.0
  11. Triggers(트리거) 탭을 클릭하고 Enable continuous integration(지속적 통합 사용) 체크박스를 선택합니다.

  12. 화면 상단에서 Save & queue(저장 및 대기열)를 클릭합니다.
  13. 대화상자에서 원하는 경우 설명을 입력한 다음 Save & queue(저장 및 대기열)를 클릭하여 확인합니다.
  14. 화면 상단에 있는 링크로 이동하여(Build nnn(빌드 nnn), nnn은 빌드 번호) 빌드 진행 상황을 추적합니다. 빌드가 약 2분 내에 완료되지 않으면 Logs(로그) 탭의 빌드 출력에서 오류 메시지를 확인합니다.

Docker 이미지 게시

MusicStore 애플리케이션을 GKE에 배포하려면 애플리케이션을 Docker 컨테이너로 패키징하고 Container Registry에 게시해야 합니다. 이제 빌드 정의를 확장하여 이 단계를 자동화하겠습니다.

게시 이미지에 대한 서비스 계정 설정

Container Registry에 연결하려면 VSTS가 GCP로 인증할 수 있어야 합니다. 이를 위해 이 용도로만 사용되는 GCP의 서비스 계정을 만듭니다.

  1. GCP 콘솔의 프로젝트로 전환하고 Cloud Shell을 엽니다.

    Cloud Shell 열기

  2. 프로젝트 ID 및 Compute Engine 영역 옵션을 입력하는 시간을 절약하려면 다음 명령어를 실행하여 기본 구성 값을 설정합니다.

    gcloud config set project [PROJECT_NAME]
    gcloud config set compute/zone [ZONE]

    [PROJECT_NAME]은 GCP 프로젝트의 이름으로 바꾸고, [ZONE]은 리소스를 만드는 데 사용할 영역의 이름으로 바꿉니다. 어떤 영역을 선택해야 할지 잘 모르겠으면 us-central1-a를 사용합니다.

    예:

    gcloud config set project vsts-test-project-12345
    gcloud config set compute/zone us-central1-a

  3. 프로젝트에서 Container Registry API를 사용 설정합니다.

    gcloud services enable containerregistry.googleapis.com

  4. VSTS용 서비스 계정을 만들어 Docker 이미지를 게시합니다.

    gcloud iam service-accounts create vsts-publisher --display-name "VSTS Publisher"

  5. 저장소 관리자 IAM 역할을 서비스 계정에 할당합니다.

    PROJECT_NUMBER=$(gcloud projects describe \
        $(gcloud config get-value core/project) \
        --format=value(projectNumber))
    VSTS_PUBLISHER=$(gcloud iam service-accounts list \ --filter="displayName:VSTS Publisher" \ --format='value(email)')
    gcloud projects add-iam-policy-binding \ $(gcloud config get-value core/project) \ --member serviceAccount:$VSTS_PUBLISHER \ --role roles/storage.admin

  6. 서비스 계정 키를 생성합니다.

    gcloud iam service-accounts keys create \
        vsts-publisher.json --iam-account $VSTS_PUBLISHER
    tr -d '\n' < vsts-publisher.json > vsts-publisher-oneline.json

  7. Cloud Shell의 오른쪽 상단에 있는 버튼을 클릭하여 코드 편집기를 실행합니다.

    Cloud Shell 메뉴 바에 있는 '코드 편집기 실행' 아이콘의 스크린샷

  8. 이름이 vsts-publisher-oneline.json인 파일을 엽니다. 다음 단계 중 하나를 수행하는 데 이 파일의 내용이 필요합니다.

Container Registry에 VSTS 연결

서비스 계정을 만들었으면 이제 VSTS를 Container Registry에 연결할 수 있습니다.

  1. VSTS의 페이지 상단에 있는 메뉴에서 톱니바퀴 아이콘 위에 마우스 커서를 가져간 다음 Services(서비스)를 클릭합니다. 새 탐색 UI를 사용 중인 경우 메뉴 하단에서 Project Settings(프로젝트 설정)를 클릭한 다음 Service Endpoints(서비스 엔드포인트)를 선택합니다.
  2. New Service Endpoint(새 서비스 엔드포인트)를 클릭합니다.
  3. 목록에서 Docker Registry를 선택합니다.
  4. 대화상자에서 다음 필드의 값을 입력합니다.

    • Connection Name(연결 이름): gcr-tutorial
    • Docker Registry(Docker 레지스트리): https://gcr.io/[PROJECT-NAME], 이 경우 [PROJECT_NAME]은 GCP 프로젝트 이름입니다.

      예: https://gcr.io/vsts-test-project-12345

    • Docker ID: _json_key

    • Password(비밀번호): vsts-publisher-oneline.json의 콘텐츠
  5. OK(확인)를 클릭하여 엔드포인트를 만듭니다.

Visual Studio에서 프로젝트 체크아웃

Docker 이미지의 콘텐츠를 정의하는 Dockerfile을 만들려면 먼저 코드를 체크아웃해야 합니다.

  1. Visual Studio에서 Team Explorer(팀 탐색기)를 엽니다.
  2. 메뉴에서 Manage Connections(연결 관리) 아이콘을 클릭합니다.
  3. Manage Connections(연결 관리) > Connect to a Project(프로젝트에 연결)를 선택합니다.

    Visual Studio의 Team Explorer(팀 탐색기) 창에 있는 'Connect to a Project(프로젝트에 연결)' 옵션의 스크린샷

  4. 다음 대화상자에서 Music Store Git 저장소를 선택한 다음 Clone(복제)을 클릭합니다.

    Visual Studio의 'Connect to a Project(프로젝트에 연결)' 대화상자에서 선택한 'Music Store' Git 저장소의 스크린샷

  5. Team Explorer(팀 탐색기)를 다시 엽니다.

  6. Branches(브랜치)를 클릭한 다음 remotes/origin 폴더를 확장합니다.
  7. testing(테스트) 브랜치를 마우스 오른쪽 버튼으로 클릭하고 Checkout(체크아웃)을 클릭합니다.

Dockerfile 만들기

코드를 체크아웃했으면 Dockerfile을 구성할 수 있습니다.

  1. Visual Studio에서 Solution Explorer(솔루션 탐색기)를 엽니다.
  2. 솔루션의 루트에서 이름이 Dockerfile인 새 파일을 만듭니다.
  3. 다음 코드를 복사하여 파일에 붙여넣은 다음 파일을 저장합니다.

    FROM microsoft/aspnetcore:2.0.0
    WORKDIR /app
    COPY samples/MusicStore/bin/release/netcoreapp2.0/publish /app/
    ENTRYPOINT ["dotnet", "MusicStore.dll"]

  4. 솔루션의 루트에서 이름이 deployment.yaml인 새 파일을 만듭니다. 지금은 파일을 비워 둡니다.

  5. Team Explorer(팀 탐색기)를 열고 왼쪽 상단에 있는 Home(홈) 아이콘을 클릭하여 Home(홈) 뷰로 전환합니다.
  6. Changes(변경사항)를 클릭합니다.
  7. Add Dockerfile and placeholder for the Kubernetes manifest와 같은 커밋 메시지를 입력합니다.
  8. Commit All and Push(모두 커밋 후 푸시)를 클릭합니다.

빌드 정의를 확장하여 Docker 이미지 빌드

필요한 모든 파일을 체크인했으면 이제 VSTS로 돌아가서 빌드 정의를 확장할 수 있습니다.

  1. VSTS에서 Build and Release(빌드 및 릴리스) > Builds(빌드) > MusicStore-CI를 선택합니다.
  2. Edit(수정)을 클릭합니다.
  3. Phase 1(1단계)을 선택한 다음 + 아이콘을 클릭하여 프로세스에 또 다른 단계를 추가합니다.
  4. Command Line(명령줄) 작업을 선택하고 Add(추가)를 클릭합니다.
  5. Publish(게시) 작업 이후와 Publish Artifact(아티팩트 게시) 작업 이전에 실행되도록 새로 추가한 작업을 선택하여 끌어 놓습니다.
  6. 다음 설정을 구성합니다.

    • Version(버전): 1.*
    • Display name(표시 이름): Lock image version in deployment.yaml
    • Tool(도구): /bin/bash
    • Arguments(인수): -c "awk '{gsub(\"MUSICSTORE_IMAGE\", \"gcr.io/$(musicstore.docker.imagename):$(Build.BuildId)\", $0); print}' deployment.yaml > $(build.artifactstagingdirectory)/deployment.yaml"
  7. Phase 1(1단계)에서 + 아이콘을 클릭하여 프로세스에 또 다른 단계를 추가합니다.

  8. Docker 작업을 선택한 다음 Add(추가)를 클릭합니다.
  9. 새 작업을 선택하여 목록 끝으로 이동합니다.
  10. Docker 작업에 대해 다음 설정을 구성합니다.

    • Display name(표시 이름): Build image
    • Container Registry Type(Container Registry 유형): Container Registry
    • Docker Registry Connection(Docker 레지스트리 연결): gcr-tutorial
    • Action(작업): Build an image
    • Image name(이미지 이름): $(musicstore.docker.imagename):$(Build.BuildId)
  11. Phase 1(1단계)에서 + 아이콘을 클릭하여 프로세스에 또 다른 단계를 추가합니다.

  12. Docker 작업을 선택한 다음 Add(추가)를 클릭합니다.
  13. 새로 추가한 작업을 선택하여 목록 끝으로 이동합니다.
  14. Docker 작업에 대해 다음 설정을 구성합니다.

    • Display name(표시 이름): Publish image
    • Container Registry Type(Container Registry 유형): Container Registry
    • Docker Registry Connection(Docker 레지스트리 연결): gcr-tutorial
    • Action(작업): Push an image
    • Image name(이미지 이름): $(musicstore.docker.imagename):$(Build.BuildId)
  15. 단계 순서가 다음 스크린샷과 동일한지 확인합니다.

    VSTS의 'Phase 1(1단계)' 빌드 작업의 스크린샷

  16. Variables(변수) 탭으로 전환하고 다른 변수를 추가합니다.

    • Name(이름): musicstore.docker.imagename
    • Value(값): [PROJECT-NAME]/musicstore. [PROJECT-NAME] 자리표시자를 GCP 프로젝트 이름으로 바꿉니다.
  17. 화면 상단에서 Save & queue(저장 및 대기열)를 클릭합니다.

  18. 대화상자에서 원하는 경우 설명을 입력한 다음 Save & queue(저장 및 대기열)를 클릭하여 확인합니다.
  19. 화면 상단에 있는 링크로 이동하여 빌드 진행 상황을 추적합니다. 빌드가 완료되는 데 약 2분 정도 걸릴 수 있습니다.
  20. 이미지가 Container Registry에 게시되었는지 확인하려면 GCP 콘솔로 전환하고 Container Registry > 이미지를 선택한 다음 musicstore를 클릭합니다.
  21. 이미지 한 개가 있고 이 이미지의 태그가 VSTS에서 실행된 빌드의 숫자 ID에 해당하는지 확인합니다.

    Container Registry의 이미지 목록 스크린샷

지속적으로 배포

VSTS가 자동으로 코드를 빌드하고 커밋할 때마다 Docker 이미지를 게시하면 이제 배포 작업에 집중할 수 있습니다.

VSTS는 다른 지속적 통합 시스템과는 달리 빌드배포를 구분하며 배포와 관련된 모든 작업에 릴리스 관리라는 특수 도구 세트를 제공합니다.

VSTS 릴리스 관리는 다음과 같은 개념을 바탕으로 합니다.

  • 릴리스는 애플리케이션의 특정 버전을 구성하고 일반적으로 빌드 프로세스의 결과인 아티팩트 집합을 의미합니다.
  • 배포는 릴리스를 가져와서 특정 환경에 배포하는 프로세스를 의미합니다.
  • 배포는 일련의 작업을 수행하며 단계별로 그룹화할 수 있습니다.
  • 환경을 통해 배포할 여러 시스템 집합을 구별할 수 있습니다.
  • 파이프라인을 통해 배포를 여러 환경으로 조정할 수 있습니다.

MusicStore 빌드 프로세스가 생성하는 기본 아티팩트는 Docker 이미지입니다. 하지만 Docker 이미지가 Container Registry에 게시되므로 이미지는 VSTS 범위를 벗어납니다. 따라서 이미지는 릴리스 정의처럼 잘 작동하지 않습니다.

Kubernetes에 배포하려면 부품표와 비슷한 매니페스트도 필요합니다. 매니페스트는 Kubernetes가 만들고 관리해야 하는 리소스를 정의할 뿐 아니라 사용할 Docker 이미지의 정확한 버전도 지정합니다. Kubernetes 매니페스트는 VSTS 릴리스 관리에서 릴리스를 정의하는 아티팩트 역할을 하기에 적합합니다.

Kubernetes 배포 구성

Kubernetes에서 MusicStore를 실행하려면 다음과 같은 리소스가 필요합니다.

  • 빌드에서 생성된 Docker 이미지를 실행하는 단일 포드를 정의하는 배포
  • 포드가 부하 분산기에 액세스할 수 있도록 해 주는 NodePort 서비스
  • Cloud HTTP(S) 부하 분산기를 사용하여 공개 인터넷에 애플리케이션을 노출하는 수신

MusicStore 애플리케이션을 사용하면 SQL Server 또는 로컬에서 저장된 삽입 데이터베이스 중 하나를 사용할 수 있습니다. 편의를 위해 삽입된 데이터베이스를 사용하는 기본 구성을 사용합니다. 이 경우 두 가지 제한사항이 있습니다.

  • 한 번에 한 개의 포드 복사본만 실행할 수 있습니다. 그렇지 않으면 사용자에게 제공되는 포드에 따라 다른 데이터가 표시될 수 있습니다.
  • 영구 볼륨을 사용하도록 배포를 변경하지 않으면 포드가 다시 시작될 때마다 데이터 변경사항이 손실됩니다. (가이드에서는 이 시나리오를 다루지 않습니다.)

이러한 Kubernetes 리소스를 정의하려면 다음 단계를 수행합니다.

  1. Visual Studio에서 Solution Explorer(솔루션 탐색기)를 엽니다.
  2. deployment.yaml을 열고 다음 코드를 붙여넣은 다음 파일을 저장합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: musicstore
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
        name: http
      selector:
        app: musicstore
      type: NodePort
    
    --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: musicstore spec: backend: serviceName: musicstore servicePort: 80
    --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: musicstore spec: replicas: 1 template: metadata: labels: app: musicstore spec: containers: - name: musicstore image: MUSICSTORE_IMAGE ports: - containerPort: 80 livenessProbe: # Used by deployment controller httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 5 readinessProbe: # Used by Ingress/GCLB httpGet: path: / port: 80 initialDelaySeconds: 3 periodSeconds: 5 resources: limits: memory: 1024Mi requests: memory: 768Mi

  3. Team Explorer(팀 탐색기)를 열고 Home(홈) 뷰로 전환합니다.

  4. Changes(변경사항)를 클릭합니다.
  5. Add Kubernetes manifest와 같은 커밋 메시지를 입력합니다.
  6. Commit All and Push(모두 커밋 후 푸시)를 클릭합니다.

개발 및 프로덕션 환경 설정

VSTS 릴리스 관리로 돌아가기 전에 GKE 클러스터를 만들어야 합니다.

GKE 클러스터 만들기

  1. GCP에서 Cloud Shell 인스턴스를 엽니다.
  2. 프로젝트 ID 및 Compute Engine 영역 옵션을 입력하는 시간을 절약하려면 다음 명령어를 실행하여 기본 구성 값을 설정합니다.

    gcloud config set project [PROJECT_NAME]
    gcloud config set compute/zone [ZONE]

    예:

    gcloud config set project vsts-test-project-12345
    gcloud config set compute/zone us-central1-a

  3. 프로젝트에 GKE API를 사용하도록 설정합니다.

    gcloud services enable container.googleapis.com

  4. 다음 명령어를 사용하여 개발 클러스터를 만듭니다. 완료하는 데 몇 분 정도 걸릴 수 있습니다.

    gcloud container clusters create vsts-cicd-dev

  5. 다음 명령어를 사용하여 프로덕션 클러스터를 만듭니다. 완료하는 데 몇 분 정도 걸릴 수 있습니다.

    gcloud container clusters create vsts-cicd-prod

빌드 배포를 위한 서비스 계정 설정

GKE를 배포하려면 VSTS가 GKE에 대해 인증할 수 있어야 합니다. 이 인증을 문제없이 수행하기 위해 GCP에서 서비스 계정을 두 개 더 만듭니다. 각 계정은 환경 하나에 배포하는 데만 사용됩니다.

  1. VSTS의 서비스 계정을 만들어 Dev 빌드를 배포합니다.

    gcloud iam service-accounts create vsts-deployer-dev --display-name "VSTS Deployer for Dev"

  2. Container Developer 역할을 서비스 계정에 할당합니다.

    PROJECT_NUMBER=$(gcloud projects describe \
        $(gcloud config get-value core/project) --format=value(projectNumber))
    VSTS_DEPLOYER_DEV=$(gcloud iam service-accounts list \ --filter="displayName:VSTS Deployer for Dev" --format='value(email)')
    gcloud projects add-iam-policy-binding \ $(gcloud config get-value core/project) \ --member serviceAccount:$VSTS_DEPLOYER_DEV \ --role roles/container.developer

  3. 서비스 계정에 대한 서비스 계정 키를 생성합니다.

    gcloud iam service-accounts keys create \
        vsts-deployer-dev.json --iam-account $VSTS_DEPLOYER_DEV
    cat vsts-deployer-dev.json | base64 -w 0 > vsts-deployer-dev-oneline.json

  4. VSTS의 서비스 계정을 만들어 프로덕션 빌드를 배포합니다.

    gcloud iam service-accounts create vsts-deployer-prod --display-name "VSTS Deployer for Prod"

  5. Container Developer 역할을 서비스 계정에 할당합니다.

    PROJECT_NUMBER=$(gcloud projects describe \
        $(gcloud config get-value core/project) --format=value(projectNumber))
    VSTS_DEPLOYER_PROD=$(gcloud iam service-accounts list \ --filter="displayName:VSTS Deployer for Prod" --format='value(email)')
    gcloud projects add-iam-policy-binding \ $(gcloud config get-value core/project) \ --member serviceAccount:$VSTS_DEPLOYER_PROD \ --role roles/container.developer

  6. 서비스 계정 키를 생성합니다.

    gcloud iam service-accounts keys create \
        vsts-deployer-prod.json --iam-account $VSTS_DEPLOYER_PROD
    cat vsts-deployer-prod.json | base64 -w 0 > vsts-deployer-prod-oneline.json

  7. Cloud Shell의 오른쪽 상단에 있는 버튼을 클릭하여 코드 편집기를 실행합니다. 다음 단계 중 하나에서 vsts-deployer-dev.jsonvsts-deployer-prod.json의 콘텐츠가 필요하며 코드 편집기를 사용하면 이러한 콘텐츠를 가장 쉽게 복사할 수 있습니다.

    Cloud Shell 편집기 아이콘

릴리스 파이프라인 구성

GKE 인프라를 설정한 후에는 VSTS로 돌아가서 다음을 비롯한 개발을 자동화합니다.

  • 개발 환경에 배포
  • 프로덕션 환경에 배포를 시작하기 전에 수동 승인 요청
  • 프로덕션 환경에 배포

VSTS를 사용하여 Container Registry와 같은 외부 Docker 레지스트리에 연결할 수 있는 것처럼 VSTS에서 외부 Kubernetes 클러스터를 통합할 수 있습니다. 하지만 이 기능을 GKE와 함께 사용하려면 이전 인증을 사용 설정해야 합니다. 하지만 이 방법은 권장하지 않습니다. 이 VSTS 기능을 사용하는 대신 서비스 계정 키 기반 인증을 사용하여 GKE와 상호작용할 수 있는 작업 그룹을 만듭니다.

릴리스 정의 만들기

첫 번째 단계로 새 릴리스 정의를 만듭니다.

  1. VSTS에서 Build and Release(빌드 및 릴리스) > Releases(릴리스)를 선택합니다.
  2. New Definition(새 정의)을 클릭합니다.
  3. 템플릿 목록에서 Empty Process(빈 프로세스)를 선택합니다.
  4. 환경 이름을 입력하라는 메시지가 표시되면 Dev를 입력합니다.
  5. 화면 상단에서 릴리스 이름을 MusicStore-KubernetesEngine으로 지정합니다.
  6. 파이프라인 다이어그램에서 Artifacts(아티팩트) 옆에 있는 Add(추가)를 클릭합니다.
  7. Build(빌드)를 선택하고 다음 설정을 추가합니다.

    • Source(소스): MusicStore-CI
    • Default version(기본 버전): Latest
    • Source Alias(소스 별칭): manifest
  8. Add(추가)를 클릭합니다.

  9. Artifact(아티팩트) 상자에서 번개 아이콘을 눌러 배포 트리거를 추가합니다.
  10. 스위치를 Enabled(사용 설정됨)로 설정합니다.
  11. Save(저장)를 클릭합니다.
  12. 원하는 경우 설명을 입력한 다음 Save(저장)를 클릭하여 확인합니다.

이제 다음과 같은 파이프라인이 표시됩니다.

VSTS의 업데이트된 파이프라인 스크린샷

GKE 배포를 위한 작업 그룹 만들기

릴리스 정의를 만들었으면 이제 GKE로 안전하게 인증하고 통신하는 데 필요한 단계를 캡슐화하는 작업 그룹을 만들 수 있습니다. 이 작업 그룹을 사용하여 개발 및 프로덕션 환경으로 배포할 수 있기 때문에 다음 단계를 두 번 구성할 필요가 없습니다.

  1. VSTS에서 Tasks(작업) 탭으로 전환합니다.
  2. Agent phase(에이전트 단계)를 클릭합니다.
  3. 에이전트 대기열을 Hosted Linux Preview(호스팅된 Linux 미리보기)로 변경합니다.
  4. Agent phase(에이전트 단계) 옆에 있는 + 아이콘을 클릭하여 이 단계에 단계를 추가합니다.
  5. Docker 작업을 선택하고 Add(추가)를 클릭합니다.
  6. 새로 추가된 작업을 클릭하고 다음 설정을 구성합니다.

    • Display name(표시 이름): Kubernetes Engine
    • Container Registry Type(Container Registry 유형): Container Registry
    • Docker Registry Connection(Docker 레지스트리 연결): gcr-tutorial
    • Action(작업): Run an image
    • Image Name(이미지 이름): gcr.io/cloud-builders/kubectl
    • Volumes(볼륨): $(System.ArtifactsDirectory):/workspace
    • Environment Variables(환경 변수): SA_KEY=$(ServiceAccountKey)
    • Entrypoint Override(진입점 재정의): /bin/bash
    • Command(명령어): -c "echo $SA_KEY | base64 -d > _key.json && gcloud auth activate-service-account --key-file=_key.json && gcloud container clusters get-credentials $(KubernetesCluster.Name) --zone $(KubernetesCluster.Zone) --project $(KubernetesCluster.Project) && kubectl $(Command)"

    이 명령어는 매개변수로 제공되는 서비스 계정 키를 사용하며 gcloud를 사용하여 GCP에 대해 인증합니다. 이 명령어는 GKE 클러스터와 통신하는 데 필요한 구성을 다운로드한 다음 kubectl 명령어를 실행합니다. gcloudkubectl 모두 VSTS 에이전트에서 기본적으로 사용할 수 없으므로 VSTS는 이와 같은 도구가 사전 설치된 Google 제공 Docker 컨테이너에서 단계를 실행합니다.

  7. Run In Background(백그라운드에서 실행)를 지웁니다.

  8. Save(저장)를 클릭합니다.
  9. 원하는 경우 설명을 입력한 다음 OK(확인)를 클릭하여 확인합니다.
  10. 왼쪽 창에서 Kubernetes Engine 단계를 마우스 오른쪽 버튼으로 클릭한 다음 Create task group(작업 그룹 만들기)을 클릭합니다.
  11. Kubernetes Engine을 이름으로 입력하고 Create(만들기)를 클릭합니다. 이 작업으로 빨간색 This setting is required 경고가 표시됩니다. 이 문제는 곧 해결할 것입니다.

개발 클러스터에 배포

다음 단계에서는 GKE 개발 클러스터에 대한 배포를 구성합니다.

  1. VSTS에서 Variables(변수) 탭으로 전환하고 다음 변수를 추가합니다.

    이름
    ServiceAccountKey.Dev vsts-deployer-dev-oneline.json 파일의 내용을 복사합니다.

    참고: 잠금 아이콘을 클릭하여 변수가 보안 비밀로 처리되도록 합니다.
    KubernetesCluster.Dev.Name vsts-cicd-dev
    KubernetesCluster.Dev.Zone 클러스터를 만든 영역입니다.
    KubernetesCluster.Dev.Project 클러스터를 만든 GCP 프로젝트의 이름(예: vsts-test-project-12345)입니다.

  2. Tasks(작업) 탭으로 전환합니다.

  3. Task group: Kubernetes Engine(작업 그룹: Kubernetes Engine)을 클릭하고 다음 설정을 구성합니다. 필드는 여기에 나와 있는 것과 다른 순서로 표시될 수 있습니다.

    • Display name(표시 이름): Deploy to dev
    • Command(명령어): apply -f '/workspace/manifest/drop/deployment.yaml'
    • KubernetesCluster.Name: $(KubernetesCluster.Dev.Name)
    • KubernetesCluster.Zone: $(KubernetesCluster.Dev.Zone)
    • KubernetesCluster.Project: $(KubernetesCluster.Dev.Project)
    • ServiceAccountKey: $(ServiceAccountKey.Dev)
  4. Save(저장)를 클릭합니다.

  5. 원하는 경우 설명을 입력한 다음 OK(확인)를 클릭하여 확인합니다.

프로덕션 클러스터에 배포

마지막으로 GKE 프로덕션 클러스터에 대한 배포를 구성합니다.

  1. VSTS에서 Pipeline(파이프라인) 탭으로 전환합니다.
  2. Environments(환경) 상자에서 Add(추가) > New environment(새 환경)를 선택합니다.
  3. 템플릿 목록에서 Empty Process(빈 프로세스)를 선택합니다.
  4. 환경 이름을 입력하라는 메시지가 표시되면 Prod를 입력합니다.
  5. 새로 만든 환경의 번개 아이콘을 클릭합니다.
  6. 다음 설정을 구성합니다.

    • Select trigger(트리거 선택): After environment
    • Environment(환경): Dev
    • Pre-deployment approvals(사전 배포 승인): (사용 설정됨)
    • Approvers(승인자): 사용자 이름 또는 그룹을 선택합니다.

    이제 다음과 같은 파이프라인이 표시됩니다.

    VSTS의 업데이트된 파이프라인 스크린샷

  7. Variables(변수) 탭에서 다음 변수를 추가합니다.

    이름
    ServiceAccountKey.Prod vsts-deployer-prod-oneline.json 파일의 내용을 복사합니다.

    참고: 잠금 아이콘을 클릭하여 변수가 보안 비밀로 처리되도록 합니다.
    KubernetesCluster.Prod.Name vsts-cicd-prod
    KubernetesCluster.Prod.Zone 클러스터를 만든 영역입니다.
    KubernetesCluster.Prod.Project 클러스터를 만든 GCP 프로젝트의 이름입니다.

  8. Tasks(작업) 탭으로 전환합니다.

  9. Tasks(작업) 탭 위로 마우스 커서를 가져간 다음 Tasks(작업) > Prod(프로덕션)를 선택합니다.
  10. Agent phase(에이전트 단계)를 클릭합니다.
  11. 에이전트 대기열을 Hosted Linux Preview(호스팅된 Linux 미리보기)로 변경합니다.
  12. + 아이콘을 클릭하여 이 단계에 단계를 추가합니다.
  13. Kubernetes Engine 작업을 선택하고 Add(추가)를 클릭합니다.
  14. Kubernetes Engine 작업을 클릭하고 다음 설정을 구성합니다. 필드는 여기에 나와 있는 것과 다른 순서로 표시될 수 있습니다.

    • Display name(표시 이름): Deploy to prod
    • Command(명령어): apply -f '/workspace/manifest/drop/deployment.yaml'
    • KubernetesCluster.Name: $(KubernetesCluster.Prod.Name)
    • KubernetesCluster.Zone: $(KubernetesCluster.Prod.Zone)
    • KubernetesCluster.Project: $(KubernetesCluster.Prod.Project)
    • ServiceAccountKey: $(ServiceAccountKey.Prod)
  15. Save(저장)를 클릭합니다.

  16. 원하는 경우 설명을 입력한 다음 OK(확인)를 클릭하여 확인합니다.

파이프라인 실행

전체 파이프라인을 구성했으므로 이제 소스 코드를 변경하여 테스트할 차례입니다.

  1. Visual Studio에서 samples\MusicStore\config.json 파일을 엽니다.
  2. 3행에서 SiteTitle 설정을 Music Store running on Google Kubernetes Engine으로 변경합니다.
  3. Team Explorer(팀 탐색기)를 열고 Home(홈) 뷰로 전환합니다.
  4. Changes(변경사항)를 클릭합니다.
  5. Change site title과 같은 커밋 메시지를 입력합니다.
  6. Commit All and Push(모두 커밋 후 푸시)를 클릭합니다.
  7. VSTS에서 Build and Release(빌드 및 릴리스) > Builds(빌드)를 선택하고 빌드가 자동으로 트리거되었는지 확인합니다.

    빌드 중인 Music Store와 함께 진행 중인 빌드 목록을 보여주는 스크린샷

    상태가 Succeeded(성공)로 전환될 때까지 약 2분 정도 걸릴 수 있습니다.

  8. 빌드가 완료되면 Build and Release(빌드 및 릴리스) > Releases(릴리스)를 선택하고 릴리스 프로세스가 시작되었는지 확인합니다.

    릴리스 프로세스가 시작되었음을 보여주는 스크린샷

  9. Release-2(릴리스-2)를 클릭하여 세부정보 페이지를 열고 Dev 환경의 상태가 Succeeded(성공)로 전환될 때까지 기다립니다. 메뉴에서 Refresh(새로고침) 버튼을 누르거나 브라우저 페이지를 다시 로드하여 상태를 새로고침해야 할 수 있습니다.

  10. GCP 콘솔에서 Kubernetes Engine > 서비스를 선택합니다.
  11. vsts-cicd-dev 클러스터의 수신 서비스를 찾고 상태가 확인으로 전환될 때까지 기다립니다. 이 작업은 몇 분 정도 걸릴 수 있습니다.
  12. 같은 행에 */* 라벨이 지정된 링크의 URL을 복사하고 후행 별표를 삭제합니다.
  13. 새 브라우저 탭에서 URL을 엽니다. 부하 분산기를 사용할 수 있게 될 때까지 몇 분이 걸리므로 처음에는 오류가 표시될 수 있습니다. 준비가 되면 Music Store가 배포되었고 커스텀 제목이 사용되고 있는지 확인합니다.

    브라우저 페이지에서 실행 중인 Music Store 앱을 보여주는 스크린샷

  14. VSTS의 릴리스 페이지 상단에서 Approve or Reject(승인 또는 거부)를 클릭합니다.

    '사전 배포 승인이 대기 중입니다... 승인 또는 거부' 메시지 및 릴리스 페이지를 보여주는 스크린샷

    노란색 음영 막대가 보이지 않으면 이전 릴리스를 먼저 승인하거나 거부해야 합니다.

  15. Approve(승인)를 클릭하여 프로덕션 환경으로 배포를 트리거합니다.

  16. Prod(프로덕션) 환경의 상태가 Succeeded(성공)로 전환될 때까지 기다립니다. 브라우저에서 페이지를 직접 새로고침해야 할 수 있습니다.
  17. GCP 콘솔에서 서비스 페이지를 새로고침합니다.
  18. vsts-cicd-prod 클러스터의 수신 서비스를 찾고 상태가 확인으로 전환될 때까지 기다립니다. 이 작업은 몇 분 정도 걸릴 수 있습니다.
  19. 같은 행에 */* 라벨이 지정된 링크의 URL을 복사하고 후행 별표를 삭제합니다.
  20. 새 브라우저 탭에서 URL을 엽니다. 부하 분산기를 사용할 수 있게 될 때까지 몇 분이 걸리므로 처음에는 오류가 표시될 수 있습니다. 준비가 되면 커스텀 제목이 있는 MusicStore 앱이 다시 표시됩니다. 이번에는 프로덕션 클러스터에서 실행됩니다.

삭제

이 가이드를 완료한 후에 추가 비용이 발생하지 않도록 하려면 만든 항목을 삭제하세요.

VSTS 프로젝트 삭제

VSTS에서 프로젝트를 삭제합니다. 이렇게 하면 모든 소스 코드 변경사항이 손실됩니다.

GCP 프로젝트 삭제

  1. GCP 콘솔에서 프로젝트 페이지로 이동합니다.

    프로젝트 페이지로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 프로젝트 삭제를 클릭합니다. 프로젝트 이름 옆의 체크박스를 선택한 다음 프로젝트 삭제 클릭
  3. 대화상자에서 프로젝트 ID를 입력한 다음 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...