Azure Kubernetes Service에 Spring Boot 애플리케이션 배포

참고 항목

Spring Boot 애플리케이션의 경우 Azure Spring Apps를 사용하는 것이 좋습니다. 그러나 Azure Kubernetes Service를 대상으로 사용하도록 선택할 수 있습니다. 자세한 내용은 Java 애플리케이션에 적합한 Azure 서비스 선택을 참조 하세요.

이 자습서에서는 Kubernetes와 Docker를 결합하여 Spring Boot 애플리케이션을 개발하고 Microsoft Azure에 배포하는 과정을 안내합니다. 더 구체적으로는 애플리케이션 개발에 Spring Boot, 컨테이너 배포를 위한 KubernetesAKS(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. Spring Boot on Docker 시작 샘플 프로젝트를 디렉터리에 복제합니다.

    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 Container Registry를 만듭니다. 이 자습서는 이후 단계에서 샘플 앱을 이 레지스트리에 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. <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>
    
  4. <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>
    
  5. 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 클러스터 만들기

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

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

  2. Azure CLI를 사용하여 설치 kubectl 합니다. Linux 사용자는 이 명령 앞에 sudo를 붙여야 할 수 있습니다. 그러면 Kubernetes CLI가 /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. 명령을 사용하여 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

  3. 명령을 사용하여 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을 지정합니다. 부하 분산 장치는 이 포트에서 앱으로 요청을 전달합니다.

  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에 대한 자세한 사항은 Azure의 Spring 설명서 센터를 참조합니다.

참고 항목

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

Java와 함께 Azure를 사용하는 방법에 관한 자세한 정보는 Java 개발자를 위한 AzureAzure 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 시작을 참조 하세요.