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

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

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

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

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

목표

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

비용

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

가격 계산기를 사용하면 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다. Azure DevOps 사용 시 부과될 수 있는 요금은 Azure DevOps 가격 페이지를 참조하세요.

시작하기 전에

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

  1. Google Cloud Platform 프로젝트를 선택하거나 만듭니다.

    리소스 관리 페이지로 이동

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

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

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

Azure DevOps 프로젝트 만들기

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

  1. Azure DevOps 홈페이지(https://dev.azure.com/[YOUR_AZURE_DEVOPS_ACCOUNT_NAME])로 이동합니다.
  2. Create Project(프로젝트 만들기)를 클릭합니다.
  3. Music Store와 같은 프로젝트 이름을 입력합니다.
  4. Visibility(공개 상태)Private(비공개)로 설정하고 Create project(프로젝트 만들기)를 클릭합니다.
  5. 프로젝트가 생성되면 왼쪽 메뉴에서 Repos(저장소)를 클릭합니다.
  6. Import(가져오기)를 클릭하여 GitHub의 Music Store 저장소를 포크합니다. 다음 값을 설정합니다.

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

    'Import a Git repository(Git 저장소 가져오기)' 대화상자의 스크린샷

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

    가져오기 프로세스가 완료되면 MusicStore 애플리케이션의 소스 코드가 표시됩니다.

지속적으로 빌드

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

테스트 브랜치 만들기

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

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

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

기본적으로 Azure Pipelines는 코드가 master 브랜치에 상주할 것으로 예상합니다. testing 브랜치를 사용하도록 하려면 기본 브랜치를 변경해야 합니다.

  1. Azure DevOps 메뉴에서 Project settings(프로젝트 설정)를 선택합니다.
  2. Repos(저장소) > Repositories(저장소)를 선택합니다.
  3. 저장소 목록에서 이전에 가져온 Git 저장소를 선택합니다. Azure DevOps 프로젝트와 이름이 동일해야 합니다.
  4. Branches(브랜치) 옆의 화살표를 클릭하여 브랜치 목록을 펼칩니다.
  5. testing 브랜치를 선택합니다.

    브랜치 이름 옆에 ... 버튼이 표시됩니다.

  6. ...을 클릭하고 Set as default branch(기본 브랜치로 설정)을 선택합니다.

코드 빌드

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

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

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

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

빌드 파이프라인을 정의하는 YAML 파일을 만들려면 먼저 코드를 체크아웃해야 합니다.

  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 저장소의 스크린샷

빌드 파이프라인을 정의하는 YAML 파일 만들기

코드를 체크아웃했으면 빌드 파이프라인을 구성할 수 있습니다.

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

    resources:
    - repo: self
      fetchDepth: 1
    queue:
      name: Hosted Ubuntu 1604
    trigger:
    - testing
    variables:
      TargetFramework: 'netcoreapp2.0'
      RestoreBuildProjects: 'samples/**/*.csproj'
      TestProjects: 'test/MusicStore.Test/*.csproj'
      BuildConfiguration: 'Release'
      DockerImageName: '[PROJECT-ID]/musicstore'
    steps:
    - task: DotNetCoreCLI@2
      displayName: Restore
      inputs:
        command: restore
        projects: '$(RestoreBuildProjects)'
        feedsToUse: config
        nugetConfigPath: NuGet.config
    - task: DotNetCoreCLI@2
      displayName: Build
      inputs:
        projects: '$(RestoreBuildProjects)'
        arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)'
    - task: DotNetCoreCLI@2
      displayName: Test
      inputs:
        command: test
        projects: '$(TestProjects)'
        arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)'
    - task: DotNetCoreCLI@2
      displayName: Publish
      inputs:
        command: publish
        publishWebProjects: True
        arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)'
        zipAfterPublish: false
        modifyOutputPath: false
    
  4. variables 섹션에서 [PROJECT_ID]를 GCP 프로젝트 이름으로 바꾸고 파일을 저장합니다.

  5. Team Explorer(팀 탐색기)를 열고 왼쪽 상단에 있는 Home(홈) 아이콘을 클릭하여 Home(홈) 뷰로 전환합니다.

  6. Changes(변경사항)를 클릭합니다.

  7. Add build definition과 같은 커밋 메시지를 입력합니다.

  8. Commit All and Push(모두 커밋 후 푸시)를 클릭합니다.

  9. Azure DevOps 메뉴에서 Pipelines(파이프라인) > Build(빌드)를 선택합니다.

    Git 저장소에 커밋한 YAML 파일을 기반으로 빌드 정의가 생성되었고 빌드가 자동으로 트리거되었는지 확인합니다.

