De containerimage uitrollen naar Azure Kubernetes Service

Voltooid

In deze eenheid implementeert u een containerimage in Azure Kubernetes Service (AKS). Met AKS configureert u uw Kubernetes-cluster om te worden uitgevoerd in een gewenste status via een implementatie. Dit is het proces voor het leveren van declaratieve updates voor pods en ReplicaSets. Deze statusdeclaratie wordt beheerd in het YAML-manifestbestand en de Kubernetes-controller wijzigt de huidige status in de gedeclareerde status wanneer deze wordt geïnstrueerd. U maakt dit deployment.yml manifestbestand en geeft uw AKS-exemplaar opdracht om uit te voeren in een gewenste toestand met pods die zijn geconfigureerd voor het ophalen en uitvoeren van de flightbookingsystemsample containerafbeelding in het Azure-containerregister dat u in de vorige eenheid hebt gepusht. Dit manifest definieert declaratief een Deployment en een service. Kubernetes gebruikt de Deployment-controller om de pods van de toepassing te beheren; u kunt ook een Deployment imperatief maken met kubectl create deployment.

Notitie

Als uw sessie is uitgeschakeld of als u deze stap op een ander moment of vanuit een andere CLI uitvoert, moet u mogelijk uw omgevingsvariabelen opnieuw initialiseren en opnieuw verifiëren met behulp van de volgende opdrachten:

Herstel de waarden van resourcevariabelen die in de setup worden gebruikt. Vervang <your-subscription-ID> hieronder door de id van het abonnement dat u voor deze module hebt gebruikt. Als aanmelding een abonnementskiezer weergeeft, kiest u datzelfde abonnement. Voer de verificatieopdrachten één voor één uit. Controleer daarna az account show of het actieve abonnement overeenkomt met de installatie voordat u doorgaat. Als een opdracht mislukt, stopt u en lost u de fout op.

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 account set --subscription "<your-subscription-ID>"
az account show --output table
az acr login --name "$AZ_CONTAINER_REGISTRY"

Een containerimage deployen

U implementeert nu de flightbookingsystemsample containerimage in uw AKS-cluster. Gebruik containerize-and-deploy-Java-app-to-Azure/Project/Airlineseen geïnstalleerde teksteditor om een bestand met de naam deployment.yml te maken. Dit pad is relatief ten opzichte van de bovenliggende map waar u de repository hebt gekloond. Als u al in Project/Airlines bent, blijft u daar in plaats van opnieuw over te schakelen naar het volledige pad. Maak het bestand en voer de volgende kubectl apply -f deployment.yml opdracht later uit vanuit deze map.

Voeg de volgende inhoud toe aan deployment.yml en sla het bestand op. Vervang de <AZ_CONTAINER_REGISTRY> tijdelijke aanduiding door de waarde van de AZ_CONTAINER_REGISTRY omgevingsvariabele die u eerder hebt ingesteld.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flightbookingsystemsample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flightbookingsystemsample
  template:
    metadata:
      labels:
        app: flightbookingsystemsample
    spec:
      nodeSelector:
        kubernetes.io/os: linux
        kubernetes.io/arch: amd64
      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

Notitie

Als u het bestand deployment_solution.yml in de hoofdmap van uw project als uitgangspunt gebruikt, werkt u de image bij naar dezelfde registry-image en :latest tag die hier worden weergegeven. Voeg ook dezelfde Linux AMD64 nodeSelector toe onder de spec.template.spec van Deployment, naast containers. Gebruik het alternatief niet ongewijzigd: de installatiekopie en de knooppuntselector moeten overeenkomen met het buildplatform van deze module.

In de voorgaande deployment.yml bevat het bestand een implementatie en een service. De implementatie wordt gebruikt voor het beheren van een set pods en de service wordt gebruikt om netwerktoegang tot de pods toe te staan. De pods zijn geconfigureerd om een enkele installatiekopie, <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latest, van Azure Container Registry op te halen. De service is geconfigureerd om inkomend HTTP-verkeer naar de pods naar poort 8080 toe te staan, vergelijkbaar met hoe u de container image lokaal hebt uitgevoerd met het -p poortargument.

