Azure Pipelines를 사용하여 Azure Kubernetes Service에 빌드 및 배포합니다

Azure DevOps Services

Azure Pipelines를 사용하여 AKS(Azure Kubernetes Service)에 자동으로 배포합니다. Azure Pipelines를 사용하면 Azure DevOps를 사용하여 CI(연속 통합) 및 CD(지속적인 업데이트)로 빌드, 테스트 및 배포할 수 있습니다.

이 문서에서는 앱을 지속적으로 빌드하고 배포하는 파이프라인을 만드는 방법에 대해 알아봅니다. Dockerfile이 포함된 리포지토리에서 코드를 변경할 때마다 이미지가 Azure Container Registry로 푸시되고 매니페스트가 AKS 클러스터에 배포됩니다.

필수 조건

코드 가져오기

응용 프로그램 예제 및 Dockerfile이 포함된 다음 리포지토리를 포크합니다.

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Azure 리소스 만들기

Azure Portal에 로그인한 다음 오른쪽 위 모서리에서 Cloud Shell 단추를 선택합니다. Azure CLI 또는 PowerShell을 사용하여 AKS 클러스터를 만듭니다.

컨테이너 레지스트리 만들기

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys

Azure Pipelines 로그인

Azure Pipelines에 로그인합니다. 로그인하면 브라우저가 https://dev.azure.com/my-organization-name으로 이동하여 Azure DevOps 대시보드를 표시합니다.

선택한 조직 내에서 프로젝트를 만듭니다. 조직에 프로젝트가 없으면 프로젝트를 만들어 시작 화면이 표시됩니다. 그렇지 않으면 대시보드의 오른쪽 위 모서리에서 프로젝트 만들기 단추를 선택합니다.

파이프라인 만들기

리포지토리 연결 및 선택

  1. Azure DevOps 조직에 로그인하고, 프로젝트로 이동합니다.

  2. Pipelines로 이동한 다음, 새 파이프라인을 선택합니다.

  3. 먼저 소스 코드의 위치로 GitHub 선택하여 마법사의 단계를 수행합니다.

  4. 로그인할 GitHub로 리디렉션될 수 있습니다. 그렇다면 GitHub 자격 증명을 입력합니다.

  5. 리포지토리 목록이 표시되면 리포지토리를 선택합니다.

  6. Azure Pipelines 앱을 설치하도록 GitHub로 리디렉션될 수 있습니다. 그렇다면 승인 및 설치를 선택합니다.

  7. Azure Kubernetes Service에 배포를 선택합니다.

  8. 메시지가 표시되면 레지스트리 및 클러스터를 만든 구독을 선택합니다.

  9. myapp 클러스터를 선택합니다.

  10. 네임스페이스의 경우 기존을 선택한 다음, 기본값을 선택합니다.

  11. 컨테이너 레지스트리의 이름을 선택합니다.

  12. 이미지 이름을 기본값으로 설정된 상태로 둘 수 있습니다.

  13. 서비스 포트를 8080으로 설정합니다.

  14. 후속 단계에서 자동으로 생성된 파이프라인 YAML에 포함할 검토 앱 관련 구성에 대한 끌어오기 요청에 대한 검토 앱 사용 확인란을 설정합니다.

  15. 유효성 검사 및 구성을 선택합니다.

    Azure Pipelines가 파이프라인을 만들면 프로세스는 다음을 수행합니다.

    • Docker 레지스트리 서비스 연결을 만들어 파이프라인이 컨테이너 레지스트리에 이미지를 푸시할 수 있도록 합니다.

    • 환경 내에서 환경 및 Kubernetes 리소스를 만듭니다. RBAC 사용 클러스터의 경우 생성된 Kubernetes 리소스는 생성된 ServiceAccount가 선택한 네임스페이스 외부에서 작업을 수행할 수 없도록 클러스터에 ServiceAccount 및 RoleBinding 개체를 암시적으로 만듭니다.

    • 파이프라인을 정의하는 azure-pipelines.yml 파일을 생성합니다.

    • Kubernetes 매니페스트 파일을 생성합니다. 이러한 파일은 선택한 항목에 따라 deployment.ymlservice.yml 템플릿을 하이드레이션하여 생성됩니다. 준비가 되면 저장 및 실행을 선택합니다.

  16. 저장 및 실행을 선택합니다.

  17. 커밋 메시지리포지토리에 파이프라인 추가와 같은 항목으로 변경할 수 있습니다. 준비가 되면 저장 및 실행을 선택하여 새 파이프라인을 리포지토리에 커밋한 다음 새 파이프라인의 첫 번째 실행을 시작합니다.

앱 배포 보기