Docker 이미지 게시

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

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

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

  1. GCP Console의 프로젝트로 전환하고 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 azure-pipelines-test-project-12345
    gcloud config set compute/zone us-central1-a
  3. 프로젝트에서 Container Registry API를 사용 설정합니다.

    gcloud services enable containerregistry.googleapis.com
  4. Azure Pipelines에서 Docker 이미지를 게시하는 데 사용할 서비스 계정을 만듭니다.

    gcloud iam service-accounts create azure-pipelines-publisher --display-name "Azure Pipelines Publisher"
  5. 서비스 계정에 스토리지 관리자 IAM 역할을 할당합니다.

    PROJECT_NUMBER=$(gcloud projects describe \
        $(gcloud config get-value core/project) \
        --format='value(projectNumber)')
    
    AZURE_PIPELINES_PUBLISHER=$(gcloud iam service-accounts list \
        --filter="displayName:Azure Pipelines Publisher" \
        --format='value(email)')
    
    gcloud projects add-iam-policy-binding \
        $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_PUBLISHER \
        --role roles/storage.admin
    
  6. 서비스 계정 키를 생성합니다.

    gcloud iam service-accounts keys create \
        azure-pipelines-publisher.json --iam-account $AZURE_PIPELINES_PUBLISHER
    
    tr -d '\n' < azure-pipelines-publisher.json > azure-pipelines-publisher-oneline.json
  7. Cloud Shell 오른쪽 상단의 버튼을 클릭하여 코드 편집기를 실행합니다.

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

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

Container Registry에 Azure Pipelines 연결

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

  1. Azure DevOps 메뉴에서 Project settings(프로젝트 설정)를 선택한 다음 Pipelines(파이프라인) > Service connections(서비스 연결)를 선택합니다.
  2. New service connection(새 서비스 연결)을 클릭합니다.
  3. 목록에서 Docker Registry를 선택합니다.
  4. 대화상자에서 다음 필드의 값을 입력합니다.

    • Connection Name(연결 이름): gcr-tutorial
    • Docker Registry: https://gcr.io/[PROJECT-ID], 여기에서 [PROJECT-ID]는 GCP 프로젝트 이름입니다.

      예: https://gcr.io/azure-pipelines-test-project-12345

    • Docker ID: _json_key

    • Password(비밀번호): azure-pipelines-publisher-oneline.json의 내용을 붙여넣습니다.

  5. OK(확인)를 클릭하여 연결을 만듭니다.

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(모두 커밋)을 클릭합니다.

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

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

  1. Visual Studio에서 azure-pipelines.yml를 엽니다.
  2. 다음 코드를 파일에 추가하여 빌드 정의를 확장합니다.

    - task: CmdLine@1
      displayName: 'Lock image version in deployment.yaml'
      inputs:
        filename: /bin/bash
        arguments: '-c "awk ''{gsub(\"MUSICSTORE_IMAGE\", \"gcr.io/$(DockerImageName):$(Build.BuildId)\", $0); print}'' deployment.yaml > $(build.artifactstagingdirectory)/deployment.yaml"'
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact'
      inputs:
        PathtoPublish: '$(build.artifactstagingdirectory)'
    - task: Docker@0
      displayName: 'Build image'
      inputs:
        containerregistrytype: 'Container Registry'
        dockerRegistryConnection: 'gcr-tutorial'
        imageName: '$(DockerImageName):$(Build.BuildId)'
    - task: Docker@0
      displayName: 'Publish image'
      inputs:
        containerregistrytype: 'Container Registry'
        dockerRegistryConnection: 'gcr-tutorial'
        action: 'Push an image'
        imageName: '$(DockerImageName):$(Build.BuildId)'
    

