연습 - Azure DevOps 환경 설정

완료됨

이 섹션에서는 이 모듈의 나머지 부분을 계속 진행하도록 Azure DevOps 조직을 구성하고 애플리케이션을 배포할 AKS(Azure Kubernetes Service) 환경을 만듭니다.

이러한 목표를 달성하기 위해 다음을 수행합니다.

  • Azure DevOps 조직에 사용자를 추가합니다.
  • Azure DevOps 프로젝트를 설정합니다.
  • Azure Boards를 사용하여 작업 흐름을 관리합니다.
  • Azure CLI를 사용하여 Azure 리소스를 만듭니다.
  • Azure Pipelines에서 파이프라인 변수를 만듭니다.
  • Azure로 인증하려면 서비스 연결을 만듭니다.
  • Kubernetes 배포 매니페스트를 업데이트합니다.

조직에 사용자 추가

이 모듈을 완료하려면 Azure 구독이 필요합니다. Azure 평가판을 시작할 수 있습니다.

Azure DevOps를 사용할 필요는 없지만 Azure DevOps를 통해 Azure 리소스에 배포하려면 Azure 구독이 필요합니다. 프로세스를 더욱 간소화하려면 동일한 Microsoft 계정을 사용하여 Azure 구독과 Azure DevOps 조직에 모두 로그인합니다.

다른 Microsoft 계정을 사용하여 Azure 및 Azure DevOps에 로그인하는 경우 Azure 구독과 연결된 Microsoft 계정으로 DevOps 조직에 사용자를 추가하여 계속 진행할 수 있습니다. 자세한 내용은 조직 또는 프로젝트에 사용자 추가를 참조하세요. 사용자를 추가하는 경우 기본 액세스 수준을 선택합니다.

기본 액세스 수준으로 사용자를 추가한 후 Azure DevOps에서 로그아웃하고 Azure 구독과 연결된 Microsoft 계정을 사용하여 다시 로그인합니다.

Azure DevOps 프로젝트 가져오기

이 섹션에서는 템플릿을 실행하여 Azure DevOps에서 프로젝트를 만듭니다.

템플릿 실행

템플릿을 실행하여 이 모듈에 대한 Azure DevOps 프로젝트를 설정합니다.

Azure DevOps Demo Generator 포털에서 다음 단계를 수행하여 템플릿을 실행합니다.

  1. 로그인을 선택하고 사용 약관에 동의합니다.

  2. 새 프로젝트 만들기 페이지에서 Azure DevOps 조직을 선택하고 Space Game - 웹 - Kubernetes와 같은 프로젝트 이름을 제공합니다.

    Screenshot of the Azure DevOps Demo Generator showing the process to create the project.

  3. 예를 선택하고 이 리포지토리를 포크한 다음 권한을 부여합니다. 창이 나타나면 GitHub 계정에 액세스할 수 있는 권한을 부여합니다.

    중요

    템플릿이 GitHub 리포지토리에 연결되도록 하려면 이 옵션을 선택해야 합니다. 템플릿이 기존 포크를 사용하기 때문에 Space Game 리포지토리를 이미 포크한 경우에도 선택하세요.

  4. 프로젝트 만들기를 선택하고 템플릿 실행이 완료될 때까지 기다리며 몇 분 정도 걸릴 수 있습니다.

  5. 프로젝트로 이동을 선택하여 Azure DevOps의 해당 프로젝트에 액세스합니다.

중요

이 모듈의 Azure DevOps 환경 정리 단원에는 정리를 위한 중요한 단계가 포함되어 있습니다. 무료 빌드 시간(분)이 부족하지 않도록 하려면 이 단계를 수행하는 것이 좋습니다. 이 모듈을 마치지 않은 경우에도 정리 단계를 따르는 것은 중요합니다.

프로젝트의 표시 유형 설정

