연습 - Kubernetes 클러스터에 다중 컨테이너 솔루션 배포
프로젝트와 함께 제공되는 릴리스 파이프라인은 솔루션을 Docker 컨테이너로 빌드하고 Azure App Service에 배포하도록 설계되었습니다. Kubernetes 클러스터에 여러 컨테이너 배포를 지원하려면 이 파이프라인을 수정해야 합니다.
이 단원에서 학습할 내용은 다음과 같습니다.
- 메인 브랜치에 커밋될 때 트리거하도록 파이프라인을 업데이트합니다.
- 파이프라인 전체에서 공유할 변수를 정의합니다.
- Docker 이미지를 빌드하고 게시합니다.
- Kubernetes 매니페스트를 게시합니다.
- Kubernetes와 컨테이너 레지스트리 인스턴스 간에 사용할 이미지 끌어오기 비밀을 만드는 작업을 추가합니다.
- Kubernetes 클러스터에 업데이트된 이미지를 배포합니다.
트리거를 지원하도록 파이프라인 업데이트
Azure DevOps 조직에 로그인한 다음 프로젝트로 이동합니다.
파이프라인을 선택한 다음, 원하는 파이프라인을 선택합니다.
편집을 선택하여 azure-pipelines.yml 편집합니다.
앤디: 이전 단일 컨테이너 솔루션에 대해 준비한 빌드 단계였습니다. 제대로 실행되지 않을 것이라는 것을 알았기 때문에 사용하지 않도록 설정했습니다.
main브랜치에 대한 커밋 시 트리거를 다시 활성화하여 시작할 수 있습니다.파일 맨 위에 있는 기존
trigger줄을 다음 코드 조각으로 바꿉다. 메인 브랜치에 커밋이 이루어질 때마다 파이프라인 실행이 트리거됩니다.trigger: - 'main'
파이프라인에서 액세스할 수 있는 변수 정의
앤디: 두 개의 파이프라인 변수를 추가해야 합니다. 순위표 리포지토리의 이름( 순위표)을 지정하기 위한 것입니다. 다른 하나는 배포 중에 AKS와 ACR 인스턴스 간에 공유하는 데 사용되는 이미지 끌어오기 비밀의 이름입니다.
섹션에 강조 표시된 다음 코드를 추가합니다
variables.variables: buildConfiguration: 'Release' leaderboardRepository: 'leaderboard' webRepository: 'web' tag: '$(Build.BuildId)' imagePullSecret: 'secret'
Azure Container Registry에 Docker 이미지 빌드 및 게시
앤디: 컨테이너 레지스트리에 게시하는 Docker 컨테이너로 웹앱을 빌드하는 작업이 이미 있습니다. 두 번째 작업을 사용하여 순위표에 대해 동일한 작업을 수행할 수 있습니다.
강조 표시된 다음 코드 조각을 사용하여 순위표 컨테이너를 빌드하고 게시하는 두 번째
Docker@2작업을 추가합니다. 웹 컨테이너 작업 바로 뒤 이 작업을 추가합니다.- task: Docker@2 displayName: 'Build and push the web image to container registry' inputs: command: buildAndPush buildContext: $(Build.Repository.LocalPath) repository: $(webRepository) dockerfile: '$(Build.SourcesDirectory)/Tailspin.SpaceGame.Web/Dockerfile' containerRegistry: 'Container Registry Connection' tags: | $(tag) - task: Docker@2 displayName: 'Build and push the leaderboard image to container registry' inputs: command: buildAndPush buildContext: $(Build.Repository.LocalPath) repository: $(leaderboardRepository) dockerfile: '$(Build.SourcesDirectory)/Tailspin.SpaceGame.LeaderboardContainer/Dockerfile' containerRegistry: 'Container Registry Connection' tags: | $(tag)
팁 (조언)
여기서 추가하는 작업이 YAML 파일에서 공백이 중요하기 때문에 이전 작업과 일관된 들여쓰기를 사용하는지 확인합니다.
Kubernetes 매니페스트 게시
앤디: 나는 우리가 다음 단계로 이동할 수 있다고 생각합니다. 누락된 항목이 있습니까?
마라: 배포를 정의하는 일부 매니페스트 파일과 배포 시 Kubernetes에 필요한 서비스가 있다고 언급했습니다. 이 단계를 완료하기 전에 게시해야 합니다.
앤디: 필요할까요? 여전히 로컬 디스크에 있지 않나요?
마라: 빌드와 동일한 단계 내에 배포 작업을 추가하는 경우입니다. 그러나 배포 작업은 자체 배포 단계에서 수행되므로 다른 에이전트에서도 새로운 환경에서 실행됩니다. 우리는 이 단계가 생성하는 것으로 다른 단계가 필요로 하는 모든 것을 공개해야 합니다.
앤디: 그것은 좋은 포인트입니다. 쉽게 할 수 있나요? 매니페스트 폴더가 새 에이전트에 복사되었는지 확인해야 합니다.
Mara: 그게 PublishBuildArtifacts@1 바로 이 작업의 대상입니다. 너무 흔해서 약어도 있을 정도입니다 publish.
publish다음 코드 조각과 같이 이후 단계에 대한 매니페스트 폴더를 저장하는 작업을 추가합니다. 이 작업의 들여쓰기가 이전 작업의 들여쓰기와 일치하도록 확인하세요.- task: Docker@2 displayName: 'Build and push the leaderboard image to container registry' inputs: command: buildAndPush buildContext: $(Build.Repository.LocalPath) repository: $(leaderboardRepository) dockerfile: '$(Build.SourcesDirectory)/Tailspin.SpaceGame.LeaderboardContainer/Dockerfile' containerRegistry: 'Container Registry Connection' tags: | $(tag) - publish: '$(Build.SourcesDirectory)/manifests' artifact: manifests
배포 단계 바꾸기
마라: 기존 배포 단계를 배포 작업을 사용하는 단계로 바꾸겠습니다. 배포 작업은 배포를 이전에 만든 Azure DevOps 환경과 연결할 수 있는 특별한 종류의 작업입니다. 이렇게 하면 배포 기록을 더 쉽게 추적할 수 있으며, 솔루션이 더욱 정교해짐에 따라 특히 유용합니다.
기존 배포 단계(빌드 단계 이후의 모든 단계)를 제거하고 다음 코드 조각으로 바꿉니다. 사용할 배포 환경을 나타내는 강조 표시된 줄을 기록해 둡다.
- stage: 'Deploy' displayName: 'Deploy the containers' dependsOn: Build jobs: - deployment: Deploy displayName: Deploy pool: vmImage: 'ubuntu-20.04' environment: 'Dev' variables: - group: Release strategy: runOnce: deploy: steps:마라: 배포 단계에서 우리가 추가할 첫 번째 작업은
DownloadBuildArtifacts@0작업을 사용하여 이전에 게시된 매니페스트 아티팩트를 다운로드하는 것입니다.앤디: 추측해보죠, 그 작업에 대한 약식이 있습니까?
download마라: 정확히 맞습니다! 우리는
current지정자를 사용하여 현재 파이프라인 실행에서 아티팩트를 가져오도록 나타낼 수 있습니다.강조 표시된 줄을 배포 단계의 첫 번째 단계로 추가합니다.
- stage: 'Deploy' displayName: 'Deploy the containers' dependsOn: Build jobs: - deployment: Deploy displayName: Deploy pool: vmImage: 'ubuntu-20.04' environment: 'spike.default' variables: - group: Release strategy: runOnce: deploy: steps: - download: current artifact: manifests앤디: 이제 ACR 인스턴스와 AKS 인스턴스 간에 공유될 이미지 끌어오기 비밀을 만들어야 합니다. 사용할 수 있는 작업이 있는지 알고 있나요?
마라: 방금 그걸 찾아봤어요, 운이 좋네요. 태스크는 필요한 비밀을 생성하기 위한 작업을 지원합니다.
Kubernetes 매니페스트 작업
Kubernetes 매니페스트 작업은 Kubernetes에 필요한 모든 일반 배포 작업을 관리하도록 설계되었습니다. 비밀을 만드는 것부터 이미지 배포에 이르기까지 다양한 옵션을 action 지원합니다. 이 경우 createSecret 작업은 다음 매개 변수와 함께 사용됩니다.
-
action는 실행할 기능을 나타냅니다. 이 경우createSecret공유 비밀을 만듭니다. -
connectionType는 사용할 서비스 연결의 유형을 지정합니다. 옵션: azureResourceManager 또는 kubernetesServiceConnection. -
secretName만들 비밀의 이름을 지정합니다. -
dockerRegistryEndpoint는 Azure Container Registry Services 연결의 이름을 지정합니다. -
azureSubscriptionConnection는 ARM Services 연결의 이름을 지정합니다. -
azureResourceGroup는 리소스 그룹의 이름을 지정합니다. -
kubernetesCluster는 AKS 클러스터의 이름을 지정합니다. -
namespace는 이 작업이 적용되는 Kubernetes 네임스페이스를 지정합니다.
파이프라인의 끝에 다음 코드 조각을 추가합니다. 리소스 그룹 이름과 클러스터 이름이 모두 이전에 만든 이름과 일치하는지 확인합니다. 이 작업의 들여쓰기가 다운로드 작업의 들여쓰기와 일치하는지 확인하세요.
- task: KubernetesManifest@1 displayName: Create imagePullSecret inputs: action: createSecret connectionType: azureResourceManager secretName: $(imagePullSecret) dockerRegistryEndpoint: 'Container Registry Connection' azureSubscriptionConnection: 'Kubernetes Cluster Connection' azureResourceGroup: 'tailspin-space-game-rg' kubernetesCluster: 'tailspinspacegame-24591' namespace: 'default'앤디: 마지막 단계는 Kubernetes 클러스터에 이미지 배포를 트리거하는 것입니다. 설명서에 따라 동일한 작업을 사용할 수 있지만 다른 작업과 매개 변수를 사용할 수 있는 것처럼 보입니다.
-
action는 실행할 기능을 나타냅니다. 이 경우deployAKS 클러스터에 배포합니다. -
connectionType는 사용할 서비스 연결의 유형을 지정합니다. 옵션: azureResourceManager 또는 kubernetesServiceConnection. -
azureSubscriptionConnection는 ARM Services 연결의 이름을 지정합니다. -
azureResourceGroup는 리소스 그룹의 이름을 지정합니다. -
kubernetesCluster는 AKS 클러스터의 이름을 지정합니다. -
namespace는 이 작업이 적용되는 Kubernetes 네임스페이스를 지정합니다. -
imagePullSecrets는 컨테이너 레지스트리에서 가져오는 데 필요한 비밀 목록을 지정합니다. -
containers는 배포할 컨테이너 이미지 목록을 지정합니다.
-
파이프라인의 끝에 다음 코드 조각을 추가합니다. 리소스 그룹 이름과 클러스터 이름이 모두 이전에 만든 이름과 일치하는지 확인합니다. 이 작업의 들여쓰기가 이전 작업과 일치하는지 확인하세요.
- task: KubernetesManifest@1 displayName: Deploy to Kubernetes cluster inputs: action: deploy connectionType: azureResourceManager azureSubscriptionConnection: 'Kubernetes Cluster Connection' azureResourceGroup: 'tailspin-space-game-rg' kubernetesCluster: 'tailspinspacegame-24591' namespace: 'default' manifests: | $(Pipeline.Workspace)/manifests/deployment.yml $(Pipeline.Workspace)/manifests/service.yml imagePullSecrets: | $(imagePullSecret) containers: | $(RegistryName)/$(webRepository):$(tag) $(RegistryName)/$(leaderboardRepository):$(tag)
파이프라인을 실행하세요.
페이지의 오른쪽 위 모서리에서 저장 을 선택합니다. 저장을 선택하여 커밋 메시지를 확인합니다.
실행을 선택하고 분기 이름을 확인한 다음 실행을 선택하여 파이프라인 실행을 트리거합니다.
파이프라인을 선택한 다음 파이프라인을 선택하여 파이프라인이 실행되면 로그를 봅니다.
파이프라인 실행이 완료되면 왼쪽 창에서 환경을 선택한 다음 개발 환경을 선택하여 배포 작업을 봅니다.
이제 배포된 웹앱 및 API 엔드포인트를 확인해 보겠습니다. 이렇게 하려면 웹 및 순위표 서비스 모두에 대한 외부 IP 주소를 가져와야 합니다.
Azure 포털로 이동하여 AKS 클러스터를 선택한 다음 서비스 및 인그레스를 선택합니다.
웹 서비스에 대한 외부 IP를 선택하여 AKS에서 사이트를 봅니다.
남겨 둔 Azure Portal 창으로 돌아가 외부 IP를 순위표 서비스용으로 복사합니다. 이 IP 주소는 순위표 API가 공개적으로 호스트되는 위치입니다.
다음 링크의 자리 표시자를 복사한 외부 IP로 바꿉니다. 브라우저에서
pageSize=10JSON 응답을 더 쉽게 볼 수 있도록 쿼리 매개 변수를 추가할 수도 있습니다. 새 브라우저 탭에서 다음과 같은 URL을 사용합니다.http://[IP]/api/Leaderboard?pageSize=10AKS 클러스터에서 호스트되는 순위표 API에서 원시 JSON 응답을 볼 수 있습니다. 이제 다른 애플리케이션에서 호출할 수 있는 REST API가 있습니다.
앤디: 정말 잘 나왔어요! Kubernetes를 사용하는 것이 더 광범위한 마이크로 서비스 전략을 채택하는 좋은 방법이 될 것이라고 생각합니다.