Distribuire l'immagine del contenitore nel servizio Azure Kubernetes

Completato

In questa unità verrà distribuita un'immagine del contenitore nel servizio Azure Kubernetes.

Con il servizio Azure Kubernetes si configurerà il cluster Kubernetes per l'esecuzione in uno stato desiderato, tramite una distribuzione, che è il processo di recapito di aggiornamenti dichiarativi ai pod e ai set di repliche. Questa dichiarazione di stato viene gestita nel file manifesto (YAML) e il controller di Kubernetes modificherà lo stato corrente nello stato dichiarato quando richiesto. Verrà creato il file manifesto deployment.yml e si indicherà al servizio Azure Kubernetes di avviare l'esecuzione in uno stato desiderato con i pod configurati per il pull e l'esecuzione dell'immagine del contenitore flightbookingsystemsample che risiede in Registro Azure Container (di cui è stato eseguito il push nell'unità precedente). Senza questo file manifesto sarebbe necessario creare, aggiornare ed eliminare manualmente i pod anziché consentire a Kubernetes di orchestrare questo processo.

Nota

Se la sessione è stata inattiva o si sta eseguendo questo passaggio in un altro momento e/o da un'altra interfaccia della riga di comando, potrebbe essere necessario inizializzare nuovamente le variabili di ambiente e ripetere l'autenticazione con i comandi dell'interfaccia della riga di comando seguenti.

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

Distribuire un'immagine del contenitore

L'immagine del contenitore flightbookingsystemsample verrà distribuita nel cluster Azure Kubernetes.

All'interno della radice del progetto, Flight-Booking-System-JavaServlets_App/Project/Airlines, creare un file denominato deployment.yml. Nell'interfaccia della riga di comando eseguire il comando seguente:

vi deployment.yml

Aggiungere il contenuto seguente a deployment.yml, quindi salvare e uscire:

Nota

Eseguire l'aggiornamento con il valore della variabile di ambiente AZ_CONTAINER_REGISTRY impostato in precedenza, ad esempio: 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

Nota

Facoltativamente, il file deployment_solution.yml nella radice del progetto include il contenuto necessario e potrebbe risultare più semplice rinominare o aggiornare il contenuto di tale file.

Nel precedente deployment.yml, si può notare che il file contiene Distribuzione e Servizio. La distribuzione viene usata per amministrare un set di pod e il servizio viene usato per consentire l'accesso di rete ai pod. Si noterà che i pod sono configurati per eseguire il pull di una singola immagine, ovvero <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latest da Registro Azure Container. Si può inoltre osservare che il servizio è configurato per consentire il traffico dei pod HTTP in ingresso alla porta 8080, in modo analogo al modo in cui è stata eseguita l'immagine del contenitore in locale con l'argomento porta -p.

A questo punto la creazione del cluster Azure Kubernetes dovrebbe essere stata completata correttamente.

Si configurerà quindi l'interfaccia della riga di comando di Azure per accedere al cluster Azure Kubernetes tramite il comando kubectl. Installare kubectl in locale usando il comando az aks install-cli. Nell'interfaccia della riga di comando eseguire il comando seguente:

az aks install-cli

Per configurare kubectl per connettersi al cluster Kubernetes, usare il comando az aks get-credentials. Nell'interfaccia della riga di comando eseguire il comando seguente:

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

Si otterrà un output simile al seguente:

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

A questo punto si indicherà al servizio Azure Kubernetes di applicare le modifiche del file deployment.yml al cluster. Nell'interfaccia della riga di comando eseguire il comando seguente:

kubectl apply -f deployment.yml

Si otterrà un output simile al seguente:

deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created

È ora possibile usare kubectl per monitorare lo stato della distribuzione. Nell'interfaccia della riga di comando eseguire il comando seguente:

kubectl get all

Si otterrà un output simile al seguente:

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

Se lo stato POD è Running, l'app dovrebbe essere accessibile.

È anche possibile visualizzare i log dell'app all'interno di ogni pod. Nell'interfaccia della riga di comando eseguire il comando seguente:

 kubectl logs pod/flightbookingsystemsample-<POD_IDENTIFIER_FROM_YOUR_RUNNING_POD>

Si otterrà un output simile al seguente:

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

È ora possibile usare EXTERNAL-IP dall'output kubectl get services flightbookingsystemsample per accedere all'app in esecuzione all'interno del servizio Azure Kubernetes.

Nota

Sostituire l'indirizzo IP seguente, 20.81.13.151, con quello di EXTERNAL-IP del comando eseguito in precedenza.

Aprire un browser e visitare la pagina di destinazione del sistema di prenotazione voli di esempio all'indirizzo http://20.81.13.151:8080/FlightBookingSystemSample

Si otterrà una pagina simile alla seguente:

Screenshot showing the running app.

Facoltativamente, è possibile accedere con qualsiasi utente da tomcat-users.xml, ad esempio someuser@azure.com: password.