처음에는 GitHub의 Space Game 리포지토리 포크가 퍼블릭으로 설정되고 Azure DevOps 템플릿에서 만든 프로젝트는 프라이빗으로 설정됩니다. GitHub의 퍼블릭 리포지토리에는 누구나 액세스할 수 있으며, 프라이빗 리포지토리는 사용자와 공유하도록 선택한 사용자만 액세스할 수 있습니다. 마찬가지로 Azure DevOps에서 퍼블릭 프로젝트는 인증되지 않은 사용자에게 읽기 전용 액세스를 제공하는 반면, 프라이빗 프로젝트는 사용자에게 액세스 권한을 부여하고 서비스에 액세스하기 위해 인증을 받아야 합니다.

현재로서는 이 모듈의 목적을 위해 이러한 설정을 수정할 필요가 없습니다. 그러나 개인 프로젝트의 경우 다른 사용자에게 부여하려는 표시 유형 및 액세스를 결정해야 합니다. 예를 들어 프로젝트가 오픈 소스인 경우 GitHub 리포지토리와 Azure DevOps 프로젝트를 모두 퍼블릭 상태로 만들지 선택할 수 있습니다. 프로젝트가 재산적 가치를 가지는 경우 일반적으로 GitHub 리포지토리와 Azure DevOps 프로젝트를 모두 프라이빗 상태로 설정할 수 있습니다.

나중에 프로젝트에 가장 적합한 옵션을 결정하는 데 도움이 되는 다음과 같은 리소스를 찾을 수 있습니다.

작업 항목을 실행 중으로 이동

이 단계에서는 Azure Boards에서 자신에게 작업 항목을 할당하고 작업 상태로 이동합니다. 실제 시나리오에서, 사용자와 팀은 각 스프린트 또는 작업 반복이 시작될 때 작업 항목을 만듭니다.

작업 항목을 할당하면 작업할 검사 목록을 제공하고 다른 팀 구성원에게 진행 상황 및 남은 작업에 대한 가시성을 제공합니다. 또한 작업 진행 중(WIP) 제한을 적용하여 팀이 한 번에 너무 많은 작업을 수행하지 않도록 할 수도 있습니다.

  1. Azure DevOps에서 Boards로 이동한 다음, 메뉴에서 Boards를 선택합니다.

    Screenshot of Azure DevOps showing the location of the Boards menu.

  2. Kubernetes로 오케스트레이션된 다중 컨테이너 버전의 웹 사이트 만들기 작업 항목을 자신에게 할당하려면 카드 아래쪽에 있는 아래쪽 화살표를 선택합니다.

    Screenshot of Azure Boards showing the location of the down arrow.

  3. 작업 항목을 할 일 열에서 실행 중 열로 끌어다 놓습니다. 작업을 완료한 후 이 모듈의 끝에 있는 완료 열로 이동합니다.

    Screenshot of Azure Boards showing the card in the Doing column.

Azure Kubernetes Service 환경 만들기

이 단계에서는 웹 사이트의 새 컨테이너 버전을 배포하는 데 필요한 Azure Kubernetes Service 리소스를 만듭니다.

이전 모듈인 Azure Pipelines를 사용하여 릴리스 파이프라인 만들기에서 Azure Portal을 사용하여 Azure 리소스를 만들었습니다. 포털은 Azure 기능을 탐색하고 기본 작업을 수행하는 데 유용하지만 Azure Kubernetes Service와 같은 구성 요소를 만드는 데는 시간이 많이 걸릴 수 있습니다.

이 모듈에서는 Azure CLI를 사용하여 Azure Kubernetes Service에서 애플리케이션을 배포하고 실행하는 데 필요한 리소스를 만듭니다. 터미널에서 또는 Visual Studio Code를 통해 Azure CLI에 액세스할 수 있습니다. 그러나 이 모듈에서는 Azure Cloud Shell에서 Azure CLI에 액세스합니다. Cloud Shell은 클라우드에서 호스트되는 브라우저 기반 셸 환경으로, Azure 구독에 사용하기 위해 Azure CLI를 사용하여 미리 구성됩니다.

중요

이 모듈의 연습을 완료하려면 자체 Azure 구독이 필요합니다.

Cloud Shell 시작

  1. Azure Portal로 이동하여 로그인합니다.

  2. 메뉴에서 Cloud Shell 옵션을 선택한 다음, 메시지가 표시되면 Bash 환경을 선택합니다.

    Screenshot of the Azure portal showing the location of the Cloud Shell menu item.

