연습 - AKS에 배포하는 GitHub 작업 만들기

완료됨

이 연습에서는 다음 작업을 완료합니다.

  • 배포 작업을 포함하도록 기존 GitHub 작업을 개선합니다.
  • 변경 내용이 AKS(Azure Kubernetes Service) 클러스터에 배포되는지 확인합니다.
  • 배포를 롤백합니다.

제품 서비스에 대한 Kubernetes 매니페스트 업데이트

새 버전의 eShop 제품 서비스를 배포하려면 이전 단원에서 사용한 ACR(Azure Container Registry)을 가리키도록 product.yml 파일을 편집합니다.

  1. 포크된 리포지토리에서 code tab을 선택한 다음, product.yml 파일을 선택합니다.

  2. 파일을 편집하려면 편집 아이콘(연필)을 선택합니다.

  3. 줄을 편집합니다.

    containers:
      - image: [replace with your ACR name].azurecr.io/productservice:latest
    

    [replace with your ACR name]을 ACR의 이름으로 바꿉니다. 예: acseshop186748394.

  4. 오른쪽 위에서 변경 내용 커밋...을 선택한 다음 대화 상자에서 변경 내용 커밋을 선택합니다.

배포 작업 만들기

YAML 코드는 다음과 같은 GitHub 단계를 추가합니다.

새 이미지를 배포하는 한 단계가 있습니다. ubuntu-latest 실행기 단계는 다음과 같습니다.

  1. 이 파일이 있는 리포지토리를 확인합니다.
  2. Azure 로그인에서 서비스 주체 자격 증명을 사용하여 Azure에 로그인합니다.
  3. 비대화형 로그인에 대한 kubelogin 설정은 Azure 인증에 대한 kubeconfig 파일을 구성합니다.
  4. K8s 컨텍스트 가져오기 설정 컨텍스트는 실행기 .kube/config 파일에서 AKS(Azure Kubernetes Service) 자격 증명을 설정합니다.
  5. 애플리케이션 배포 이전 단계에서 빌드된 이미지와 이전에 편집한 Kubernetes 매니페스트 파일을 사용하여 애플리케이션을 AKS에 배포합니다.

다음 단계를 완료하여 쿠폰 서비스를 배포하는 GitHub 작업을 만듭니다.

  1. 포크된 리포지토리의 code tab에서 .github/workflows 탭을 선택합니다.

  2. azure-kubernetes-service.yml를 선택합니다.

  3. 파일을 편집하려면 편집 아이콘(연필)을 선택합니다.

  4. 파일 맨 아래에 다음 YAML 코드를 편집기에 붙여넣습니다.

    
      deploy:
        permissions:
          actions: read
          contents: read
          id-token: write
        runs-on: ubuntu-latest
        needs: [buildImage]
        steps:
          # Checks out the repository this file is in
          - uses: actions/checkout@v3
    
          # Logs in with your Azure credentials
          - name: Azure login
            uses: azure/login@v1.4.6
            with:
              creds: '${{ secrets.AZURE_CREDENTIALS }}'
    
          # Use kubelogin to configure your kubeconfig for Azure auth
          - name: Set up kubelogin for non-interactive login
            uses: azure/use-kubelogin@v1
            with:
              kubelogin-version: 'v0.0.25'
    
          # Retrieves your Azure Kubernetes Service cluster's kubeconfig file
          - name: Get K8s context
            uses: azure/aks-set-context@v3
            with:
              resource-group: ${{ env.RESOURCE_GROUP }}
              cluster-name: ${{ env.CLUSTER_NAME }}
              admin: 'false'
              use-kubelogin: 'true'
    
          # Deploys application based on given manifest file
          - name: Deploys application
            uses: Azure/k8s-deploy@v4
            with:
              action: deploy
              manifests: ${{ env.DEPLOYMENT_MANIFEST_PATH }}
              images: |
                ${{ env.AZURE_CONTAINER_REGISTRY }}.azurecr.io/${{ env.CONTAINER_NAME }}:${{ github.sha }}
              pull-images: false
    
    
  5. 오른쪽 위에서 변경 내용 커밋...을 선택한 다음 대화 상자에서 변경 내용 커밋을 선택합니다.

배포 트리거

azure-kubernetes-service.yml 파일을 업데이트하고 변경 내용을 커밋하면 다른 배포가 자동으로 트리거됩니다. 이제 코드 변경을 통해 다른 배포를 트리거하는 방법을 알아보세요.