파이프라인이 실행되면 빌드 단계를 확인하고 배포 단계를 파란색(실행 중)에서 녹색(완료됨)으로 이동합니다. 스테이지를 선택하여 실행 중인 파이프라인을 볼 수 있습니다.

참고 항목

Microsoft 호스트된 에이전트를 사용하는 경우 방화벽에 Microsoft 호스트된 에이전트의 IP 범위를 추가해야 합니다. 매주 수요일에 게시되는 주간 JSON 파일에서 IP 범위의 주간 목록을 가져옵니다. 새 IP 범위는 다음 월요일에 적용됩니다. 자세한 내용은 Microsoft 호스트된 에이전트를 참조하세요. Azure DevOps 조직에 필요한 IP 범위를 찾으려면 Microsoft 호스트된 에이전트의 가능한 IP 범위를 식별하는 방법을 알아봅니다.

파이프라인 실행이 완료되면 발생한 작업을 탐색한 다음 앱이 배포된 것을 확인합니다. 파이프라인 요약에서:

  1. 환경 탭을 선택합니다.

  2. 환경 보기를 선택합니다.

  3. 배포한 네임스페이스에 대한 앱의 인스턴스를 선택합니다. 기본값을 사용한 경우 기본 네임스페이스의 myapp 앱입니다.

  4. 서비스 탭을 선택합니다.

  5. 외부 IP 주소를 선택하고 이를 클립보드에 복사합니다.

  6. 새 브라우저 탭을 열고 <IP 주소>(8080)를 입력합니다.

샘플 앱을 빌드하는 경우 브라우저에 Hello World가 나타납니다.

파이프라인 빌드 방법

옵션 선택을 완료한 다음 Azure Kubernetes Service에 배포하기 템플릿을 사용하여 파이프라인의 유효성을 검사하고 구성한 Azure Pipelines 파이프라인을 만들었습니다.

빌드 단계에서는 Docker 작업을 사용하여 이미지를 빌드하고 Azure Container Registry에 푸시합니다.

- stage: Build
  displayName: Build stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

    - task: PublishPipelineArtifact@1
      inputs:
        artifactName: 'manifests'
        path: 'manifests'

배포 작업은 Kubernetes 매니페스트 작업을 사용하여 Kubernetes 클러스터 노드가 Azure Container Registry 리소스에서 끌어오는 데 필요한 imagePullSecret을(를) 만듭니다. 그런 다음, Kubernetes 매니페스트 작업에서 매니페스트 파일을 사용하여 Kubernetes 클러스터에 배포합니다. 매니페스트 파일 service.ymldeployment.ymlAzure Kubernetes Service에 배포 템플릿을 사용할 때 생성되었습니다.

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  jobs:
  - deployment: Deploy
    displayName: Deploy job
    pool:
      vmImage: $(vmImageName)
    environment: 'myenv.aksnamespace' #customize with your environment
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadPipelineArtifact@2
            inputs:
              artifactName: 'manifests'
              downloadPath: '$(System.ArtifactsDirectory)/manifests'

          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespace)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespace)
              manifests: |
                $(System.ArtifactsDirectory)/manifests/deployment.yml
                $(System.ArtifactsDirectory)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

리소스 정리

만든 리소스를 완료할 때마다 다음 명령을 사용하여 삭제할 수 있습니다.

az group delete --name myapp-rg

메시지가 나타나면 y을(를) 입력합니다.

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Azure Pipelines를 사용하여 AKS(Azure Kubernetes Service)에 자동으로 배포합니다. Azure Pipelines를 사용하면 Azure DevOps를 사용하여 CI(연속 통합) 및 CD(지속적인 업데이트)로 빌드, 테스트 및 배포할 수 있습니다.

이 문서에서는 앱을 지속적으로 빌드하고 배포하는 파이프라인을 만드는 방법에 대해 알아봅니다. Dockerfile이 포함된 리포지토리에서 코드를 변경할 때마다 이미지가 Azure Container Registry로 푸시되고 매니페스트가 AKS 클러스터에 배포됩니다.

필수 조건

코드 가져오기

응용 프로그램 예제 및 Dockerfile이 포함된 다음 리포지토리를 포크합니다.

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Azure 리소스 만들기

Azure Portal에 로그인한 다음 오른쪽 위 모서리에서 Cloud Shell 단추를 선택합니다. Azure CLI 또는 PowerShell을 사용하여 AKS 클러스터를 만듭니다.

컨테이너 레지스트리 만들기

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys 

인증 구성