참고 항목

Cloud Shell에서 생성한 파일을 유지하려면 Cloud Shell에 Azure Storage 리소스가 필요합니다. Cloud Shell을 처음 열면 리소스 그룹, 스토리지 계정 및 Azure Files 공유를 만들라는 프롬프트가 표시됩니다. 해당 설정은 이후의 모든 Cloud Shell 세션에 자동으로 사용됩니다.

Azure 지역 선택

지역은 지리적 영역에 있는 하나 이상의 Azure 데이터 센터를 나타냅니다. 미국 동부, 미국 서부 및 북유럽과 같은 지역이 이러한 영역의 예입니다. App Service 인스턴스를 비롯한 각 Azure 리소스에는 지역이 연관됩니다.

명령 실행을 간소화하려면 기본 지역으로 설정하여 시작하세요. 기본 지역을 설정하면 다른 지역을 명시적으로 지정하지 않는 한 후속 명령은 기본적으로 해당 지역을 사용합니다.

  1. Cloud Shell에서 다음 명령을 실행하여 Azure 구독에서 사용할 수 있는 지역을 나열합니다.

    az account list-locations \
      --query "[].{Name: name, DisplayName: displayName}" \
      --output table
    
  2. 지리적으로 가까운 출력의 이름 열에서 지역을 선택합니다. 예를 들어 eastasia 또는 westus2를 선택할 수 있습니다.

  3. 다음 명령을 실행하여 기본 지역을 설정합니다. REGION을 이전에 선택한 영역의 이름으로 바꿉니다.

    az configure --defaults location=<REGION>
    

    이 예에서는 westus2를 기본 지역으로 설정합니다.

    az configure --defaults location=westus2
    

Bash 변수 만들기

Bash 변수를 사용하면 설정 프로세스의 편리성을 높이고 오류를 줄일 수 있습니다. 이 방법은 공유 텍스트 문자열을 스크립트 전체에서 사용할 수 있는 변수로 정의하여 실수로 오탈자가 입력되지 않도록 하는데 도움이 됩니다.

  1. 다음 단계에서 특정 서비스에 대해 전역적으로 고유한 이름을 만들기를 간소화하려면 Cloud Shell에서 난수를 생성합니다.

    resourceSuffix=$RANDOM
    
  2. Azure Container Registry 및 Azure Kubernetes Service 인스턴스에 대한 전역적으로 고유한 이름을 만듭니다. 이러한 명령은 인라인 구문을 사용하여 변수를 보간하도록 Bash에 지시하는 큰따옴표를 사용합니다.

    registryName="tailspinspacegame${resourceSuffix}"
    aksName="tailspinspacegame-${resourceSuffix}"
    
  3. 다른 Bash 변수를 만들어 리소스 그룹의 이름을 저장합니다.

    rgName='tailspin-space-game-rg'
    
  4. 최신 AKS 버전을 찾습니다.

    az aks get-versions
    

    최신 버전을 기록해 둡다.

Azure 리소스 만들기

참고