Azure DevOps에 변경 사항을 커밋하고 푸시하려면 다음을 수행하세요.

  1. Visual Studio에서 Team Explorer(팀 탐색기)를 엽니다.
  2. 왼쪽 상단에 있는 아이콘을 클릭해 뷰로 전환합니다.
  3. Changes(변경사항)를 클릭합니다.
  4. Extend build definition to build Docker image과 같은 커밋 메시지를 입력합니다.
  5. Commit All and Push(모두 커밋 후 푸시)를 클릭합니다.
  6. Azure DevOps 메뉴에서 Pipelines(파이프라인) > Build(빌드)를 선택합니다.

    새 빌드가 자동으로 트리거되었는지 확인합니다. 빌드가 완료되는 데 약 2분 정도 걸릴 수 있습니다.

    빌드가 실패하고 Step input dockerRegistryConnection references service connection gcr-tutorial which could not be found라는 오류 메시지가 표시되면 파이프라인을 다시 저장해야 합니다.

  7. 이미지가 Container Registry에 게시되었는지 확인하려면 GCP Console로 전환하고 Container Registry > 이미지를 선택한 다음 musicstore를 클릭합니다.

    이미지 한 개가 있고 이 이미지의 태그가 Azure Pipelines에서 실행된 빌드의 숫자 ID와 일치하는지 확인합니다.

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

지속적으로 배포

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

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

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

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

MusicStore 빌드 프로세스가 생성하는 기본 아티팩트는 Docker 이미지입니다. 그러나 Docker 이미지는 Container Registry에 게시되므로 Azure Pipelines의 범위를 벗어납니다. 따라서 이미지는 릴리스의 정의에 딱 부합하지는 않습니다.

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

Kubernetes 배포 구성

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

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

MusicStore 애플리케이션에서는 SQL Server를 사용할 수도 있고, 로컬에 저장되는 임베디드 데이터베이스를 사용할 수도 있습니다. 여기에서는 편의상 임베디드 데이터베이스를 활용하는 기본 구성을 사용합니다. 이 경우 두 가지 제한사항이 있습니다.

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

이러한 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(모두 커밋 후 푸시)를 클릭합니다.

개발 및 프로덕션 환경 설정

Azure Pipelines 릴리스 관리로 돌아가기 전에 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 azure-pipelines-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 azure-pipelines-cicd-dev
  5. 다음 명령어를 사용하여 프로덕션 클러스터를 만듭니다. 완료되는 데 몇 분 정도 걸릴 수 있습니다.

    gcloud container clusters create azure-pipelines-cicd-prod

개발 클러스터에 Azure Pipelines 연결

Azure Pipelines를 사용하여 Container Registry와 같은 외부 Docker 레지스트리에 연결할 수 있는 것처럼, Azure Pipelines는 외부 Kubernetes 클러스터를 통합하는 기능을 지원합니다.

GCP 서비스 계정을 사용하여 Container Registry에 인증할 수는 있지만, Azure Pipelines에서 GCP 서비스 계정을 사용하여 GKE로 인증할 수는 없습니다. 대신 Kubernetes 서비스 계정을 사용해야 합니다.

따라서 Azure Pipelines를 개발 클러스터에 연결하려면 먼저 Kubernetes 서비스 계정을 만들어야 합니다.

  1. Cloud Shell에서 개발 클러스터에 연결합니다.

    gcloud container clusters get-credentials azure-pipelines-cicd-dev
  2. Azure Pipelines에서 사용할 Kubernetes 서비스 계정을 만듭니다.

    kubectl create serviceaccount azure-pipelines-deploy
  3. 클러스터 역할 바인딩을 만들어 서비스 계정에 cluster-admin 역할을 할당합니다.

    kubectl create clusterrolebinding azure-pipelines-deploy --clusterrole=cluster-admin --serviceaccount=default:azure-pipelines-deploy
  4. 클러스터의 IP 주소를 확인합니다.

    gcloud container clusters describe azure-pipelines-cicd-dev --format=value\(endpoint\)
    

    잠시 후에 이 주소가 필요합니다.

  5. Azure DevOps 메뉴에서 Project settings(프로젝트 설정)를 선택한 다음 Pipelines(파이프라인) > Service connections(서비스 연결)를 선택합니다.

  6. New service connection(새 서비스 연결)을 클릭하고 Kubernetes를 선택합니다.

  7. 다음 설정을 구성합니다.

    • Choose authentication(인증 선택): Service account(서비스 계정)
    • Connection name(연결 이름): azure-pipelines-cicd-dev
    • Server URL(서버 URL): https://[MASTER-IP]/. [MASTER-IP]를 이전에 결정한 IP 주소로 바꿉니다.
    • Token(토큰): Cloud Shell에서 다음 명령어를 실행하고 출력을 복사합니다.
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data.token}{'\n'}"
    • Certificate(인증서): Cloud Shell에서 다음 명령어를 실행하고 출력을 복사합니다.
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data['ca\.crt']}{'\n'}"
  8. OK(확인)를 클릭합니다.

