다음을 통해 공유


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) 사용하여 애플리케이션을 호스트합니다.

KubernetesDocker 개발자가 컨테이너에서 실행되는 애플리케이션의 배포, 크기 조정 및 관리를 자동화하는 데 도움이 되는 오픈 소스 솔루션입니다.

필수 구성 요소

메모

이 자습서의 가상화 요구 사항으로 인해 가상 머신에서 이 문서의 단계를 따를 수 없습니다. 가상화 기능을 사용하도록 설정된 물리적 컴퓨터를 사용해야 합니다.

Docker 시작 웹앱에서 Spring Boot 만들기

다음 단계에서는 Spring Boot 웹 애플리케이션을 빌드하고 로컬로 테스트하는 단계를 안내합니다.

  1. 명령 프롬프트를 열고 애플리케이션을 저장할 로컬 디렉터리를 만들고 해당 디렉터리로 변경합니다. 예를 들어:

    mkdir C:\SpringBoot
    cd C:\SpringBoot
    

    --또는--

    mkdir /users/$USER/SpringBoot
    cd /users/$USER/SpringBoot
    
  2. Docker 시작 시 Spring Boot 샘플 프로젝트를 디렉터리에 복제합니다.

    git clone https://github.com/spring-guides/gs-spring-boot-docker.git
    
  3. 디렉터리를 완료된 프로젝트로 변경합니다.

    cd gs-spring-boot-docker
    cd complete
    
  4. Maven을 사용하여 샘플 앱을 빌드하고 실행합니다.

    mvn package spring-boot:run
    
  5. 다음 http://localhost:8080 명령을 사용하거나 curl으로 이동하여 웹앱을 테스트합니다.

    curl http://localhost:8080
    
  6. 다음 메시지가 표시됩니다. Hello Docker World

    샘플 앱 로컬 찾아보기

Azure CLI를 사용하여 Azure Container Registry 만들기

  1. 명령 프롬프트를 엽니다.

  2. Azure 계정에 로그인합니다.

    az login
    
  3. Azure 구독 선택:

    az account set -s <YourSubscriptionID>
    
  4. 이 자습서에서 사용되는 Azure 리소스에 대한 리소스 그룹을 만듭니다.

    az group create --name=wingtiptoys-kubernetes --location=eastus
    
  5. 리소스 그룹에 프라이빗 Azure 컨테이너 레지스트리를 만듭니다. 이 자습서에서는 이후 단계에서 샘플 앱을 Docker 이미지로 이 레지스트리에 푸시합니다. wingtiptoysregistry 레지스트리의 고유한 이름으로 대체합니다.

    az acr create --resource-group wingtiptoys-kubernetes --location eastus \
     --name wingtiptoysregistry --sku Basic
    

Jib를 통해 컨테이너 레지스트리에 앱 푸시

  1. 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
    
  2. 텍스트 편집기를 사용하여 pom.xml 파일을 엽니다; 예를 들어 Visual Studio Code.

    code pom.xml
    
  3. 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>
    
  4. 다음 예제와 같이 <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>
    
  5. 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 클러스터 만들기

  1. 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
    

    이 명령을 완료하는 데 시간이 걸릴 수 있습니다.

  2. Azure CLI를 사용하여 kubectl 설치합니다. Linux 사용자는 이 명령이 Kubernetes CLI를 sudo에 배포하기 때문에 /usr/local/bin로 접두사를 추가할 수 있습니다.

    az aks install-cli
    
  3. Kubernetes 웹 인터페이스에서 클러스터를 관리하고 kubectl수 있도록 클러스터 구성 정보를 다운로드합니다.

    az aks get-credentials --resource-group=wingtiptoys-kubernetes --name=wingtiptoys-akscluster
    

Kubernetes 클러스터에 이미지 배포

이 자습서에서는 kubectl사용하여 앱을 배포한 다음, Kubernetes 웹 인터페이스를 통해 배포를 탐색할 수 있습니다.

kubectl을 사용하여 배포

  1. 명령 프롬프트를 엽니다.

  2. kubectl run 명령을 사용하여 Kubernetes 클러스터에서 컨테이너를 실행합니다. Kubernetes에서 앱의 서비스 이름과 전체 이미지 이름을 지정합니다. 예를 들어:

    kubectl run gs-spring-boot-docker --image=wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest
    

    이 명령에서 다음을 수행합니다.

    • 컨테이너 이름 gs-spring-boot-dockerrun 명령 바로 다음에 지정됩니다.

    • --image 매개 변수는 결합된 로그인 서버와 이미지 이름을 wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest 지정합니다.

  3. kubectl expose 명령을 사용하여 Kubernetes 클러스터를 외부에서 노출합니다. 서비스 이름, 앱에 액세스하는 데 사용되는 공용 TCP 포트 및 앱이 수신 대기하는 내부 대상 포트를 지정합니다. 예를 들어:

    kubectl expose pod gs-spring-boot-docker --type=LoadBalancer --port=80 --target-port=8080
    

    이 명령에서 다음을 수행합니다.

    • 컨테이너 이름 gs-spring-boot-dockerexpose pod 명령 바로 다음에 지정됩니다.

    • --type 매개 변수는 클러스터가 부하 분산 장치를 사용한다고 지정합니다.

    • --port 매개 변수는 공용 TCP 포트 80을 지정합니다. 이 포트에서 앱에 액세스합니다.

    • --target-port 매개 변수는 8080의 내부 TCP 포트를 지정합니다. 부하 분산 장치는 이 포트에서 앱으로 요청을 전달합니다.

  4. 클러스터에 앱이 배포되면 외부 IP 주소를 쿼리하고 웹 브라우저에서 엽니다.

    kubectl get services -o=jsonpath='{.items[*].status.loadBalancer.ingress[0].ip}'
    

    Azure에서 샘플 앱 찾아보기

Kubernetes 리소스 뷰를 사용하여 배포

  1. 리소스 뷰(네임스페이스, 워크로드, 서비스 및 수신, 스토리지 또는 구성)에서 추가를 선택합니다.

    Kubernetes 리소스 뷰.

  2. 다음 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
    
  3. 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
    
  4. YAML 파일이 추가되면 리소스 뷰어에 Spring Boot 애플리케이션이 표시됩니다. 외부 서비스에는 연결된 외부 IP 주소가 포함되어 있으므로 브라우저에서 애플리케이션을 쉽게 볼 수 있습니다.

    Kubernetes 리소스 보기, 서비스 목록입니다.

    Kubernetes 리소스 보기, 서비스 목록, 강조 표시된 외부 엔드포인트.

  5. 외부 IP을 선택합니다. 그러면 Azure에서 실행 중인 Spring Boot 애플리케이션이 표시됩니다.

    Azure에서 샘플 앱 찾아보기

다음 단계

Spring 및 Azure에 대해 자세히 알아보려면 Spring on Azure 설명서 센터를 계속 진행하세요.

참고 항목

Azure에서 Spring Boot를 사용하는 방법에 대한 자세한 내용은 다음 문서를 참조하세요.

Java에서 Azure 사용에 대한 자세한 정보는 Java 개발자용 AzureAzure 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 시작하기을 확인하세요.