이 자습서에서는 기본 네트워크 설정이 학습 목적으로 사용됩니다. 이러한 설정을 사용하면 인터넷에서 웹 사이트에 액세스할 수 있습니다. 그러나 실제로는 인터넷 라우팅이 불가능하고 사용자와 팀에서만 액세스할 수 있는 네트워크에 웹 사이트를 배치하는 Azure 가상 네트워크를 구성할 수 있습니다. 나중에 사용자가 웹 사이트를 사용할 수 있도록 네트워크를 다시 구성할 수 있습니다.

  1. 다음과 같이 명령을 실행하여 앞에서 정의된 이름을 사용하여 리소스 그룹을 만듭니다.

    az group create --name $rgName
    
  2. az acr create 명령을 실행하여 앞에서 정의된 이름을 사용하여 Azure Container Registry를 만듭니다.

    az acr create \
      --name $registryName \
      --resource-group $rgName \
      --sku Standard
    
  3. az aks create 명령을 실행하여 이전에 정의한 이름으로 AKS 인스턴스를 만듭니다. 앞에서 설명한 버전으로 바꿉 <latest-AKS-version> 다.

    az aks create \
      --name $aksName \
      --resource-group $rgName \
      --enable-addons monitoring \
      --kubernetes-version <latest-AKS-version> \
      --generate-ssh-keys
    

    참고 항목

    AKS 배포를 완료하는 데 10~15분이 걸릴 수 있습니다.

  4. AKS 인스턴스에 대해 구성된 서비스 주체의 ID를 저장할 변수를 만듭니다.

    clientId=$(az aks show \
      --resource-group $rgName \
      --name $aksName \
      --query "identityProfile.kubeletidentity.clientId" \
      --output tsv)
    
  5. Azure Container Registry의 ID를 저장할 변수를 만듭니다.

    acrId=$(az acr show \
      --name $registryName \
      --resource-group $rgName \
      --query "id" \
      --output tsv)
    
  6. az acr list 명령을 실행하여 ACR(Azure Container Registry) 인스턴스에 대한 로그인 서버 URL을 검색합니다.

    az acr list \
     --resource-group $rgName \
     --query "[].{loginServer: loginServer}" \
     --output table
    

    컨테이너 레지스트리에 대한 로그인 서버를 기록해 두세요. 파이프라인을 구성할 때 나중에 이 정보가 필요합니다. 예를 들면 다음과 같습니다.

    LoginServer                      
    --------------------------------
    tailspinspacegame4692.azurecr.io
    
  7. az role assignment create 명령을 실행하여 다음과 같이 AKS 클러스터에 Azure Container Registry에 연결할 수 있는 권한을 부여하는 역할 할당을 만듭니다.

    az role assignment create \
      --assignee $clientId \
      --role AcrPull \
      --scope $acrId
    

중요

이 모듈의 Azure DevOps 환경 정리 단원에는 정리를 위한 중요한 단계가 포함되어 있습니다. 무료 빌드 시간(분)이 부족하지 않도록 이러한 단계를 수행하는 것이 좋습니다. 이 모듈을 완료하지 않더라도 클린 단계를 수행하는 것이 중요합니다.

변수 그룹 만들기

이 섹션에서는 Azure Container Registry의 이름을 저장하는 변수를 파이프라인에 추가합니다. 파이프라인 구성에서 Azure Container Registry 인스턴스의 이름을 변수로 정의하는 것이 하드 코딩에 권장됩니다. 이렇게 하면 구성을 더 재사용할 수 있으며 인스턴스 이름이 변경되는 경우 구성을 수정하지 않고도 변수를 쉽게 업데이트하고 파이프라인을 트리거할 수 있습니다.

  1. Azure DevOps 조직에 로그인한 다음 프로젝트로 이동합니다.

  2. [파이프라인]을 선택한 다음, 왼쪽 탐색 창에서 [라이브러리]를 선택합니다.

    Screenshot of Azure Pipelines showing the Library menu option.

  3. 변수 그룹 선택한 다음, + 변수 그룹을 선택하여 새 변수 그룹을 추가합니다.

  4. 속성 섹션에서 변수 그룹 이름으로 릴리스를 입력합니다.

  5. 변수 섹션에서 [추가]를 선택합니다.

  6. 변수 이름에 RegistryName을 입력하고 값에 tailspinspacegame4692.azurecr.io 같은 Azure Container Registry의 로그인 서버를 입력합니다.

  7. 페이지 상단에서 [저장]을 선택하여 변수를 파이프라인에 저장합니다. 변수 그룹의 형태에 대한 예시입니다.

    Screenshot of Azure Pipeline showing the variable group. The group contains one variable.

서비스 연결 만들기

다음 단계로 Azure Pipelines에서 Azure Container Registry 및 Azure Kubernetes Service 인스턴스에 액세스할 수 있도록 허용하는 서비스 연결을 만듭니다. Azure Pipelines는 이러한 서비스 연결을 만들어 컨테이너를 푸시하고 AKS 클러스터에 컨테이너를 끌어와 배포된 서비스를 업데이트하도록 지시합니다.

