Azure Kubernetes Service에 컨테이너 이미지 배포

완료됨

이 단원에서는 AKS(Azure Kubernetes Service)에 컨테이너 이미지를 배포합니다. AKS를 사용하면 배포를 통해 Kubernetes 클러스터를 원하는 상태로 실행하도록 구성합니다. 이 프로세스는 Pod 및 ReplicaSets에 선언적 업데이트를 제공하는 프로세스입니다. 이 상태 선언은 매니페스트 YAML 파일에서 관리되며, Kubernetes 컨트롤러는 지시에 따라 현재 상태를 선언된 상태로 변경합니다. deployment.yml 매니페스트 파일을 만들고 AKS 인스턴스가 이전 단계에서 푸시한 Azure Container Registry에 포함된 flightbookingsystemsample 컨테이너 이미지를 끌어와 실행하도록 구성된 Pod와 함께 원하는 상태에서 실행되도록 지시합니다. 이 매니페스트 파일이 없으면 Kubernetes가 프로세스를 오케스트레이션하도록 하는 대신 Pod를 수동으로 만들고, 업데이트하고, 삭제해야 합니다.

비고

세션이 유휴 상태이거나 다른 특정 시점 또는 다른 CLI에서 이 단계를 수행하는 경우 다음 명령을 사용하여 환경 변수를 다시 초기화하고 다시 인증해야 할 수 있습니다.

export AZ_RESOURCE_GROUP=java-containerization-demo-rg
export AZ_CONTAINER_REGISTRY=<your-container-registry>
export AZ_KUBERNETES_CLUSTER=java-containerization-demo-aks
export AZ_LOCATION=<your-Azure-region>
export AZ_KUBERNETES_CLUSTER_DNS_PREFIX=<your-unique-DNS-prefix-to-access-your-AKS-cluster>
az login
az acr login --name $AZ_CONTAINER_REGISTRY

컨테이너 이미지 배포

이제 AKS 클러스터에 flightbookingsystemsample 컨테이너 이미지를 배포합니다. 프로젝트의 루트 폴더인 Flight-Booking-System-JavaServlets_App/Project/Airlines 내에서 다음 명령을 사용하여 deployment.yml 파일을 만듭니다.

vi deployment.yml

다음 내용을 deployment.yml 추가한 다음 저장하고 종료합니다. 이전에 설정한 AZ_CONTAINER_REGISTRY 환경 변수의 값을 <AZ_CONTAINER_REGISTRY> 자리 표시자로 바꿔야 합니다. 저장하고 종료하려면 ESC 키를 누르고 :wq!를 입력한 다음 Enter 키를 누릅니 .

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flightbookingsystemsample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flightbookingsystemsample
  template:
    metadata:
      labels:
        app: flightbookingsystemsample
    spec:
      containers:
      - name: flightbookingsystemsample
        image: <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latest
        resources:
          requests:
            cpu: "1"
            memory: "1Gi"
          limits:
            cpu: "2"
            memory: "2Gi"
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: flightbookingsystemsample
spec:
  type: LoadBalancer
  ports:
  - port: 8080
    targetPort: 8080
  selector:
    app: flightbookingsystemsample

비고

필요에 따라 필요한 내용이 포함된 프로젝트의 루트 폴더에 있는 deployment_solution.yml 파일을 사용할 수 있습니다. 해당 파일의 내용을 더 쉽게 이름을 바꾸거나 업데이트할 수 있습니다.

이전 deployment.yml 파일에는 배포 및 서비스가 포함됩니다. 배포는 Pod 집합을 관리하는 데 사용되며, 서비스는 Pod에 대한 네트워크 액세스를 허용하는 데 사용됩니다. Pod는 Azure Container Registry에서 단일 이미지를 <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latest끌어오도록 구성됩니다. 서비스는 -p 포트 인수로 컨테이너 이미지를 로컬에서 실행할 때처럼, 들어오는 HTTP 파드 트래픽을 포트 8080으로 허용하도록 구성되어 있습니다.

배포에 성공하면 이제 AKS 클러스터가 있습니다. 명령을 통해 AKS 클러스터에 액세스하도록 Azure CLI를 구성합니다 kubectl . kubectl을(를) 다음 명령어를 사용하여 로컬에 설치합니다.

az aks install-cli

다음 명령을 사용하여 AKS 클러스터에 연결하도록 kubectl을 구성합니다.

az aks get-credentials \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_KUBERNETES_CLUSTER

다음과 같은 출력이 일반적입니다.

Merged AZ_KUBERNETES_CLUSTER as current context in ~/.kube/config

AKS를 사용하여 다음 명령을 사용하여 클러스터에 deployment.yml 변경 내용을 적용합니다.

kubectl apply -f deployment.yml

다음과 같은 출력이 일반적입니다.

deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created

다음 명령을 사용하여 배포 상태를 모니터링합니다.

kubectl get all

다음과 같은 출력이 일반적입니다.

kubectl get all
NAME                                            READY   STATUS    RESTARTS   AGE
pod/flightbookingsystemsample-b7fd6684f-4j8vf   1/1     Running   0          37s

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)          AGE
service/flightbookingsystemsample   LoadBalancer   10.0.62.153   <external-IP>   8080:30534/TCP   37s
service/kubernetes                  ClusterIP      10.0.0.1      <none>          443/TCP          11h

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/flightbookingsystemsample   1/1     1            1           37s

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/flightbookingsystemsample-b7fd6684f   1         1         1       37s

