20240131 앱 현대화 - Azure Container 서비스로 배포 소개
- 1 1. 서비스 개요
- 1.1 1.1 Azure Container Instances
- 1.1.1 주요 기능
- 1.2 1.2 Web App for Container
- 1.2.1 주요 기능 (Web App)
- 1.3 1.3 Azure Container Apps
- 1.3.1 기능
- 1.1 1.1 Azure Container Instances
- 2 2. 배포 준비
- 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
- 3 3. 배포하기
- 4 4. 리소스 정리
1. 서비스 개요
1.1 Azure Container Instances
컨테이너는 클라우드 애플리케이션을 패키지, 배포 및 관리하기 위한 기본 방법으로 도입되고 있습니다. Azure Container Instances는 어떠한 가상 머신도 관리하지 않고 또 더 높은 수준의 서비스를 채택하지 않고도 Azure에서 컨테이너를 실행하는 가장 빠르고 간단한 방법을 제공합니다.
Azure Container Instances는 VM을 프로비전 및 관리할 필요 없이 Azure에서 몇 초 안에 컨테이너를 시작할 수 있습니다.
Azure Container Instances는 간단한 애플리케이션, 작업 자동화 및 빌드 작업 등 격리된 컨테이너에서 작동할 수 있는 모든 시나리오에 적합한 솔루션입니다. 여러 컨테이너 간 서비스 검색, 자동 크기 조정 및 조정된 애플리케이션 업그레이드를 포함하여 전체 컨테이너 오케스트레이션이 필요한 시나리오에는 AKS(Azure Kubernetes Service)를 사용하는 것이 좋습니다. 컨테이너 인스턴스를 배포할 때 모범 사례를 이해하려면 고려 사항 및 제한 사항과 FAQ를 읽어보는 것이 좋습니다.
주요 기능
Container 액세스 : IP 주소 및 FQDN(정규화된 도메인 이름)을 사용하여 컨테이너 그룹을 인터넷에 직접 노출할 수 있습니다. 컨테이너 인스턴스를 만들 때 사용자 지정 DNS 이름 레이블을 지정할 수 있습니다. customlabel.azureregion.azurecontainer.io
Custom 사이즈 : CPU 코어 및 메모리의 정확한 사양을 허용하여 최적의 활용도를 제공합니다. 필요한 만큼 비용을 초 단위로 지불하므로 실제로 필요한 양에 따라 지출을 미세하게 조정할 수 있습니다.
Persistent 스토리지 : Azure Files 공유를 직접 탑재하는 기능을 제공합니다.
Linux 및 Windows 컨테이너 : Windows의 경우 볼륨 탑재 및 GPU 리소스 등에 대한 제약 존재
Virtual network 배포 : Azure Container Instances를 사용하면 컨테이너 인스턴스를 Azure 가상 네트워크에 배포할 수 있습니다. 가상 네트워크 내의 서브넷에 배포되는 경우 컨테이너 인스턴스는 온-프레미스(VPN Gateway 또는 ExpressRoute를 통해)를 포함하여 가상 네트워크의 다른 리소스와 안전하게 통신할 수 있습니다.
스폿 컨테이너 배포 : 일반 우선 순위 ACI 컨테이너에 비해 최대 70% 할인된 가격으로 사용하지 않는 Azure 용량에서 중단 가능한 컨테이너화된 워크로드를 실행할 수 있습니다. ACI 스폿 컨테이너는 Azure에서 잉여 용량 부족이 발생할 때 선점될 수 있으며 엄격한 가용성 요구 사항이 없는 워크로드에 적합합니다.
1.2 Web App for Container
Azure App Service를 사용하면 인프라를 관리할 필요 없이 선택한 프로그래밍 언어로 웹앱, 모바일 백 엔드 및 RESTful API를 빌드하고 호스트할 수 있습니다. 여기서는 자동 크기 조정 및 고가용성을 제공하고, Windows 및 Linux를 모두 지원하며, GitHub, Azure DevOps 또는 Git 리포지토리에서 자동화된 배포를 사용합니다.
Azure App Service는 Docker 컨테이너 기술을 사용하여 기본 제공 이미지와 사용자 지정 이미지를 모두 호스팅합니다.
Azure App Service on Linux는 .NET, PHP, Node.js 등과 같은 언어 지원을 통해 Linux에서 미리 정의된 애플리케이션 스택을 제공합니다. Docker 컨테이너 기술을 사용하여 기본 제공 이미지와 사용자 지정 이미지를 모두 호스팅합니다.
주요 기능 (Web App)
여러 언어 및 프레임워크 - App Service는http://ASP.NET , http://ASP.NET Core, Java, Node.js, PHP 또는 Python에 대한 최고 수준의 지원을 제공합니다. PowerShell 및 기타 스크립트 또는 실행 파일을 백그라운드 서비스로 실행할 수도 있습니다.
관리되는 프로덕션 환경 - App Service는 OS 및 언어 프레임워크를 자동으로 패치하고 유지 관리합니다.
컨테이너화 및 Docker - 앱을 Docker화하고 App Service에서 사용자 지정 Windows 또는 Linux 컨테이너를 호스팅합니다. Docker Compose를 사용하여 다중 컨테이너 앱을 실행하세요. Docker 기술을 App Service로 직접 마이그레이션하세요.
DevOps 최적화 - Azure DevOps, GitHub, BitBucket, Docker Hub 또는 Azure Container Registry를 사용하여 지속적인 통합 및 배포를 설정합니다. 테스트 및 스테이징 환경을 통해 업데이트를 승격합니다.
고가용성을 갖춘 글로벌 확장 - 수동 또는 자동으로 확장 또는 확장합니다. Microsoft의 글로벌 데이터 센터 인프라 어디에서나 앱을 호스팅하세요. App Service SLA는 고가용성을 보장합니다.
SaaS 플랫폼 및 온-프레미스 데이터에 대한 커넥트 - 엔터프라이즈 시스템(예: SAP), SaaS 서비스(예: Salesforce), 인터넷 서비스(예: Facebook)를 위한 수백 개의 커넥터 중에서 선택하세요. 하이브리드 연결 및 Azure 가상 네트워크를 사용하여 온-프레미스 데이터에 액세스합니다.
보안 및 규정 준수 - App Service는 ISO, SOC 및 PCI 규격을 준수합니다. IP 주소 제한 및 관리형 서비스 ID를 만듭니다. 하위 도메인 인수를 방지합니다.
인증 - 내장된 인증 구성 요소를 사용하여 사용자를 인증합니다. Microsoft Entra ID, Google, Facebook, Twitter 또는 Microsoft 계정으로 사용자를 인증합니다.
애플리케이션 템플릿 - WordPress, Joomla, Drupal 등 Azure Marketplace의 광범위한 애플리케이션 템플릿 목록에서 선택하세요.
Visual Studio와 Visual Studio Code 통합 - Visual Studio 및 Visual Studio Code의 전용 도구는 생성, 배포, 디버깅 작업을 간소화합니다.
Java 도구 통합 - Maven, Gradle, Visual Studio Code, IntelliJ, Eclipse와 같은 선호하는 개발 도구를 남기지 않고 Azure에 개발하고 배포합니다.
API 및 모바일 기능 - App Service는 RESTful API 시나리오에 대한 턴키 CORS 지원을 제공하고 인증, 오프라인 데이터 동기화, 푸시 알림 등을 사용하도록 설정하여 모바일 앱 시나리오를 간소화합니다.
서버리스 코드 - 인프라를 명시적으로 프로비전하거나 관리할 필요 없이 주문형 코드 조각 또는 스크립트를 실행하고 코드가 실제로 사용하는 컴퓨팅 시간에 대해서만 비용을 지불합니다(Azure Functions 참조).
1.3 Azure Container Apps
Azure Container Apps는 복잡한 인프라를 오케스트레이션하지 않고 코드 또는 컨테이너에서 앱을 배포하는 데 도움이 되는 완전 관리형 Kubernetes 기반 애플리케이션 플랫폼입니다. 생산성을 높이기 위해 통합된 중앙 집중식 네트워킹, 통합 가시성, 동적 확장 및 구성을 사용하여 이기종 최신 앱 또는 마이크로서비스를 빌드하세요. Dapr을 완벽하게 지원하는 탄력적인 마이크로서비스와 KEDA 기반의 동적 확장을 통해 탄력적인 마이크로서비스를 설계합니다.
기능
Azure Container Apps를 사용하여 다음을 수행할 수 있습니다.
다른 Azure 인프라를 관리할 필요 없이 HTTPS 또는 TCP 인그레스를 사용하도록 설정합니다.
Dapr 을 사용하여 마이크로 서비스를 빌드하고 풍부한 API 집합에 액세스합니다.
주문형, 일정 또는 이벤트에 따라 작업을 실행합니다.
여러 컨테이너 버전을 실행하고 컨테이너 앱의 애플리케이션 수명 주기를 관리합니다.
KEDA 지원 확장 트리거를 기반으로 앱을 자동 스케일링합니다. 대부분의 애플리케이션은 01까지 확장할 수 있습니다. → 1CPU 또는 메모리 부하에 따라 확장되는 애플리케이션은 0으로 확장할 수 없습니다.
Blue/Green 배포 및 A/B 테스트 시나리오를 위해 애플리케이션의 여러 버전에 걸쳐 트래픽을 분할합니다.
DNS 기반 서비스 검색이 내장된 안전한 내부 전용 엔드포인트를 위해 내부 인그레스 및 서비스 검색을 사용합니다.
Docker Hub 및 ACR(Azure Container Registry)을 포함하여 퍼블릭 또는 프라이빗에 해당하는 모든 레지스트리에서 컨테이너를 실행합니다.
애플리케이션에서 직접 비밀을 안전하게 관리합니다.
Azure Log Analytics를 사용하여 로그를 모니터링합니다.
2. 배포 준비
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 포털의 리포지토리로 이동하여 결과를 확인한다.
3. 배포하기
3.1 Container Instances
Container instances를 검색하여 생성을 시작한다.
Basics 탭에서 리소스 그룹과 컨테이너 이름을 입력한다.
image source 에서 배포할 이미지의 정보(Registry, Image 및 tag)를 입력한다.
Networking 탭에서 DNS name label에 필요한 값을 넣는다.
리소스 생성을 시작한다.
생성이 완료된 후 Overview로 이동하여 FQDN 정보를 복사한다.
웹 브라우저에 붙여 넣고 결과를 검증한다.
3.2 Web App for Containers
App Service를 검색하여 생성을 시작한다.
Basics 탭에서 리소스 그룹과 인스턴스 이름을 입력한다.
Publish 에서 Docker Container를 선택한다.
Operating System 을 그대로 두고 Region을 Korea Central로 선택한다.
Docker 탭에서 배포할 이미지 소스 정보 및 관련 옵션 정보(Registry, Image 및 tag)를 입력한다.
리소스 생성을 시작한다.
생성이 완료된 후 Overview로 이동하여 Default domain 정보를 복사한다.
웹 브라우저에 붙여 넣고 결과를 검증한다.
Custom domain 적용
Settings > Custom domains 에서 + Add custom domain을 선택한다.
Domain provider에서 All other domain services를 선택한다.
Domain에 커스텀 도메인 정보를 입력한다.
도메인 호스팅 관리 페이지에서 A, TXT 레코드 정보를 토대로 입력 한다.
Custom domain 화면 하단에 Validate를 선택하여 유효성을 검증한다.
정상적으로 확인이 이루어지면 상태가 녹색 체크 표시로 변경되고 Add를 선택한다.
기존에 이미 Custom domain을 수행한 적이 있는 경우 하기와 같은 에러가 발생할 수 있다.
기존 리소스를 제거 및 해제하고 추가 작업이 필요하다.
→ Add binding을 선택하여 IP기반 TLS/SSL를 구성한다.
성공한 결과는 다음과 같다.
커스텀 도메인 정보를 통해 결과를 확인한다.
3.2 Container Apps
Container Apps를 검색하여 생성을 시작한다.
Basics 탭에서 컨테이너 앱 이름을 입력한다.
Container 탭에서 먼저 Use quickstart image를 선택 해제한다.
배포할 컨테이너 앱의 이름 및 관련 옵션 정보(Registry, Image 및 tag)를 입력한다.
Ingress 탭에서 먼저 Use quickstart image를 선택 해제한다.
Ingress를 활성화 하고 Ingress traffic을 어디서든 접근 가능하게 선택한다.
Target port에 80을 입력한다.
리소스 생성을 시작한다.
생성이 완료된 후 Overview로 이동하여 Application Url 정보를 복사한다.
웹 브라우저에 붙여 넣고 결과를 검증한다.
4. 리소스 정리
모든 실습이 마무리 되면 실습에서 사용했던 리소스 그룹을 삭제한다.