Important

동일한 Microsoft 계정으로 Azure Portal 및 Azure DevOps에 로그인했는지 확인합니다.

Docker 레지스트리 서비스 연결 만들기

  1. Azure DevOps 조직에 로그인한 다음 프로젝트로 이동합니다.

  2. 페이지 하단 모서리에서 프로젝트 설정을 선택합니다.

  3. Pipelines 섹션에서 서비스 연결을 선택합니다.

  4. 새 서비스 연결, Docker 레지스트리, 다음을 차례로 선택합니다.

  5. 페이지 위쪽에서 Azure Container Registry를 선택한 다음, 인증 유형으로 서비스 주체를 선택합니다.

  6. 각 설정에 다음 값을 입력합니다.

    설정
    Subscription Azure 구독
    Azure Container Registry 앞서 만든 서비스 연결 선택
    서비스 연결 이름 컨테이너 레지스트리 연결
  7. 모든 파이프라인에 대한 액세스 권한 부여 확인란이 선택되어 있는지 확인합니다.

  8. 완료되면 저장을 선택합니다.

ARM 서비스 연결 만들기

이제 AKS 클러스터를 사용하여 인증할 Azure Resource Manager 서비스 연결을 만듭니다. Kubernetes 1.24 이후 더 이상 수명이 긴 토큰이 기본적으로 만들어지지 않으므로 Kubernetes 대신 ARM 서비스 연결을 사용합니다. 자세한 내용은 DevOps 블로그 게시물을 확인하세요. Kubernetes 작업을 사용하는 AKS 고객을 위한 서비스 연결 지침.

  1. 새 서비스 연결, Azure Resource Manager, 다음을 차례로 선택합니다.

  2. 서비스 주체(자동)를 선택한 다음, 다음을 선택합니다.

  3. 범위 수준에 대한 구독을 선택합니다.

  4. 각 설정에 다음 값을 입력합니다.

    설정
    Subscription Azure 구독
    Resource group 앞서 만든 서비스 연결 선택
    서비스 연결 이름 Kubernetes 클러스터 연결
  5. 모든 파이프라인에 대한 액세스 권한 부여 확인란이 선택되어 있는지 확인합니다.

  6. 완료되면 저장을 선택합니다.

파이프라인 환경 만들기

  1. 파이프라인을 선택한 다음, 환경을 선택합니다.

    Screenshot of Azure Pipelines showing the Environments menu option.

  2. 환경 만들기를 선택하여 새 환경을 만듭니다.

  3. 이름 필드에서 Dev를 입력합니다.

  4. 리소스 섹션에서 없음을 선택한 다음, 만들기를 선택하여 파이프라인 환경을 만듭니다.

Kubernetes 배포 매니페스트 업데이트

이 섹션에서는 이전에 만든 컨테이너 레지스트리를 가리키도록 Kubernetes 매니페스트 deployment.yml 업데이트합니다.

  1. GitHub 계정으로 이동하여 mslearn-tailspin-spacegame-web-kubernetes 모듈에 대해 포크한 리포지토리를 선택합니다.

  2. 편집 모드의 manifests/deployment.yml에서 파일을 엽니다.

    Screenshot of GitHub showing the location of the edit mode icon.

  3. ACR 로그인 서버를 사용하도록 컨테이너 이미지 참조를 변경합니다. 다음 매니페스트에서는 tailspinspacegame2439.azurecr.io를 예제로 사용합니다.

    apiVersion : apps/v1
    kind: Deployment
    metadata:
      name: web
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: web
      template:
        metadata:
          labels:
            app: web
        spec:
          containers:
            - name: web
              image: tailspinspacegame4692.azurecr.io/web
              ports:
              - containerPort: 80
    
    apiVersion : apps/v1
    kind: Deployment
    metadata:
      name: leaderboard
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: leaderboard
      template:
        metadata:
          labels:
            app: leaderboard
        spec:
          containers:
            - name: leaderboard
              image: tailspinspacegame4692.azurecr.io/leaderboard
              ports:
              - containerPort: 80
    
  4. main 분기에 대한 변경 내용을 커밋합니다.