De knooppuntkiezer beperkt de pods tot Linux AMD64-knooppunten, die overeenkomen met de linux/amd64 image die eerder is gebouwd. Het hoort bij de Deployment, niet bij de service. Een selector beperkt de planning; het zorgt er niet voor dat een incompatibele image wordt uitgevoerd op een andere architectuur.

Voordat u clustertoegang configureert, moet u ervoor zorgen dat het maken van het AKS-cluster in de instellingseenheid is voltooid. Controleer de inrichtingsstatus ervan en de huidige Kubernetes-versie:

az aks show \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --name "$AZ_KUBERNETES_CLUSTER" \
    --query '{provisioningState:provisioningState,currentKubernetesVersion:currentKubernetesVersion}' \
    --output table

Ga niet verder als de opdracht mislukt, Succeeded niet currentKubernetesVersion is of provisioningState geen niet-lege versie in major.minor.patch-indeling is.

De volgende hulpprogramma-instructies zijn van toepassing op de lokale Linux-, macOS- of WSL Bash-sessie die is ingesteld in de installatie, niet op systeemeigen PowerShell of opdrachtprompt. Als u in die sessie al werkende kubectl- en kubelogin-installaties hebt, moet u deze behouden in plaats van opnieuw te installeren. Controleer deze met kubectl version --client en kubelogin --version en zorg ervoor dat kubectl voldoet aan het ondersteunde versieverschilbeleid voor het cluster.

Vervang anders <control-plane-version> door de geretourneerde currentKubernetesVersion. Installeer die overeenkomende kubectl versie en kubelogin op schrijfbare locaties voor de gebruiker:

