Azure Kubernetes Service에 Spring Boot 애플리케이션 배포
참고 항목
Spring Boot 애플리케이션의 경우 Azure Spring 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 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
Spring Boot on Docker 시작 샘플 프로젝트를 디렉터리에 복제합니다.
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 Container Registry를 만듭니다. 이 자습서는 이후 단계에서 샘플 앱을 이 레지스트리에 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
<properties>
pom.xml 파일의 컬렉션을 Azure Container Registry의 레지스트리 이름 및 최신 버전의 jib-maven-plugin으로 업데이트합니다.<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>
포함되도록 pom.xml 파일의jib-maven-plugin
컬렉션을 업데이트합니다. MCR(Microsoft Container Registry):mcr.microsoft.com/openjdk/jdk:11-ubuntu
의 기본 이미지를 사용하고 있으며, 여기에는 공식적으로 지원되는 Azure용 JDK가 포함됩니다. 공식적으로 지원되는 JDK가 있는 다른 MCR 기본 이미지는 OpenJDK의 Microsoft 빌드 설치를 참조하세요.<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 권한 없음 오류가 표시되면 명령을 다시 실행 az acr login --name <your registry name>
하여 다시 인증할 수 있습니다. 읽기 시간 초과 오류가 표시되면 시간 제한을 mvn -Djib.httpTimeout=7200000 jib:dockerBuild
늘리거나 -Djib.httpTimeout=0
제한 시간 제한을 제한하지 않도록 시도할 수 있습니다.
Azure CLI를 사용하여 AKS에서 Kubernetes 클러스터 만들기
Azure Kubernetes Service에서 Kubernetes 클러스터를 만듭니다. 다음 명령은 wingtiptoys-kubernetes 리소스 그룹에 kubernetes 클러스터를 만들고, wingtiptoys-akscluster를 클러스터 이름으로, ACR(Azure Container Registry)
wingtiptoysregistry
을 연결하고, wingtiptoys-kubernetes를 DNS 접두사로 만듭니다.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 사용자는 이 명령 앞에sudo
를 붙여야 할 수 있습니다. 그러면 Kubernetes CLI가/usr/local/bin
에 배포됩니다.az aks install-cli
Kubernetes 웹 인터페이스에서 클러스터를 관리할 수 있도록 클러스터 구성 정보를 다운로드합니다
kubectl
.az aks get-credentials --resource-group=wingtiptoys-kubernetes --name=wingtiptoys-akscluster
Kubernetes 클러스터에 이미지 배포
이 자습서에서는 앱을 사용하여 kubectl
배포한 다음, Kubernetes 웹 인터페이스를 통해 배포를 탐색할 수 있습니다.
kubectl을 사용하여 배포
명령 프롬프트가 엽니다.
명령을 사용하여 Kubernetes 클러스터에서 컨테이너를 실행합니다
kubectl run
. 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
명령을 사용하여 Kubernetes 클러스터를 외부에서 노출합니다
kubectl expose
. 서비스 이름, 앱에 액세스하는 데 사용되는 공용 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
매개 변수는 내부 TCP 포트 8080을 지정합니다. 부하 분산 장치는 이 포트에서 앱으로 요청을 전달합니다.
클러스터에 앱이 배포되면 외부 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 편집기의 맨 아래에 있는 추가를 선택하여 애플리케이션을 배포합니다.
위와 마찬가지로 배포한
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에 대한 자세한 사항은 Azure의 Spring 설명서 센터를 참조합니다.
참고 항목
Azure에서 Spring Boot를 사용하는 방법에 대한 자세한 내용은 다음 문서를 참조하세요.
Java와 함께 Azure를 사용하는 방법에 관한 자세한 정보는 Java 개발자를 위한 Azure와 Azure DevOps 및 Java 사용하기를 참조하세요.
Visual Studio Code를 사용하여 Kubernetes에 Java 애플리케이션을 배포하는 방법에 관한 자세한 정보는 Visual Studio Code Java 자습서를 참조하세요.
Docker의 Spring Boot 샘플 프로젝트에 대한 자세한 내용은 Docker 시작의 Spring Boot를 참조하세요.
다음 링크는 Spring Boot 애플리케이션을 만드는 방법에 대한 추가 정보를 제공합니다.
- 간단한 Spring Boot 애플리케이션을 만드는 방법에 대한 자세한 내용은 Spring Initializr를 참조하세요 https://start.spring.io/.
다음 링크는 Azure에서 Kubernetes를 사용하는 방법에 대한 추가 정보를 제공합니다.
Kubernetes 명령줄 인터페이스 사용에 대한 자세한 내용은 kubectl 사용자 가이드에서 확인할 수 있습니다.https://kubernetes.io/docs/reference/kubectl/
Kubernetes 웹 사이트에는 프라이빗 레지스트리에서 이미지를 사용하는 방법을 설명하는 일부 문서가 포함되어 있습니다.
Azure에서 사용자 지정 Docker 이미지를 사용하는 방법에 대한 추가 예제는 Linux에서 Azure Web App에 대한 사용자 지정 Docker 이미지 사용을 참조하세요.
Azure Dev Spaces를 사용하여 AKS(Azure Kubernetes Service)에서 컨테이너를 반복적으로 실행하고 디버깅하는 방법에 대한 자세한 내용은 Java를 사용하여 Azure Dev Spaces 시작을 참조 하세요.