AKS(Azure Kubernetes Service)에서 ACR(Azure Container Registry)을 사용하는 경우 인증 메커니즘을 설정해야 합니다. 이 작업은 두 가지 방법으로 수행할 수 있습니다.

  1. AKS에 ACR에 대한 액세스 권한을 부여합니다. Azure Kubernetes Service의 Azure Container Registry를 사용하여 인증을 참조하세요.

  2. Kubernetes 이미지 끌어오기 비밀을 사용합니다. Kubernetes 배포 작업을 사용하여 이미지 끌어오기 비밀을 만들 수 있습니다.

릴리스 파이프라인 만들기

CI를 설정하는 데 사용되는 빌드 파이프라인은 이미 Docker 이미지를 빌드하고 Azure Container Registry에 푸시했습니다. 또한 Helm 차트를 패키지하고 아티팩트로 게시했습니다. 릴리스 파이프라인에서는 AKS 클러스터에 Helm 애플리케이션으로 컨테이너 이미지를 배포합니다.

  1. Azure Pipelines에 빌드에 대한 요약을 엽니다.

  2. 빌드 요약에서 릴리스 아이콘을 선택하여 새 릴리스 파이프라인을 시작합니다.

    이전에 이러한 빌드 아티팩트를 사용하는 릴리스 파이프라인을 만든 경우 대신 새 릴리스를 만들라는 메시지가 표시됩니다. 이 경우 릴리스 페이지로 이동하여 + 아이콘을 선택하여 새 릴리스 파이프라인을 시작합니다.

  3. 빈 작업 템플릿을 선택합니다.

  4. 작업 페이지를 열고 에이전트 작업을 선택합니다.

  5. +을(를) 선택하여 새 작업을 추가하고 Helm 도구 설치 관리자 작업을 추가합니다. 이렇게 하면 후속 작업을 실행하는 에이전트에 Helm 및 Kubectl이 설치되어 있습니다.

  6. +을(를) 다시 선택하고 패키지 및 Helm 차트 배포 작업을 추가합니다. 다음과 같이 이 작업에 대한 설정을 구성합니다.

    • 연결 유형: Azure 서비스 연결을 사용하여 AKS 클러스터에 연결하려면 Azure Resource Manager 를 선택합니다. 또는 kubeconfig 또는 서비스 계정을 사용하여 Kubernetes 클러스터에 연결하려는 경우 Kubernetes 서비스 연결을 선택할 수 있습니다. 이 경우 다음 설정에 대한 Azure 구독 대신 Kubernetes 서비스 연결을 만들고 선택해야 합니다.

    • Azure 구독: 사용할 수 있는 Azure 서비스 연결 목록에서 연결을 선택하거나, Azure 구독에 좀 더 제한된 권한 연결을 만듭니다. 입력 옆에 권한 부여 단추가 표시되면 이를 사용하여 Azure 구독에 대한 연결 권한을 부여합니다. 구독 목록에 필요한 Azure 구독이 표시되지 않는 경우 연결을 수동으로 설정하는 Azure 서비스 연결 만들기를 참조하세요.

    • 리소스 그룹: AKS 클러스터를 포함하는 리소스 그룹을 입력하거나 선택합니다.

    • Kubernetes 클러스터: 만든 AKS 클러스터를 입력하거나 선택합니다.

    • 명령: Helm 명령으로 init를 선택합니다. 그러면 실행 중인 Kubernetes 클러스터에 Tiller가 설치됩니다. 또한 필요한 모든 로컬 구성을 설정합니다. 카나리아 이미지 버전 사용을 체크하여 최신 시험판 버전의 Tiller를 설치합니다. Tiller 업그레이드를 체크하여 사전 설치된 경우 Tiller를 업그레이드하도록 선택할 수도 있습니다. 이러한 옵션을 사용하도록 설정하면 helm init --canary-image --upgrade 작업이 실행됩니다.

  7. 에이전트 작업에서 +을(를) 선택하고 다른 패키지 및 Helm 차트 배포 작업을 추가합니다. 다음과 같이 이 작업에 대한 설정을 구성합니다.

    • Kubernetes 클러스터: 만든 AKS 클러스터를 입력하거나 선택합니다.

    • 네임스페이스: 애플리케이션을 배포할 Kubernetes 클러스터 네임스페이스를 입력합니다. Kubernetes는 동일한 물리적 클러스터에서 지원하는 여러 가상 클러스터를 지원합니다. 이러한 가상 클러스터를 네임스페이스라고 합니다. 네임스페이스를 사용하여 동일한 클러스터에서 개발, 테스트 및 스테이징과 같은 다양한 환경을 만들 수 있습니다.

    • 명령: Helm 명령으로 업그레이드를 선택합니다. 이 작업을 사용하여 Helm 명령을 실행하고 명령 옵션을 인수로 전달할 수 있습니다. 업그레이드를 선택하면 작업에 몇 가지 추가 필드가 표시됩니다.

      • 차트 형식: 파일 경로를 선택합니다. 또는 URL 또는 차트 이름을 지정하려는 경우 차트 이름을 지정할 수 있습니다. 예를 들어 차트 이름이 stable/mysql이면 helm upgrade stable/mysql 작업이 실행됩니다.

      • 차트 경로: 패키지된 차트의 경로 또는 포장되지 않은 차트 디렉터리의 경로일 수 있습니다. 이 예제에서는 CI 빌드를 사용하여 차트를 게시하므로 파일 선택기를 사용하여 파일 패키지를 선택하거나 $(System.DefaultWorkingDirectory)/**/*.tgz을(를) 입력합니다.

      • 릴리스 이름: 릴리스의 이름을 입력합니다. 예를 들어 azuredevops을(를) 입력합니다.

      • Pod 다시 만들기: 릴리스 중에 구성이 변경되고 실행 중인 Pod를 새 구성으로 바꾸려면 이 확인란을 체크합니다.

      • 값 다시 설정: 차트에 기본 제공되는 값을 작업에서 제공하는 모든 값으로 재정의하려면 이 확인란을 체크합니다.

      • 강제: 충돌이 발생할 경우 업그레이드 및 롤백하여 삭제하고, 리소스를 다시 만들고, 전체 릴리스를 다시 설치하려는 경우 이 확인란을 체크합니다. 이는 패치 적용이 실패할 수 있는 시나리오에서 유용합니다(예: 클러스터 IP 주소가 변경할 수 없으므로 서비스의 경우).

      • 인수: Helm 명령 인수 및 해당 값을 입력합니다. 이 예제의 경우 --set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId) 이러한 인수를 사용하는 이유에 대한 설명은 이 섹션을 참조하세요.

      • TLS 사용: Helm과 Tiller 간에 강력한 TLS 기반 연결을 사용하도록 설정하려면 이 확인란을 체크합니다.

      • CA 인증서: 업로드할 CA 인증서를 지정하고 Tiller 및 Helm 클라이언트에 대한 인증서를 발급하는 데 사용합니다.

      • 인증서: Tiller 인증서 또는 Helm 클라이언트 인증서 지정

      • : Tiller 키 또는 Helm 클라이언트 키 지정

  8. 파이프라인의 변수 페이지에서 imageRepoName 이라는 변수를 추가하고 값을 Helm 이미지 리포지토리의 이름으로 설정합니다. 일반적으로 example.azurecr.io/coderepository 형식입니다.

  9. 릴리스 파이프라인을 저장합니다.