POD 상태가Running면 앱에 액세스할 수 있어야 합니다. 다음 명령을 사용하여 각 Pod 내의 앱 로그를 봅니다.

kubectl logs pod/flightbookingsystemsample-<pod-identifier-from-your-running-pod>

다음과 같은 출력이 일반적입니다.

kubectl logs pod/flightbookingsystemsample-b7fd6684f-4j8vf
15-Nov-2024 12:31:51.208 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/10.1.33
15-Nov-2024 12:31:51.211 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Nov 7 2024 22:28:55 UTC
15-Nov-2024 12:31:51.212 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 10.1.33.0
15-Nov-2024 12:31:51.212 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
15-Nov-2024 12:31:51.212 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            5.15.0-1074-azure
15-Nov-2024 12:31:51.212 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
15-Nov-2024 12:31:51.216 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/lib/jvm/msopenjdk-17
15-Nov-2024 12:31:51.216 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           17.0.13+11-LTS
15-Nov-2024 12:31:51.216 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Microsoft
15-Nov-2024 12:31:51.216 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
15-Nov-2024 12:31:51.216 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
15-Nov-2024 12:31:51.226 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
15-Nov-2024 12:31:51.226 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
15-Nov-2024 12:31:51.227 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
15-Nov-2024 12:31:51.227 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
15-Nov-2024 12:31:51.227 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
15-Nov-2024 12:31:51.227 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
15-Nov-2024 12:31:51.228 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
15-Nov-2024 12:31:51.228 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED
15-Nov-2024 12:31:51.228 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
15-Nov-2024 12:31:51.229 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
15-Nov-2024 12:31:51.229 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
15-Nov-2024 12:31:51.229 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
15-Nov-2024 12:31:51.229 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
15-Nov-2024 12:31:51.231 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path: [/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib]
15-Nov-2024 12:31:51.565 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
15-Nov-2024 12:31:51.602 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [616] milliseconds
15-Nov-2024 12:31:51.658 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
15-Nov-2024 12:31:51.659 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.1.33]
15-Nov-2024 12:31:51.689 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/AirlinesReservationSample.war]
15-Nov-2024 12:31:53.264 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
15-Nov-2024 12:31:55.155 INFO [main] com.sun.xml.ws.server.MonitorBase.createRoot Metro monitoring rootname successfully set to: com.sun.metro:pp=/,type=WSEndpoint,name=/AirlinesReservationSample-PriceAndSeats-PriceAndSeatsPort
15-Nov-2024 12:31:55.347 INFO [main] com.sun.xml.ws.transport.http.servlet.WSServletDelegate.<init> WSSERVLET14: XML-WS servlet initializing
WARNING:Error in the metadata of the table SEATS: table's row count in the metadata is 5 but 6 records have been found and loaded by UCanAccess. All will work fine, but it's better to repair your database.
15-Nov-2024 12:31:56.248 INFO [main] com.sun.xml.ws.transport.http.servlet.WSServletContextListener.contextInitialized WSSERVLET12: XML-WS context listener initializing
15-Nov-2024 12:31:56.249 INFO [main] com.sun.xml.ws.transport.http.servlet.WSServletContextListener.contextInitialized WSSERVLET12: XML-WS context listener initializing
15-Nov-2024 12:31:56.284 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/AirlinesReservationSample.war] has finished in [4,595] ms
15-Nov-2024 12:31:56.285 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/docs]
15-Nov-2024 12:31:56.315 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/docs] has finished in [30] ms
15-Nov-2024 12:31:56.316 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/examples]
15-Nov-2024 12:31:56.439 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/examples] has finished in [123] ms
15-Nov-2024 12:31:56.440 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/manager]
15-Nov-2024 12:31:56.456 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/manager] has finished in [16] ms
15-Nov-2024 12:31:56.457 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/ROOT]
15-Nov-2024 12:31:56.468 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/ROOT] has finished in [11] ms
15-Nov-2024 12:31:56.468 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/host-manager]
15-Nov-2024 12:31:56.481 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/host-manager] has finished in [13] ms
15-Nov-2024 12:31:56.484 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
15-Nov-2024 12:31:56.501 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [4897] milliseconds

kubectl get services flightbookingsystemsample 출력에서 EXTERNAL-IP를 사용하여 AKS 내에서 실행 중인 앱에 액세스합니다. 다음과 같은 출력이 일반적입니다.

kubectl get services flightbookingsystemsample
NAME                        TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)          AGE
flightbookingsystemsample   LoadBalancer   10.0.62.153   <external-IP>   8080:30534/TCP   3m28s

비고

다음 URL의 <external-IP> IP 주소를 이전에 실행한 명령의 EXTERNAL-IP 값으로 바꿉니다.

브라우저를 열고 항공 예약 시스템 샘플 페이지로 이동합니다 http://<external-IP>:8080/AirlinesReservationSample/. 브라우저는 다음 스크린샷과 유사하게 표시됩니다.

실행 중인 앱을 보여 주는 스크린샷

필요에 따라 tomcat-users.xml 모든 사용자(예: someuser@azure.com: password.)로 로그인할 수 있습니다.

자원을 정리하세요

이 모듈에서 만든 리소스에는 지속적인 비용이 발생할 수 있습니다. 리소스를 정리하려면 다음 명령을 사용하여 리소스가 포함된 리소스 그룹을 삭제합니다.

az group delete --name $AZ_RESOURCE_GROUP