Azure Pipelines를 프로덕션 클러스터에 연결

Azure Pipelines를 프로덕션 클러스터에 연결하려면 동일한 접근법을 따릅니다.

  1. Cloud Shell에서 프로덕션 클러스터에 연결합니다.

    gcloud container clusters get-credentials azure-pipelines-cicd-prod
  2. Azure Pipelines에서 사용할 Kubernetes 서비스 계정을 만듭니다.

    kubectl create serviceaccount azure-pipelines-deploy
  3. 클러스터 역할 바인딩을 만들어 서비스 계정에 cluster-admin 역할을 할당합니다.

    kubectl create clusterrolebinding azure-pipelines-deploy --clusterrole=cluster-admin --serviceaccount=default:azure-pipelines-deploy
  4. 클러스터의 IP 주소를 확인합니다.

    gcloud container clusters describe azure-pipelines-cicd-prod --format=value\(endpoint\)
    

    잠시 후에 이 주소가 필요합니다.

  5. Azure DevOps 메뉴에서 Project settings(프로젝트 설정)을 선택한 다음 Pipelines(파이프라인) > Service connections(서비스 연결)을 선택합니다.

  6. New service connection(새 서비스 연결)을 클릭하고 Kubernetes를 선택합니다.

  7. 다음 설정을 구성합니다.

    • Choose authentication(인증 선택): Service account(서비스 계정)
    • Connection name(연결 이름): azure-pipelines-cicd-prod
    • Server URL(서버 URL): https://[MASTER-IP]/. [MASTER-IP]를 이전에 결정한 IP 주소로 바꿉니다.
    • Token(토큰): Cloud Shell에서 다음 명령어를 실행하고 출력을 복사합니다.
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data.token}{'\n'}"
    • Certificate(인증서): Cloud Shell에서 다음 명령어를 실행하고 출력을 복사합니다.
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data['ca\.crt']}{'\n'}"
  8. OK(확인)를 클릭합니다.

릴리스 파이프라인 구성

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

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

릴리스 정의 만들기

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

  1. Azure DevOps 메뉴에서 Pipelines(파이프라인) > Releases(릴리스)를 선택합니다.
  2. New pipeline(새 파이프라인)을 클릭합니다.
  3. 템플릿 목록에서 Empty job(빈 작업)을 선택합니다.
  4. 스테이지 이름을 입력하라는 메시지가 표시되면 Dev를 입력합니다.
  5. 화면 상단에서 릴리스 이름을 MusicStore-KubernetesEngine으로 지정합니다.
  6. 파이프라인 다이어그램에서 Artifacts(아티팩트) 옆에 있는 Add(추가)를 클릭합니다.
  7. 빌드를 선택하고 다음 설정을 추가합니다.

    • Source(build pipeline)(소스(빌드 파이프라인)): 빌드 정의를 선택합니다. 옵션이 하나뿐이어야 합니다.
    • Default version(기본 버전): Latest
    • Source Alias(소스 별칭): manifest
  8. Add(추가)를 클릭합니다.

  9. Artifact(아티팩트) 상자에서 번개 아이콘을 눌러 배포 트리거를 추가합니다.

  10. Continuous deployment trigger(지속적 배포 트리거)에서 스위치를 Enabled(사용 설정됨)으로 설정합니다.

  11. Save(저장)를 클릭합니다.

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

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

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

개발 클러스터에 배포

릴리스 정의가 생성되면 이제 GKE 개발 클러스터에 대한 배포를 구성할 수 있습니다.

  1. 파이프라인 메뉴에서 Tasks(작업) 탭으로 전환합니다.
  2. Agent job(에이전트 작업)을 클릭합니다.
  3. 에이전트 풀을 Hosted Ubuntu 1604(호스팅된 Ubuntu 1604)로 변경합니다.
  4. 에이전트 작업 옆에 있는 + 아이콘을 클릭하여 단계(phase)에 단계를 추가합니다.
  5. Deploy to Kubernetes(Kubernetes에 배포) 태스크를 선택하고 Add(추가)를 클릭합니다.
  6. 새로 추가된 태스크를 클릭하고 다음 설정을 구성합니다.

    • Display name(표시 이름): Deploy
    • Service connection type(서비스 연결 유형): Kubernetes Service Connection
    • Kubernetes service connection(Kubernetes 서비스 연결): azure-pipelines-cicd-dev
    • Command(명령어): apply
    • Use configuration(구성 사용): Enabled(사용 설정됨)
    • Configuration type(구성 유형): File path(파일 경로)
    • Configuration file(구성 파일): manifest/drop/deployment.yaml
  7. Save(저장)를 클릭합니다.

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

