20231228 Azure DevOps를 활용하여 AKS에 Modern App 배포하기
- 1 1. Azure DevOps에 Backlog 등록하기
- 1.1 1,1 프로젝트 생성하기
- 1.2 1.2 Backlog 등록하기
- 2 2. Backlog 구현하기
- 2.1 2.1 소스 준비하기
- 2.2 2.2 App 빌드 및 검증하기
- 2.3 2.3 Docker Build 및 검증하기
- 2.3.1 Azure Container Registry 생성
- 2.3.2 Docker Build
- 2.4 2.4 이미지 ACR로 푸시하기
- 2.5 Docker Tag$
- 2.6 2.5 AKS 클러스터 배포하기
- 2.7 2.6 AKS-ACR 통합하기
- 2.8 2.7 Modern App 샘플 준비하기
- 2.9 2.8 서비스 커넥션 구성하기
- 2.10 2.9 CI 파이프라인 구성하기
- 2.10.1 CI 파이프라인 설명
- 2.10.1.1 Trigger
- 2.10.1.2 Maven 빌드
- 2.10.1.3 Docker 빌드, 태그 및 푸시
- 2.10.1.4 YAML 파일 태그 정보 업데이트
- 2.10.1.5 빌드 Artifact 게시
- 2.10.1 CI 파이프라인 설명
- 2.11 2.10 CD 파이프라인 구성하기
- 2.12 2.11 CI/CD 검증하기
- 3 3. Backlog 완료하기
1. Azure DevOps에 Backlog 등록하기
Azure DevOps에 다음 Backlog를 등록한다.
Epic | Issue | Task | Description |
Azure DevOps를 활용하여 AKS에 | 로컬 환경 작업 | 소스 준비하기 | Spring Boot 샘플 소스를 로컬로 git clone 한다. |
App Build 및 검증하기 | Maven Build 후 애플리케이션의 동작을 검증한다. | ||
Docker Build 및 검증하기 | 검증된 애플리케이션을 doker build 후 생성된 이미지에 대하여 동작을 검증한다. | ||
이미지 ACR로 푸시하기 | 검증된 이미지를 ACR로 태그/푸시한다. | ||
Azure Resource 작업 | AKS 클러스터 배포하기 | Modern App이 배포 될 대상 AKS 클러스터를 생성한다. | |
ACR 배포하기 | Containerized App을 관리할 Container Repository를 생성한다. | ||
AKS-ACR 통합하기 | AKS의 Pod에서 ACR의 이미지를 Pull 할 수 있도록 Attatch 한다. | ||
Azure DevOps 작업 | Modern App 샘플 준비하기 | Containerized된 Spring Boot 샘플 소스를 Azure Repos에 Import 한다. | |
서비스 커넥션 구성하기 | Azure Resource가 위치하는 Azure 구독에 대해 ACR, AKS 등의 서비스 커넥션을 생성 및 구성한다. | ||
CI 파이프라인 구성하기 | CI 파이프라인을 생성 및 구성한다. | ||
CD 파이프라인 구성하기 | CD 파이프라인을 생성 및 구성한다. | ||
CI/CD 검증하기 | 소스 변경을 수행하여 구성한 CI/CD 파이프라인이 정상적으로 동작하는지 검증한다. |
1,1 프로젝트 생성하기
먼저 Azure DevOps에서 프로젝트를 생성한다.
Project name : DeployContApp2AKS
Visibility : 기본값
1.2 Backlog 등록하기
Boards > Backlogs를 클릭하고 Work Item 타입을 Epic으로 선택 후 + New Work Item을 클릭한다.
Epic 란에 "Azure DevOps를 활용하여 AKS에 Modern App 배포" 라고 입력 후 Add to top을 클릭한다.
Backlog는 Work items나 Boards 화면을 통해서도 등록 가능하다. 여기서는 Scrum 프로세스의 취지를 살려 플래닝 하여 도출한 Backlog에 대하여 각각 Epic, Issue, Tasks 순서로 등록하는 것을 기준으로 한다. |
생성한 Epic의 좌측에 를 클릭하면 Issue 등록 창으로 전환하게 된다.
위에서 정의한 Backlog 중 첫 번째 Issue를 입력하고 Save & Close를 클릭한다.
이제 화면은 다음과 같은 모습이 된다.
생성한 Issue의 좌측에 +를 클릭하면 Task 등록 창으로 전환하게 된다.
위에서 정의한 Backlog 중 "로컬 환경 작업" Issue의 첫 Task명을 입력하고 Description을 입력한 후 Save & Close를 클릭한다.
현재 순서대로 Backlog를 등록하면 Epic과 Issue 등록 화면 각각의 우측 하단에 다음과 같이 Work(일감)에 대한 링크가 구성된다. |
이제 화면은 다음과 같은 모습이 된다.
생성한 Issue (로컬 환경 작업)의 좌측에 + 를 클릭하여 반복 과정을 통해 추가 Task를 등록한다.
등록 후 화면은 다음과 같다.
다시 생성한 Epic의 좌측에 + 를 클릭 후 위 과정을 반복하여 정의했던 Backlog (Issue 및 Task)를 등록한다.
모든 Backlog가 등록된 후의 최종 화면은 다음과 같다.
참고로 Boards 화면에서 전시되는 모습은 다음과 같다.
2. Backlog 구현하기
이제 첫 번째 Issue를 Doing으로 이동 후 Backlog(또는 일감)를 구현해 나간다. 각 일감마다 처리 완료 후 Done으로 업데이트 한다.
현재 일감의 진행 상태를 나타내는 컬럼 중 "Doing" "Done" 사이에 "Reviewed"를 새로 생성하는 것이 좋다. 일감을 완료한 사람이 바로 Done으로 이동시키는 것이 아니라 Reviewed로 이동시키고 일감을 할당/요청한 사람이 완료 조건을 검토 후 Done으로 이동 또는 반려하는 프로세스 구성이 권장되는 관행이다. 하지만 본 튜토리얼에서는 간결성을 위해 본인이 일감 종료 시 마다 바로 일감을 Done 하는 것으로 한다. |
일감에 대한 작업자 할당(assign)은 Issue 단위 또는 Task 단위로 가능하다. 하나의 Issue에 대하여 여러명이 함께 처리하게 되는 경우Task를 각각에게 할당할 수 있다는 의미이다. 여기서는 Issue 단위에만 작업자를 할당하는 기준으로 진행한다.
|
2.1 소스 준비하기
일감을 처리하가 위해서는 로컬 작업 환경에 다음의 전제 조건이 충족되어야 한다.
먼저 https://github.com/zer0big/gs-spring-boot-aks.git 로부터 Fork를 수행하여 자신의 리포지토리를 기준으로 작업을 진행한다.
자신의 리포지토리 우측 상단의 Code를 클릭하여 복제할 HTTPS 주소를 복사한다.
git clone 하여 샘플 소스를 다운 받고 소스 디렉토리로 이동한다.
VS Code가 설치 된 경우 code 명령을 수행하여 소스 코드 내용을 살펴본다.
git clone https://github.com/zer0big/gs-spring-boot-aks.git
cd gs-spring-boot-aks
code . |
2.2 App 빌드 및 검증하기
별도의 bash 창에서 mvn clean package 명령으로 컴파일을 수행하고 컴파일 한다. 참고로 clean 옵션은 maven build 시 생성된 모든 것들을 삭제한다.
mvn clean package -DskipTests |
appmod-demo# mvn clean package -DskipTests
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/usr/share/maven/lib/guice.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
[INFO] Scanning for projects...
[INFO]
[INFO] -------------< org.springframework:gs-spring-boot-docker >--------------
[INFO] Building Spring Boot Docker 0.1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ gs-spring-boot-docker ---
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ gs-spring-boot-docker ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ gs-spring-boot-docker ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /mnt/c/Users/youngdae.kim/gs-spring-boot-aks/target/classes
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ gs-spring-boot-docker ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /mnt/c/Users/youngdae.kim/gs-spring-boot-aks/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ gs-spring-boot-docker ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /mnt/c/Users/youngdae.kim/gs-spring-boot-aks/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ gs-spring-boot-docker ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ gs-spring-boot-docker ---
[INFO] Building jar: /mnt/c/Users/youngdae.kim/gs-spring-boot-aks/target/gs-spring-boot-docker-0.1.0.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.3.0.RELEASE:repackage (repackage) @ gs-spring-boot-docker ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.557 s
[INFO] Finished at: 2022-04-19T15:00:31+09:00
[INFO] ------------------------------------------------------------------------
appmod-demo# |
target 디렉토리 생성을 확인하고 해당 디렉토리로 이동하여 gs-spring-boot-docker-0.1.0.jar 파일 생성을 확인한다.
java -jar 명령을 통해 로컬에서 샘플 소스의 유효성을 검증한다.
별도의 Windows 터미널 탭을 띄워서 다음 명령을 실행한다.
팝업 된 웹 브라우저에서 실행 결과를 확인한다.
결과 확인 후 Ctrl + C를 눌러 실행된 자바 프로세스를 종료한다.
다음 명령을 시행하여 gs-spring-boot-aks 디렉토리로 이동한다.
2.3 Docker Build 및 검증하기
Azure Container Registry 생성
다음 명령을 수행하여 ACR을 생성하고 결과를 확인한다.
Docker Build
다시 gs-spring-boot-aks 디렉토리로 이동하여 샘플 소스 내 준비된 Dockerfile 내용을 검토한다.
docker build 명령을 수행하여 docker images를 생성한다.
docker run 명령을 수행하여 로컬에서 동작 유효성을 검증한다.
로컬 브라우저를 통해 결과를 검증한다.(전시되는 메시지 내용을 상이할 수 있다.)
2.4 이미지 ACR로 푸시하기
Docker Tag$
docker tag, push 명령을 수행하여 생성한 ACR에 images를 Push한다.
인증/인가 에러가 발생한다. az acr login 명령을 수행하여 인증을 득하고 다시 명령을 수행한다.
Azure 포털의 리포지토리로 이동하여 결과를 확인한다.
이제 "로컬 환경 작업" Issue는 Done으로 이동시키고 "Azure Resource 작업"을 Doing으로 이동시키고 자신에게 Issue를 할당한다.
참고로 ACR 배포하기 Task는 이미 처리 되었으므로 Done 처리 되었다.
2.5 AKS 클러스터 배포하기
다음 명령을 수행하여 AKS를 생성한다.
2.6 AKS-ACR 통합하기
다음 명령을 수행하여 AKS-ACR을 통합한다.
이제 "로컬 환경 작업" Issue는 Done으로 이동시키고 "Azure Resource 작업"을 Doing으로 이동시키고 자신에게 Issue를 할당한다.
2.7 Modern App 샘플 준비하기
Repos 화면으로 이동하여 Import를 클릭한다.
자신의 git 리포지토리의 git clone URL을 복사하여 붙여 넣고 Import를 클릭한다.
성공하면 다음의 메시지가 전시된다.
성공적으로 Import한 결과는 다음과 같다.
복제한 리포지토리 내 k8s - deploy-svc.yaml 파일을 열어 각자의 상황에 맞게 이미지 관련 정보 업데이트 후 커밋을 시행한다.
2.8 서비스 커넥션 구성하기
AKS, ACR 등에 대한 서비스 커넥션을 구성하기 위해서는 해당 Azure 리소스에 대하여 적절한 권한이 부여되어야 한다. 본 튜토리얼에서는 이미 권한이 할당되어 있는 것으로 간주한다. 관련한 자세한 내용은 서비스 커넥션 관리 를 참조한다. |
좌측 하단의 Project Settings > Pipelines > Service Connections 를 선택하고 다음 Create service connection을 클릭한다.
docker 라고 키워드를 입력하여 검새 결과 중 Docker Registry를 선택하고 Next를 클릭한다.
다음의 순서에 따라 구성하고 Save를 클릭 한다.
Registry type : Azure Container Registry 선택
Subscription : 해당 구독 선택
Azure container registry : 생성 ACR 선택
Service connection name : SvcConn4Acr 입력
Grant access permission to all pipeliness 선택
우측 상단의 New service connection을 선택한다.
kuber라고 키워드를 입력하여 검새 결과 중 Kubernetes를 선택하고 Next를 클릭한다.
다음의 순서에 따라 구성하고 Save를 클릭 한다.
Registry type : Azure Container Registry 선택
Subscription : 해당 구독 선택
Azure container registry : 생성 ACR 선택
Service connection name : SvcConn4Acr 입력
Grant access permission to all pipeliness 선택
구성이 모두 완료된 결과는 다음과 같다.
2.9 CI 파이프라인 구성하기
Pipelines > Pipelines에서 Create pipeline을 선택한다.
Connect 탭 화면에서 Azure Repos Git를 선택한다.
Select 탭 화면에서 2023_TDG_AKS_CICD_Demo를 선택한다.
기본 구성해 둔 azure-pipelines.yml 이 자동으로 로딩 된다.
만약 자동으로 로딩이 되지 않으면 기본 제공되는 파일 내용을 삭제 하고 다음 내용을 복사하여 붙여 넣는다.
서비스 커넥션 정보 및 리포지토리 정보를 각자 상황에 맞게 선택/입력 및 업데이트 하고 Save 한다.
Azure 파이프라인 관련 상세 내용 : Azure CI/CD Pipeline 구축 가이드 참조 |
CI 파이프라인 설명Triggermain 브랜치의 코드 변경이 감지되면 CI 파이프라인이 트리거 된다. Maven 빌드Maven을 통해 애플리케이션을 빌드 한다.
Docker 빌드, 태그 및 푸시Maven 빌드의 결과물로(war 또는 jar) Docker 이미지를 빌드, 태그하여 ACR로 푸시를 수행한다.
YAML 파일 태그 정보 업데이트Kubernetes 배포를 위한 YAML 파일 내 이미지 태그를 최신 빌드 번호로 업데이트 한다.
빌드 Artifact 게시빌드 산출물인 YAML 파일을 drop 디렉토리에 위치 시킨다.
|
소스의 k8s/deploy-svc.yaml로 이동하여 Edit을 선택하고 image 정보 부분을 각자의 상황에 맞게 수정 후 Commit을 클릭한다.
우측 상단의 Save and run을 클릭한다.
Commit 메시지를 입력하고 Commit을 클릭한다.
CI 파이프라인을 최초 실행하는 경우에는 다음과 같이 리소스 접근에 대한 퍼미션 Confirm을 요구할수도 있다.
Permit을 클릭하여 파이프라인을 실행한다.
|
파이프라인 실행결과를 확인하고 정상이면 1 artifact를 클릭하여 빌드 결과물을 확인한다.
deploy-svc.yaml 파일에 Image 정보를 확인하여, ACR에 푸시된 최근 이미지 정보가 맞는지 확인한다.
더불어 Azure 포털의 ACR 리포지토리로 이동하여 빌드 이미지의 푸시 여부를 확인한다.
2.10 CD 파이프라인 구성하기
Pipelines > Releases에서 New pipeline을 선택한다.
Kubernetes 키워드를 입력 후 결과 중 Deploy to a Kubernetes cluster를 선택하여 Apply 한다.
Stage 이름을 입력하고 (ex) DEV) 우측 상단에 X를 클릭하여 창을 닫는다.
파이프라인 이름을 적당한 이름으로 변경하고 Pipelines 탭의 Add an artifact 을 선택한다.
Source (build pipeline)에서 소스 CI 파이프라인을 선택 후 Add를 클릭한다.
Stage 이름 아래 1job, 1task를 클릭한다.
kubectl 잡을 선택한다.
다음의 순서에 따라 구성을 진행한다.
Kubernetes service connection : 앞서 구성한 해당 서비스 커넥션을 선택한다.
Namespace : default 를 선택한다.
Command : apply를 선택한다.
Use Configuration files : 체크박스를 선택한다.
Configuration file : ... 버튼을 클릭하여 deploy-svc.yaml 파일의 위치를 찾아 선택한다.
선택 및 입력한 내용을 Save 하고 Create a release를 클릭한다.
파이프라인 실행 결과를 확인한다.
AKS의 Services and ingresses 블레이드에서 External IP를 확인하여 파이프라인의 배포 결과를 브라우저에서 확인한다.
2.11 CI/CD 검증하기
CI/CD를 검증하기 위해서는 각각 트리거 설정이 필요하다.
CI의 경우에는 이미 main 브랜치에 대하여 설정이 되어있다.
CD에 대한 트리거 설정을 위해 Pipelines > Releases에서 우측 상단 Edit을 선택한다.
Artifacts에서 다음 1번을 선택 후 Continuous deployment trigger를 Enabled 신킨 후 우측 상단에 X를 클릭하여 창을 닫는다.
우측 상단에 Save 를 선택하여 설정을 저장한다.
이제 Repos > Files 화면에서 src/main/java/hello/Application.java 파일에서 메시지를 변경하고 Commit을 수행한다.
기존 : Hello, You are ...
변경 : Hi, You are ...
Pipeline 으로 이동하면 CI 파이프라인이 트리거 되어 실행되는 것을 확인할 수 있다.
CI 파이프라인이 정상적으로 종료되면, 바로 CD 파이프라인이 트리거 되어 실행되는 것을 확인할 수 있다.
CD 파이프라인이 성공적으로 종료되면 브라우저를 새로고침하여 실행 및 배포 결과를 확인한다.
이로서 CI/CD 파아프라인이 정상적으로 구성된 것을 확인할 수 있다.
3. Backlog 완료하기
Boards > Boards로 이동하여 Azure DevOps 작업 Issue를 Done으로 이동하고 모든 Backlog를 완료한다.