마케팅 팀이 카탈로그에 추가하려는 새 제품이 있습니다.

  1. 포크된 리포지토리의 code tab에서 Products 폴더를 선택합니다.

  2. Data 폴더를 선택합니다.

  3. ProductDataContext.c 파일을 선택합니다.

  4. 파일을 편집하려면 편집 아이콘(연필)을 선택합니다.

  5. 파일 맨 아래에 제품 배열에 새 제품을 추가합니다.

    new Product {  Name = "Camping Tent 2", Description = "This updated tent is improved and cheaper, perfect for your next trip.", Price = 79.99m, ImageUrl = "product9.png" },
    
  6. 오른쪽 위에서 변경 내용 커밋...을 선택한 다음 대화 상자에서 변경 내용 커밋을 선택합니다.

배포 모니터링

  1. 배포 진행률을 모니터링하려면 Actions 탭을 선택합니다.

  2. Build and deploy an app to AKS 워크플로에 나열된 가장 최근의 워크플로 실행을 선택합니다. 실행의 이름은 이전 단계에서 사용된 커밋 메시지입니다.

  3. 이 워크플로 실행에 대한 세부 정보를 보려면 deploy 작업을 선택합니다.

    Screenshot that shows the deploy job selected with a list of all the steps.

  4. 터미널에서 다음 명령을 실행하여 AKS 클러스터에서 쿠폰 서비스 Pod를 모니터링합니다. --selector 플래그는 쿠폰 서비스의 Pod로만 목록을 필터링하고 --watch 플래그는 kubectl에 변경 내용을 감시하도록 지시합니다.

    kubectl get pods --selector=app=productservice --watch
    

    배포하는 동안 다음과 같은 출력의 변형이 나타납니다.

    NAME                             READY   STATUS    RESTARTS   AGE
    productservice-7979d4c47-xlcrr   1/1     Running   0          17m
    productservice-ff98b6d8d-7wmsh   0/1     Pending   0          0s
    productservice-ff98b6d8d-7wmsh   0/1     Pending   0          0s
    productservice-ff98b6d8d-7wmsh   0/1     ContainerCreating   0          0s
    productservice-ff98b6d8d-7wmsh   1/1     Running             0          4s
    productservice-7979d4c47-xlcrr   1/1     Terminating         0          19m
    

    이전 출력에서는 새 productservice Pod가 생성됩니다. 새 Pod가 준비되면 이전 Pod는 종료됩니다. 이 프로세스를 사용하면 새 버전으로 원활하게 전환할 수 있습니다.

앱 확인

다음 단계를 완료하여 앱이 계속 작동하는지 확인합니다.

  • 터미널에서 다음 명령을 실행하여 배포된 eShop을 봅니다.

    echo "http://$(kubectl get services --namespace ingress-nginx ingress-nginx-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    

    위 명령은 웹앱의 외부 IP 주소를 반환합니다. CTRL을 누른 채 링크를 선택하면 새 탭에서 앱이 열립니다.

제품 페이지로 이동하여 페이지 아래쪽에 나열된 새 텐트를 봅니다.

배포 롤백

프로덕션 문제에 대한 일반적인 완화 방법 중 하나는 배포를 알려진 양호한 배포로 되돌리는 것입니다. Kubernetes는 이전 버전의 앱으로 롤백하는 데 사용할 수 있는 배포 기록을 유지 관리합니다.

터미널에서 이 명령을 실행하여 웹 사이트에 방금 추가한 새 텐트를 제거합니다.

kubectl rollout undo deployment/productservice

이 콘솔 메시지가 표시됩니다.

deployment.apps/productservice rolled back

브라우저에서 제품 페이지를 새로 고치면 새 텐트가 더 이상 나열되지 않습니다.

참고 항목

실제 시나리오에서는 빌드의 아티팩트가 여러 환경에 배포됩니다. 예를 들어 개발, 테스트 및 스테이징 환경이 있을 수 있습니다. PR 병합과 같은 이벤트로 배포 워크플로를 트리거할 수 있습니다. 관련자의 PR 승인과 같은 품질 또는 승인 게이트를 추가하여 프로덕션에 예기치 않은 배포를 방지할 수 있습니다.

지식 점검

1.

GitHub Actions에 대한 자격 증명과 같은 중요한 정보를 저장하기에 가장 좋은 위치는 무엇인가요?

2.

GitHub Actions에서 사용할 Azure Active Directory 서비스 주체를 만드는 목적은 무엇인가요?

3.

업그레이드 배포 중에 이전 컨테이너가 계속 실행되는 동안 AKS가 새 컨테이너를 만드는 이유는 무엇인가요?