KUBECTL_VERSION="<control-plane-version>"
if [[ "$KUBECTL_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    mkdir -p "$HOME/.local/bin" &&
    az aks install-cli \
        --client-version "$KUBECTL_VERSION" \
        --install-location "$HOME/.local/bin/kubectl" \
        --kubelogin-install-location "$HOME/.local/bin/kubelogin" &&
    export PATH="$HOME/.local/bin:$PATH" &&
    kubectl version --client &&
    kubelogin --version
else
    printf 'Stop: set KUBECTL_VERSION to the returned major.minor.patch version.\n' >&2
    false
fi

Beide installatiepaden bevatten de uitvoerbare bestandsnaam. De PATH export is alleen van toepassing op de huidige shell. Herhaal deze in een nieuwe sessie of voeg deze toe aan de juiste Bash-opstartconfiguratie. Los eventuele installatie- of versiecontrolefouten op voordat u doorgaat.

Nadat beide hulpprogramma's beschikbaar en geverifieerd zijn, configureert u kubectl om verbinding te maken met uw AKS-cluster:

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

De volgende uitvoer is gebruikelijk:

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

Controleer de werkelijke knooppuntbesturingssystemen en architecturen voordat u het manifest toepast:

kubectl get nodes \
    -o custom-columns='NAME:.metadata.name,OS:.status.nodeInfo.operatingSystem,ARCH:.status.nodeInfo.architecture'

Voor het buildpad van linux/amd64 deze module zijn Linux AMD64-knooppunten vereist. Als er geen overeenkomende knooppunten zijn, stop en los de mismatch op voordat u doorgaat. Gebruik een ondersteunde AMD64-knooppuntgroep of bouw, voer deze uit en push de image voor een andere ondersteunde Linux-knooppuntarchitectuur en werk de architectuurkiezer van de implementatie bij zodat deze overeenkomt. De Docker-optie --platform maakt of wijzigt geen AKS-knooppuntgroep.

Pas containerize-and-deploy-Java-app-to-Azure/Project/Airlinesdeployment.yml toe op uw cluster:

kubectl apply -f deployment.yml

De volgende uitvoer is gebruikelijk:

deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created

Controleer de status van de implementatie met behulp van de volgende opdracht:

kubectl get all

De volgende uitvoer is gebruikelijk:

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

De status van een pod Running bevestigt niet dat Tomcat klaar is met het implementeren van de toepassing of dat HTTP-aanvragen zijn geslaagd. Wacht tot de deployment is uitgerold en volg vervolgens de opstartlogboeken van de toepassing:

kubectl rollout status deployment/flightbookingsystemsample --timeout=300s &&
kubectl logs deployment/flightbookingsystemsample --tail=100 --follow

Een geslaagde implementatie controleert de beschikbaarheid van Kubernetes. Omdat dit manifest geen application readiness probe heeft, is de roll-out geen HTTP-healthcheck. Volg de logboeken totdat Tomcat rapporteert dat de server is opgestart en de deployment van AirlinesReservationSample.war zonder fouten is voltooid. Druk vervolgens op Ctrl+C om de logboeken niet meer te volgen. Hiermee stopt u alleen de logboekstream, niet de container. Als de implementatie of het opstarten van de toepassing mislukt of niet is voltooid, inspecteert u de logboeken en podgebeurtenissen in plaats van door te gaan met de browsercontrole.

De volgende historische uitvoer illustreert opstartberichten van een eerdere Tomcat 10.1.33-image. Het is geen uitvoer van de bijgewerkte image in deze module; gebruik uw eigen logboeken om het opstarten te verifiëren in plaats van dezelfde versies, tijdstempels of omgevingsgegevens te verwachten:

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

Controleer de service voor het externe adres:

kubectl get service flightbookingsystemsample --watch

De EXTERNAL-IP waarde kan in eerste instantie zijn <pending> terwijl Azure de load balancer in richt. Dit kan enkele minuten duren en is zelf geen bewijs van een mislukte implementatie. Wanneer een adres wordt weergegeven, drukt u op Ctrl+C om te stoppen met volgen. Als het inrichten niet is voltooid, stopt u de watch en inspecteert u de service-gebeurtenissen met kubectl describe service flightbookingsystemsample.

In de volgende illustratieve uitvoer ziet u waar het toegewezen adres wordt weergegeven:

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

Notitie

Vervang het IP-adres <external-IP> in de volgende URL door uw EXTERNAL-IP waarde uit de opdracht die u eerder hebt uitgevoerd:

Open een browser en ga naar de voorbeeld-landingspagina van het vluchtboekingssysteem op http://<external-IP>:8080/AirlinesReservationSample/. Bevestig dat de toepassingspagina reageert; een Running pod of een toegewezen IP-adres alleen bewijst niet dat de toepassing gereed is. Uw browser moet er ongeveer uitzien als in de volgende schermopname:

Schermopname van de landingspagina van flight booking system die wordt uitgevoerd op Azure Kubernetes Service in een browser.

U kunt zich desgewenst aanmelden met elke gebruiker vanuit tomcat-users.xml , someuser@azure.com: passwordbijvoorbeeld.

Problemen met een mismatch tussen installatiekopie en platform oplossen

Voor opstartfouten in pods, inspecteer kubectl describe pods -l app=flightbookingsystemsample, kubectl logs deployment/flightbookingsystemsample --tail=100en kubectl get events --sort-by=.metadata.creationTimestamp. Een CrashLoopBackOff toestand kan verschillende oorzaken hebben, waaronder toepassingsfouten; ga er niet van uit dat elke fout een architectuurmismatch is.

Als u bevestigt dat een reeds geïmplementeerde image het verkeerde platform heeft, herhaalt u eerst de build, lokale uitvoering, image-inspectie, registry-tagging en pushstappen met de overeenkomende platforminstellingen. Nadat de gecorrigeerde image opnieuw is opgebouwd, opnieuw is getagd en onder dezelfde :latest tag is gepusht, vervangt u de actieve pods expliciet:

kubectl rollout restart deployment/flightbookingsystemsample &&
kubectl rollout status deployment/flightbookingsystemsample --timeout=300s

Voor dit manifest wordt :latest standaard ingesteld op imagePullPolicy: Always, zodat vervangende pods de huidige registrytag oplossen. Het opnieuw toepassen van een ongewijzigd manifest activeert op zichzelf geen implementatie. Als u het pull-beleid hebt aangepast, gebruikt u in plaats daarvan een bijgewerkte imagetag of digest en werkt u de Deployment bij. Herhaal de controles van het opstartlogboek en de toepassings-URL na de implementatie.

De hulpbronnen opschonen

De middelen die u in deze module hebt gemaakt, kunnen doorlopende kosten veroorzaken. Als u de resources wilt opschonen, verwijdert u de resourcegroep die deze bevat met behulp van de volgende opdracht:

az group delete --name $AZ_RESOURCE_GROUP