Distribuera containeravbildningen till Azure Kubernetes Service

Slutförd

I den här lektionen distribuerar du en containeravbildning till Azure Kubernetes Service (AKS). Med AKS konfigurerar du Kubernetes-klustret så att det körs i önskat tillstånd via en utplacering, vilket är processen att tillhandahålla deklarativa uppdateringar till poddar och ReplicaSets. Den här tillståndsdeklarationen administreras i YAML-manifestfilen och Kubernetes-kontrollanten ändrar det aktuella tillståndet till det deklarerade tillståndet när den instrueras. Du skapar den här deployment.yml manifestfilen och instruerar AKS-instansen att köras i önskat tillstånd med poddar konfigurerade för att hämta och köra containeravbildningen flightbookingsystemsample i Azure-containerregistret som du pushade i föregående enhet. Det här manifestet definierar deklarativt en Deployment och en tjänst. Kubernetes använder Deployment-kontrollern för att hantera programmets poddar; Du kan också skapa en Deployment imperativt med kubectl create deployment.

Not

Om sessionen har inaktiverats eller om du gör det här steget vid en annan tidpunkt eller från en annan CLI, kan du behöva initiera om miljövariablerna och autentisera igen med hjälp av följande kommandon:

Återställ de resursvariabelvärden som används i installationen. Ersätt <your-subscription-ID> nedan med ID:t för den prenumeration som du använde för den här modulen. Om inloggningen visar en prenumerationsväljare väljer du samma prenumeration. Kör autentiseringskommandona en i taget. Efter az account show, bekräfta att den aktiva prenumerationen matchar konfigurationen innan du fortsätter. Om ett kommando misslyckas, stoppar du och löser felet.

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"

Distribuera en containeravbildning

Nu distribuerar du containeravbildningen flightbookingsystemsample till ditt AKS-kluster. I containerize-and-deploy-Java-app-to-Azure/Project/Airlines använder du en installerad textredigerare för att skapa en fil med namnet deployment.yml. Den här sökvägen är relativ till den överordnade katalogen där du klonade lagringsplatsen. Om du redan är i Project/Airlines, stannar du där i stället för att byta till den fullständiga relativa sökvägen igen. Skapa filen och kör kommandot senare kubectl apply -f deployment.yml från den här katalogen.

Lägg till följande innehåll i deployment.yml och spara sedan filen. Ersätt platshållaren <AZ_CONTAINER_REGISTRY> med värdet för miljövariabeln AZ_CONTAINER_REGISTRY som du angav tidigare.

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

Not

Om du använder filen deployment_solution.yml i rotmappen för projektet som utgångspunkt uppdaterar du imagen till samma registerimage och :latest tagg som visas här. Lägg också till samma Linux AMD64 nodeSelector under Distributionens spec.template.spec, tillsammans med containers. Använd inte alternativet oförändrat: dess image och nodväljare måste matcha den här modulens byggplattform.

I föregående deployment.yml innehåller filen en distribution och en tjänst. Distributionen används för att administrera en uppsättning poddar och tjänsten används för att tillåta nätverksåtkomst till poddarna. Poddarna är konfigurerade för att hämta en enda avbildning, <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latest, från Azure Container Registry. Tjänsten är konfigurerad för att tillåta inkommande HTTP-poddtrafik till port 8080, på samma sätt som du körde containeravbildningen lokalt med portargumentet -p .

Nodväljaren begränsar poddarna till Linux AMD64-noder, vilket matchar linux/amd64-avbildningen som skapades tidigare. Den tillhör driftsättningen, inte tjänsten. En selektor begränsar schemaläggningen. Det gör inte att en inkompatibel image körs på en annan arkitektur.

Innan du konfigurerar klusteråtkomst kontrollerar du att AKS-klustret har skapats i konfigurationsenheten och har slutförts utan fel. Kontrollera etableringstillstånd och den aktuella Kubernetes-versionen:

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

Fortsätt inte om kommandot misslyckas, provisioningState inte är Succeeded, eller currentKubernetesVersion inte är en icke-tom version i formatet major.minor.patch.

Följande verktygsinstruktioner gäller för den lokala Linux-, macOS- eller WSL Bash-sessionen som upprättades i installationen, inte i powershell- eller kommandotolken. Om du redan har fungerande kubectl- och kubelogin-installationer i den sessionen, behåller du dem i stället för att installera om. Kontrollera dem med kubectl version --client och kubelogin --version, och se till att kubectl uppfyller principen för versionavvikelse som stöds för klustret.

Annars ersätter du <control-plane-version> med den returnerade currentKubernetesVersion. Installera den matchande kubectl versionen och kubelogin på platser som användaren har skrivbehörighet till:

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

Båda installationssökvägarna innehåller det körbara filnamnet. Exporten PATH gäller endast för det aktuella skalet. Upprepa den i en ny session eller lägg till den i lämplig Bash-startkonfiguration. Lös eventuella installations- eller versionskontrollfel innan du fortsätter.