Helm 업그레이드 작업에 사용되는 인수

빌드 파이프라인에서 컨테이너 이미지에 태그 $(Build.BuildId)(이)가 지정되고 Azure Container Registry로 푸시됩니다. Helm 차트에서는 동일한 차트를 사용하여 다른 환경에 배포할 수 있으므로 이름 및 태그와 같은 컨테이너 이미지 세부 정보를 매개 변수화할 수 있습니다. 이러한 값은 values.yaml 파일에 지정하거나 사용자가 제공한 값 파일에 의해 재정의될 수도 있습니다. 그러면 Helm 설치 또는 업그레이드 중에 --set 매개 변수에 의해 재정의될 수 있습니다.

이 예제에서는 다음 인수를 전달합니다.

--set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId)

$(imageRepoName)의 값은 변수 페이지(또는 YAML 파일의 변수 섹션)에서 설정되었습니다. 또는 --set 인수 값 또는 values.yaml 파일에서 이미지 리포지토리 이름으로 직접 바꿀 수 있습니다. 예시:

  image:
    repository: VALUE_TO_BE_OVERRIDDEN
    tag: latest

또 다른 대안은 인수 값을 쉼표로 구분된 키-값 쌍으로 지정하도록 작업의 값 설정 옵션을 설정하는 것입니다.

앱을 배포하는 릴리스 만들기

이제 릴리스를 만들 준비가 되었습니다. 즉, 특정 빌드에서 생성된 아티팩트로 릴리스 파이프라인을 실행하는 프로세스를 시작합니다. 그러면 빌드가 배포됩니다.

  1. + 릴리스를 선택하고 릴리스 만들기를 선택합니다.

  2. 새 릴리스 만들기 패널에서 사용하려는 아티팩트 버전이 선택되어 있는지 확인하고 만들기를 선택합니다.

  3. 알림 표시줄 메시지에서 릴리스 링크를 선택합니다. 예를 들어 "Release-1 릴리스를 만들었습니다"를 선택합니다.

  4. 파이프라인 보기에서 파이프라인의 단계에서 상태 링크를 선택하여 로그 및 에이전트 출력을 확인합니다.