Azure Kubernetes Service에 Spring Boot 애플리케이션 배포
메모
Spring Boot 애플리케이션의 경우 Azure Container Apps를 사용하는 것이 좋습니다. 그러나 Azure Kubernetes Service를 대상으로 사용하도록 선택할 수 있습니다. 자세한 내용은 Java 애플리케이션적합한 Azure 서비스 선택을 참조하세요.
이 자습서에서는 Kubernetes와 Docker를 결합하여 Spring Boot 애플리케이션을 개발하고 Microsoft Azure에 배포하는 방법을 안내합니다. 더 구체적으로는 애플리케이션 개발에 Spring Boot 사용하고, 컨테이너 배포에 Kubernetes , AKS(Azure Kubernetes Service) 사용하여 애플리케이션을 호스트합니다.
Kubernetes 및 Docker 개발자가 컨테이너에서 실행되는 애플리케이션의 배포, 크기 조정 및 관리를 자동화하는 데 도움이 되는 오픈 소스 솔루션입니다.
필수 구성 요소
- Azure 구독; Azure 구독이 아직 없는 경우 MSDN 구독자 혜택을 활성화하거나무료 Azure 계정등록할 수 있습니다.
- Azure Command-Line 인터페이스 (CLI).
- 지원되는 JDK(Java Development Kit)입니다. Azure에서 개발할 때 사용할 수 있는 JDK에 대한 자세한 내용은 Azure 및 Azure Stack
Java 지원을 참조하세요. - Apache의 Maven 빌드 도구(버전 3).
- Git 클라이언트입니다.
- Docker 클라이언트입니다.
- ACR Docker 자격 증명 도우미.
메모
이 자습서의 가상화 요구 사항으로 인해 가상 머신에서 이 문서의 단계를 따를 수 없습니다. 가상화 기능을 사용하도록 설정된 물리적 컴퓨터를 사용해야 합니다.
Docker 시작 웹앱에서 Spring Boot 만들기
다음 단계에서는 Spring Boot 웹 애플리케이션을 빌드하고 로컬로 테스트하는 단계를 안내합니다.
명령 프롬프트를 열고 애플리케이션을 저장할 로컬 디렉터리를 만들고 해당 디렉터리로 변경합니다. 예를 들어:
mkdir C:\SpringBoot cd C:\SpringBoot
--또는--
mkdir /users/$USER/SpringBoot cd /users/$USER/SpringBoot
Docker 시작 시 Spring Boot 샘플 프로젝트를 디렉터리에 복제합니다.
git clone https://github.com/spring-guides/gs-spring-boot-docker.git
디렉터리를 완료된 프로젝트로 변경합니다.
cd gs-spring-boot-docker cd complete
Maven을 사용하여 샘플 앱을 빌드하고 실행합니다.
mvn package spring-boot:run
다음
http://localhost:8080
명령을 사용하거나curl
으로 이동하여 웹앱을 테스트합니다.curl http://localhost:8080
다음 메시지가 표시됩니다. Hello Docker World
Azure CLI를 사용하여 Azure Container Registry 만들기
명령 프롬프트를 엽니다.
Azure 계정에 로그인합니다.
az login
Azure 구독 선택:
az account set -s <YourSubscriptionID>
이 자습서에서 사용되는 Azure 리소스에 대한 리소스 그룹을 만듭니다.
az group create --name=wingtiptoys-kubernetes --location=eastus
리소스 그룹에 프라이빗 Azure 컨테이너 레지스트리를 만듭니다. 이 자습서에서는 이후 단계에서 샘플 앱을 Docker 이미지로 이 레지스트리에 푸시합니다.
wingtiptoysregistry
레지스트리의 고유한 이름으로 대체합니다.az acr create --resource-group wingtiptoys-kubernetes --location eastus \ --name wingtiptoysregistry --sku Basic
Jib를 통해 컨테이너 레지스트리에 앱 푸시
Azure CLI에서 Azure Container Registry에 로그인합니다.
# set the default name for Azure Container Registry, otherwise you need to specify the name in "az acr login" az config set defaults.acr=wingtiptoysregistry az acr login
텍스트 편집기를 사용하여 pom.xml 파일을 엽니다; 예를 들어 Visual Studio Code.
code pom.xml
Azure Container Registry의 레지스트리 이름과 최신 버전의
<properties>
로 pom.xml 파일의 컬렉션을 업데이트합니다.<properties> <!-- Note: If your ACR name contains upper case characters, be sure to convert them to lower case characters. --> <docker.image.prefix>wingtiptoysregistry.azurecr.io</docker.image.prefix> <jib-maven-plugin.version>2.5.2</jib-maven-plugin.version> <java.version>1.8</java.version> </properties>
다음 예제와 같이
<plugins>
요소에 대한 항목이 포함되도록<plugin>
파일의jib-maven-plugin
컬렉션을 업데이트합니다. McR(Microsoft Container Registry):mcr.microsoft.com/openjdk/jdk:11-ubuntu
(Azure용 공식적으로 지원되는 JDK)의 기본 이미지를 사용하고 있습니다. 공식적으로 지원되는 JDK가 포함된 다른 MCR 기본 이미지를 확인하려면 Microsoft Build of OpenJDK 설치를 참조하세요..<plugin> <artifactId>jib-maven-plugin</artifactId> <groupId>com.google.cloud.tools</groupId> <version>${jib-maven-plugin.version}</version> <configuration> <from> <image>mcr.microsoft.com/openjdk/jdk:11-ubuntu</image> </from> <to> <image>${docker.image.prefix}/gs-spring-boot-docker</image> </to> </configuration> </plugin>
Spring Boot 애플리케이션에 대해 완료된 프로젝트 디렉터리로 이동하고 다음 명령을 실행하여 이미지를 빌드하고 이미지를 레지스트리에 푸시합니다.
az acr login && mvn compile jib:build
메모
Azure Cli 및 Azure Container Registry의 보안 문제로 인해 az acr login
만든 자격 증명은 1시간 동안 유효합니다.
401 Unauthorized
오류가 표시되면 az acr login --name <your registry name>
명령을 다시 실행하여 다시 인증할 수 있습니다.
Read timed out
오류가 표시되면, mvn -Djib.httpTimeout=7200000 jib:dockerBuild
으로 시간 제한을 늘리는 것을 시도하거나, 무한 시간 제한을 위해 -Djib.httpTimeout=0
를 시도할 수 있습니다.
Azure CLI를 사용하여 AKS에서 Kubernetes 클러스터 만들기
Azure Kubernetes Service에서 Kubernetes 클러스터를 만듭니다. 다음 명령은
wingtiptoys-kubernetes
리소스 그룹에wingtiptoys-akscluster
을 클러스터 이름으로 하여,wingtiptoysregistry
을 DNS 접두사로 사용할 수 있도록 ACR(Azure Container Registry)wingtiptoys-kubernetes
가 연결된 Kubernetes 클러스터를 생성합니다.az aks create --resource-group=wingtiptoys-kubernetes --name=wingtiptoys-akscluster \ --attach-acr wingtiptoysregistry \ --dns-name-prefix=wingtiptoys-kubernetes --generate-ssh-keys
이 명령을 완료하는 데 시간이 걸릴 수 있습니다.
Azure CLI를 사용하여
kubectl
설치합니다. Linux 사용자는 이 명령이 Kubernetes CLI를sudo
에 배포하기 때문에/usr/local/bin
로 접두사를 추가할 수 있습니다.az aks install-cli
Kubernetes 웹 인터페이스에서 클러스터를 관리하고
kubectl
수 있도록 클러스터 구성 정보를 다운로드합니다.az aks get-credentials --resource-group=wingtiptoys-kubernetes --name=wingtiptoys-akscluster
Kubernetes 클러스터에 이미지 배포
이 자습서에서는 kubectl
사용하여 앱을 배포한 다음, Kubernetes 웹 인터페이스를 통해 배포를 탐색할 수 있습니다.
kubectl을 사용하여 배포
명령 프롬프트를 엽니다.
kubectl run
명령을 사용하여 Kubernetes 클러스터에서 컨테이너를 실행합니다. Kubernetes에서 앱의 서비스 이름과 전체 이미지 이름을 지정합니다. 예를 들어:kubectl run gs-spring-boot-docker --image=wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest
이 명령에서 다음을 수행합니다.
컨테이너 이름
gs-spring-boot-docker
run
명령 바로 다음에 지정됩니다.--image
매개 변수는 결합된 로그인 서버와 이미지 이름을wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest
지정합니다.
kubectl expose
명령을 사용하여 Kubernetes 클러스터를 외부에서 노출합니다. 서비스 이름, 앱에 액세스하는 데 사용되는 공용 TCP 포트 및 앱이 수신 대기하는 내부 대상 포트를 지정합니다. 예를 들어:kubectl expose pod gs-spring-boot-docker --type=LoadBalancer --port=80 --target-port=8080
이 명령에서 다음을 수행합니다.
컨테이너 이름
gs-spring-boot-docker
expose pod
명령 바로 다음에 지정됩니다.--type
매개 변수는 클러스터가 부하 분산 장치를 사용한다고 지정합니다.--port
매개 변수는 공용 TCP 포트 80을 지정합니다. 이 포트에서 앱에 액세스합니다.--target-port
매개 변수는 8080의 내부 TCP 포트를 지정합니다. 부하 분산 장치는 이 포트에서 앱으로 요청을 전달합니다.
클러스터에 앱이 배포되면 외부 IP 주소를 쿼리하고 웹 브라우저에서 엽니다.
kubectl get services -o=jsonpath='{.items[*].status.loadBalancer.ingress[0].ip}'
Kubernetes 리소스 뷰를 사용하여 배포
리소스 뷰(네임스페이스, 워크로드, 서비스 및 수신, 스토리지 또는 구성)에서 추가를 선택합니다.
다음 YAML에 붙여넣으세요.
apiVersion: apps/v1 kind: Deployment metadata: name: gs-spring-boot-docker spec: replicas: 1 selector: matchLabels: app: gs-spring-boot-docker template: metadata: labels: app: gs-spring-boot-docker spec: containers: - name: gs-spring-boot-docker image: wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest
YAML 편집기 아래쪽에 있는 추가을 선택하여 애플리케이션을 배포합니다.
Kubernetes 리소스를 보기, 리소스를 추가합니다.
위와 마찬가지로
Deployment
배포한 후 YAML 편집기 아래쪽에서 추가 선택하여 다음 YAML을 사용하여Service
배포합니다.apiVersion: v1 kind: Service metadata: name: gs-spring-boot-docker spec: type: LoadBalancer ports: - port: 80 targetPort: 8080 selector: app: gs-spring-boot-docker
YAML 파일이 추가되면 리소스 뷰어에 Spring Boot 애플리케이션이 표시됩니다. 외부 서비스에는 연결된 외부 IP 주소가 포함되어 있으므로 브라우저에서 애플리케이션을 쉽게 볼 수 있습니다.
외부 IP을 선택합니다. 그러면 Azure에서 실행 중인 Spring Boot 애플리케이션이 표시됩니다.
다음 단계
Spring 및 Azure에 대해 자세히 알아보려면 Spring on Azure 설명서 센터를 계속 진행하세요.
참고 항목
Azure에서 Spring Boot를 사용하는 방법에 대한 자세한 내용은 다음 문서를 참조하세요.
- Azure App Service Linux에 Spring Boot 애플리케이션 배포
Java에서 Azure 사용에 대한 자세한 정보는 Java 개발자용 Azure 및 Azure DevOps와 Java 작업하기를 참조하세요.
Visual Studio Code를 사용하여 Kubernetes에 Java 애플리케이션을 배포하는 방법에 대한 자세한 내용은 visual Studio Code Java 자습서
Docker의 Spring Boot 샘플 프로젝트에 대한 자세한 내용은 Spring Boot on Docker 시작하기을 참조하세요.
다음 링크는 Spring Boot 애플리케이션을 만드는 방법에 대한 추가 정보를 제공합니다.
- 간단한 Spring Boot 애플리케이션을 만드는 방법에 대한 자세한 내용은 https://start.spring.io/Spring Initializr를 참조하세요.
다음 링크는 Azure에서 Kubernetes를 사용하는 방법에 대한 추가 정보를 제공합니다.
Kubernetes 명령줄 인터페이스 사용에 대한 더 많은 정보는 kubectl 사용자 가이드를https://kubernetes.io/docs/reference/kubectl/에서 확인할 수 있습니다.
Kubernetes 웹 사이트에는 개인 레지스트리의 이미지 사용에 대해 설명하는 몇 가지 문서가 있습니다.
Azure에서 사용자 지정 Docker 이미지를 사용하는 방법에 대한 추가 예제는 LinuxAzure Web App에 대한 사용자 지정 Docker 이미지 사용을 참조하세요.
Azure Dev Spaces를 사용하여 AKS(Azure Kubernetes Service)에서 컨테이너를 반복 실행 및 디버깅하는 방법에 대한 자세한 내용은 Java 시작하기을 확인하세요.