När båda verktygen är tillgängliga och verifierade konfigurerar du kubectl för att ansluta till ditt AKS-kluster:

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

Följande utdata är typiska:

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

Kontrollera de faktiska nodoperativsystemen och arkitekturerna innan du tillämpar manifestet:

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

Den här modulens linux/amd64 byggsökväg kräver Linux AMD64-noder. Om det inte finns några matchande noder, stoppa och åtgärda avvikelsen innan du fortsätter. Använd en AMD64-nodpool som stöds, eller återskapa, kör och pusha avbildningen för en annan Linux-nodarkitektur som stöds och uppdatera driftsättningens arkitekturväljare så att den matchar. Docker-flaggan --platform skapar eller ändrar inte en AKS-nodpool.

Från containerize-and-deploy-Java-app-to-Azure/Project/Airlines, tillämpa deployment.yml på ditt kluster:

kubectl apply -f deployment.yml

Följande utdata är typiska:

deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created

Övervaka distributionens status med hjälp av följande kommando:

kubectl get all

Följande utdata är typiska:

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

En podds Running status bekräftar inte att Tomcat har slutfört driftsättningen av programmet eller att HTTP-begäranden lyckas. Vänta på utrullningen av distributionen och följ sedan programmets startloggar:

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

En lyckad utrullning kontrollerar Kubernetes tillgänglighet. Eftersom det här manifestet inte har någon readiness-prob för applikationen är utrullningen inte ett HTTP-hälsotest. Följ loggarna tills Tomcat rapporterar att serverstarten har slutförts och distributionen av AirlinesReservationSample.war har slutförts utan fel. Tryck sedan på Ctrl+C för att sluta följa loggarna. Detta stoppar endast loggströmmen, inte containern. Om utrullningen eller programstarten misslyckas eller inte slutförs kontrollerar du loggarna och poddhändelserna i stället för att fortsätta till webbläsarkontrollen.

Följande historiska utdata illustrerar startmeddelanden från en tidigare Tomcat 10.1.33-bild. Det är inte utdata från den uppdaterade imagen i den här modulen; Använd dina egna loggar för att verifiera start i stället för att förvänta dig samma versioner, tidsstämplar eller miljöinformation:

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

Kontrollera tjänstens externa adress:

kubectl get service flightbookingsystemsample --watch

Värdet EXTERNAL-IP kan till en början vara <pending> när Azure etablerar lastbalanseraren. Det kan ta flera minuter och är inte i sig ett bevis på en misslyckad driftsättning. När en adress visas, tryck på Ctrl+C för att sluta bevaka. Om provisioneringen inte slutförs stoppar du klockan och inspekterar tjänstehändelserna med kubectl describe service flightbookingsystemsample.

Följande illustrativa utdata visar var den tilldelade adressen visas:

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

Not

Ersätt IP-adressen <external-IP> i följande URL med ditt EXTERNAL-IP värde från kommandot som du körde tidigare:

Öppna en webbläsare och besök exempelsidan för flygbokningssystemet på http://<external-IP>:8080/AirlinesReservationSample/. Bekräfta att applikationssidan svarar; enbart en Running podd eller en tilldelad IP-adress bevisar inte applikationens beredskap. Webbläsaren bör se ut ungefär så här:

Skärmbild av landningssidan för Flight Booking System som körs på Azure Kubernetes Service i en webbläsare.

Du kan också logga in med valfri användare från tomcat-users.xml – till exempel someuser@azure.com: password.

Felsök inkompatibilitet mellan avbild och plattform

Vid fel när poddar startar kontrollerar du kubectl describe pods -l app=flightbookingsystemsample, kubectl logs deployment/flightbookingsystemsample --tail=100 och kubectl get events --sort-by=.metadata.creationTimestamp. Ett CrashLoopBackOff tillstånd kan ha flera orsaker, inklusive programfel. Anta inte att varje fel är en arkitekturinkompatibilitet.

Om du bekräftar att en redan distribuerad avbildning har fel plattform upprepar du först bygget, lokal körning, avbildningskontroll, registertaggning och push-steg med matchande plattformsinställningar. När den korrigerade avbildningen har återskapats, taggats om och push-överförts under samma :latest tagg ersätter du uttryckligen de poddar som körs:

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

För det här manifestet har :latest standardvärdet imagePullPolicy: Always, så ersättningspoddar löser den aktuella registertaggen. Att använda ett oförändrat manifest på nytt utlöser inte någon utrullning. Om du har anpassat hämtningsprincipen använder du i stället en uppdaterad avbildstagg eller avbildsdigest och uppdaterar Deployment. Upprepa kontrollen av startloggen och programmets URL efter distributionen.

Rensa resurser

De resurser som du skapade i den här modulen kan medföra löpande kostnader. Om du vill rensa resurserna tar du bort resursgruppen som innehåller dem med hjälp av följande kommando:

az group delete --name $AZ_RESOURCE_GROUP