프로덕션 클러스터에 배포

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

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

    • Select trigger(트리거 선택): After stage(스테이지 후)
    • Stages(스테이지): Dev
    • Pre-deployment approvals(사전 배포 승인): (사용 설정됨)
    • Approvers(승인자): 자신의 사용자 이름 또는 그룹 선택

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

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

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

  8. Tasks(작업) 탭 위로 마우스 커서를 가져간 다음 Tasks(작업) > Prod(프로덕션)를 선택합니다.

  9. Agent job(에이전트 작업)을 클릭합니다.

  10. 에이전트 풀을 Hosted Ubuntu 1604(호스팅된 Ubuntu 1604)로 변경합니다.

  11. + 아이콘을 클릭하여 단계(phase)에 단계를 추가합니다.

  12. Deploy to Kubernetes(Kubernetes에 배포) 태스크를 선택하고 Add(추가)를 클릭합니다.

  13. 새로 추가된 태스크를 클릭하고 다음 설정을 구성합니다.

    • Display name(표시 이름): Deploy
    • Service connection type(서비스 연결 유형): Kubernetes Service Connection
    • Kubernetes service connection(Kubernetes 서비스 연결): azure-pipelines-cicd-prod
    • Command(명령어): apply
    • Use configuration(구성 사용): Enabled(사용 설정됨)
    • Configuration type(구성 유형): File path(파일 경로)
    • Configuration file(구성 파일): manifest/drop/deployment.yaml
  14. Save(저장)를 클릭합니다.

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

파이프라인 실행

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

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

    진행 중인 빌드 목록의 스크린샷, Music Store 빌드 진행 중

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

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

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

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

  10. GCP Console에서 Kubernetes Engine > 서비스를 선택합니다.

  11. azure-pipelines-cicd-dev 클러스터의 수신 서비스를 찾고 상태가 Ok(확인)으로 전환될 때까지 기다립니다. 이 작업은 몇 분 정도 걸릴 수 있습니다.

  12. 같은 행에 */* 라벨이 지정된 링크의 URL을 복사하고 후행 별표를 삭제합니다.

  13. 새 브라우저 탭에서 URL을 엽니다. 부하 분산기를 사용할 수 있게 될 때까지 몇 분이 걸리므로 처음에는 오류가 표시될 수 있습니다. 준비가 되면 Music Store가 배포되었고 커스텀 제목이 사용되고 있는지 확인합니다.

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

  14. Azure Pipelines에서 Prod 스테이지 아래의 Approve(승인) 버튼을 클릭하여 배포를 프로덕션 환경으로 승격합니다.

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

    버튼이 보이지 않는 경우 먼저 이전 릴리스를 승인 또는 거부해야 할 수 있습니다.

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

  16. Prod(프로덕션) 환경의 상태가 Succeeded(성공)로 전환될 때까지 기다립니다. 브라우저에서 페이지를 직접 새로고침해야 할 수 있습니다.

  17. GCP Console에서 서비스 페이지를 새로고침합니다.

  18. azure-pipelines-cicd-prod 클러스터의 수신 서비스를 찾고 상태가 Ok(확인)으로 전환될 때까지 기다립니다. 이 작업은 몇 분 정도 걸릴 수 있습니다.

  19. 같은 행에 */* 라벨이 지정된 링크의 URL을 복사하고 후행 별표를 삭제합니다.

  20. 새 브라우저 탭에서 URL을 엽니다. 부하 분산기를 사용할 수 있게 될 때까지 몇 분이 걸리므로 처음에는 오류가 표시될 수 있습니다. 준비가 되면 커스텀 제목이 있는 MusicStore 앱이 다시 표시됩니다. 이번에는 프로덕션 클러스터에서 실행됩니다.

삭제

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

Azure Pipelines 프로젝트 삭제

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

GCP 프로젝트 삭제

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

    프로젝트 페이지로 이동

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

다음 단계

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

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