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

완료됨

이 단원에서는 Azure Kubernetes Service에 컨테이너 이미지를 배포합니다.

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

참고 항목

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

AZ_RESOURCE_GROUP=javacontainerizationdemorg

AZ_CONTAINER_REGISTRY=<YOUR_CONTAINER_REGISTRY>

AZ_KUBERNETES_CLUSTER=javacontainerizationdemoaks

AZ_LOCATION=<YOUR_AZURE_REGION>

AZ_KUBERNETES_CLUSTER_DNS_PREFIX=<YOUR_UNIQUE_DNS_PREFIX_TO_ACCESS_YOUR_AKS_CLUSTER>

az login

az acr login -n $AZ_CONTAINER_REGISTRY

컨테이너 이미지 배포

여기서는 flightbookingsystemsample 컨테이너 이미지를 Azure Kubernetes 클러스터에 배포합니다.

프로젝트 루트 Flight-Booking-System-JavaServlets_App/Project/Airlines 내에서 deployment.yml이라는 파일을 만듭니다. CLI에서 다음 명령을 실행합니다.

vi deployment.yml

다음 내용을 deployment.yml에 추가한 다음, 저장하고 종료합니다.

참고 항목

이전에 설정한 AZ_CONTAINER_REGISTRY 환경 변수 값으로 업데이트합니다. 예를 들면 다음과 같습니다 javacontainerizationdemoacr.

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 포트 인수를 사용하여 컨테이너 이미지를 로컬로 실행한 방식과 마찬가지로 포트 8080으로 들어오는 HTTP Pod 트래픽을 허용하도록 서비스가 구성된 것도 알 수 있습니다.

지금까지 Azure Kubernetes 클러스터 만들기가 성공적으로 완료되어야 합니다.

kubectl 명령을 통해 Azure Kubernetes 클러스터에 액세스하도록 Azure CLI를 구성해야 합니다. az aks install-cli 명령을 사용하여 kubectl을 로컬로 설치합니다. CLI에서 다음 명령을 실행합니다.

az aks install-cli

az aks get-credentials 명령을 사용하여 Kubernetes 클러스터에 연결하도록 kubectl을 구성합니다. CLI에서 다음 명령을 실행합니다.

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

다음과 유사한 결과가 표시됩니다.

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

이제 Azure Kubernetes Service에 deployment.yml 변경 내용을 클러스터에 적용하도록 지시합니다. CLI에서 다음 명령을 실행합니다.

kubectl apply -f deployment.yml

다음과 유사한 결과가 표시됩니다.

deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created

이제 kubectl를 사용하여 배포 상태를 모니터링할 수 있습니다. CLI에서 다음 명령을 실행합니다.

kubectl get all

다음과 유사한 결과가 표시됩니다.

NAME                                   READY   STATUS    RESTARTS   AGE
pod/flightbookingsystemsample-75647c4c98-v4v4r   1/1     Running   2          13d

NAME                      TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)          AGE
service/kubernetes        ClusterIP      10.0.0.1      <none>         443/TCP          66d
service/flightbookingsystemsample   LoadBalancer   10.0.34.128   20.81.13.151   8080:30265/TCP   66d

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/flightbookingsystemsample   1/1     1            1           66d

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/flightbookingsystemsample-75647c4c98   1         1         1       66d
replicaset.apps/flightbookingsystemsample-7564c58f55   0         0         0       13d

POD 상태가 Running인 경우 앱에 액세스할 수 있습니다.

각 Pod 내에서도 앱 로그를 볼 수 있습니다. CLI에서 다음 명령을 실행합니다.

 kubectl logs pod/flightbookingsystemsample-<POD_IDENTIFIER_FROM_YOUR_RUNNING_POD>

다음과 유사한 결과가 표시됩니다.

NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
07-Oct-2021 18:31:14.073 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/8.5.71
07-Oct-2021 18:31:14.164 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Sep 9 2021 18:43:14 UTC
07-Oct-2021 18:31:14.164 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 8.5.71.0
07-Oct-2021 18:31:14.165 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
07-Oct-2021 18:31:14.166 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            5.4.0-1051-azure
07-Oct-2021 18:31:14.166 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
07-Oct-2021 18:31:14.166 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/openjdk-11
07-Oct-2021 18:31:14.167 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           11.0.12+7
07-Oct-2021 18:31:14.167 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
07-Oct-2021 18:31:14.167 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
07-Oct-2021 18:31:14.168 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
07-Oct-2021 18:31:14.261 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
07-Oct-2021 18:31:14.261 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
07-Oct-2021 18:31:14.261 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED
07-Oct-2021 18:31:14.262 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
07-Oct-2021 18:31:14.262 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
07-Oct-2021 18:31:14.262 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
07-Oct-2021 18:31:14.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
07-Oct-2021 18:31:14.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
07-Oct-2021 18:31:14.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
07-Oct-2021 18:31:14.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
07-Oct-2021 18:31:14.264 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
07-Oct-2021 18:31:14.264 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
07-Oct-2021 18:31:14.264 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
07-Oct-2021 18:31:14.265 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
07-Oct-2021 18:31:14.265 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
07-Oct-2021 18:31:14.265 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [{4}].
07-Oct-2021 18:31:14.266 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
07-Oct-2021 18:31:14.361 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k  25 Mar 2021]
07-Oct-2021 18:31:14.763 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
07-Oct-2021 18:31:14.962 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
07-Oct-2021 18:31:15.071 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 6497 ms
07-Oct-2021 18:31:15.771 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
07-Oct-2021 18:31:15.772 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/8.5.71]
07-Oct-2021 18:31:16.261 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web app archive [/usr/local/tomcat/webapps/FlightBookingSystemSample.war]
07-Oct-2021 18:31:30.782 INFO [localhost-startStop-1] 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.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.sun.xml.ws.policy.privateutil.MethodUtil (file:/usr/local/tomcat/webapps/FlightBookingSystemSample/WEB-INF/lib/webservices-rt-2.3.1.jar) to method sun.reflect.misc.MethodUtil.invoke(java.lang.reflect.Method,java.lang.Object,java.lang.Object[])
WARNING: Please consider reporting this to the maintainers of com.sun.xml.ws.policy.privateutil.MethodUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
07-Oct-2021 18:31:53.370 INFO [localhost-startStop-1] com.sun.xml.ws.server.MonitorBase.createRoot Metro monitoring rootname successfully set to: com.sun.metro:pp=/,type=WSEndpoint,name=/FlightBookingSystemSample-PriceAndSeats-PriceAndSeatsPort
07-Oct-2021 18:31:54.864 INFO [localhost-startStop-1] com.sun.xml.ws.transport.http.servlet.WSServletDelegate.<init> WSSERVLET14: JAX-WS servlet initializing
07-Oct-2021 18:32:02.869 INFO [localhost-startStop-1] com.sun.xml.ws.transport.http.servlet.WSServletContextListener.contextInitialized WSSERVLET12: JAX-WS context listener initializing
07-Oct-2021 18:32:02.870 INFO [localhost-startStop-1] com.sun.xml.ws.transport.http.servlet.WSServletContextListener.contextInitialized WSSERVLET12: JAX-WS context listener initializing
07-Oct-2021 18:32:03.069 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web app archive [/usr/local/tomcat/webapps/FlightBookingSystemSample.war] has finished in [46,808] ms
07-Oct-2021 18:32:03.165 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
07-Oct-2021 18:32:03.267 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 48195 ms

이제 kubectl get services flightbookingsystemsample 출력의 EXTERNAL-IP를 사용하여 Azure Kubernetes Service 내에서 실행 중인 앱에 액세스할 수 있습니다.

참고 항목

다음의 IP 주소(20.81.13.151)를 이전에 실행한 명령의 EXTERNAL-IP 주소로 바꿉니다.

브라우저를 열고 플라이트 예약 시스템 샘플 방문 페이지를 방문합니다. http://20.81.13.151:8080/FlightBookingSystemSample

다음과 유사한 페이지가 표시됩니다.

Screenshot showing the running app.

필요에 따라 ;에서 tomcat-users.xml모든 사용자로 로그인할 수 있습니다. 예를 들면 someuser@azure.com: password다음과 같습니다.