Bereitstellen des Containerimages in Azure Kubernetes Service
In dieser Lerneinheit stellen Sie ein Containerimage für Azure Kubernetes Service bereit.
Mit Azure Kubernetes Service konfigurieren Sie Ihren Kubernetes-Cluster für die Ausführung in einem gewünschten Zustand über eine Bereitstellung, bei der deklarative Updates für Pods und ReplicaSets bereitgestellt werden. Diese Zustandsdeklaration wird in der Manifestdatei (YAML-Datei) verwaltet, und der Kubernetes-Controller ändert den aktuellen Zustand in den deklarierten Zustand, wenn er dazu angewiesen wird. Sie erstellen diese Manifestdatei deployment.yml
und weisen Ihre Azure Kubernetes Service-Instanz an, die Ausführung in einem gewünschten Zustand mit Pods vorzunehmen, die zum Pullen/Ausführen des flightbookingsystemsample
-Containerimages konfiguriert sind, das sich in Azure Container Registry befindet (es wurde in der vorherigen Lerneinheit in ACR gepusht). Ohne diese Manifestdatei müssten Sie Pods manuell erstellen, aktualisieren und löschen, anstatt diesen Vorgang von Kubernetes orchestrieren zu lassen.
Hinweis
Wenn sich Ihre Sitzung im Leerlauf befindet oder Sie diesen Schritt zu einem anderen Zeitpunkt und/oder über eine andere CLI ausführen, müssen Sie möglicherweise Ihre Umgebungsvariablen erneut initialisieren und sich mit den folgenden CLI-Befehlen erneut authentifizieren.
AZ_RESOURCE_GROUP=javacontainerizationdemorg
AZ_CONTAINER_REGISTRY=<IHRE_CONTAINERREGISTRIERUNG>
AZ_KUBERNETES_CLUSTER=javacontainerizationdemoaks
AZ_LOCATION=<IHRE_AZURE-REGION>
AZ_KUBERNETES_CLUSTER_DNS_PREFIX=<IHR_EINDEUTIGES_DNS_PRÄFIX_FÜR_ZUGRIFF_AUF_IHREN_AKS_CLUSTER>
az login
az acr login -n $AZ_CONTAINER_REGISTRY
Bereitstellen eines Containerimages
Hier stellen Sie dieses flightbookingsystemsample
-Containerimage in Ihrem Azure Kubernetes-Cluster bereit.
Erstellen Sie im Stammverzeichnis Ihres Projekts (Flight-Booking-System-JavaServlets_App/Project/Airlines) eine Datei namens „deployment.yml“. Führen Sie folgenden Befehl in der CLI aus:
vi deployment.yml
Fügen Sie der Datei „deployment.yml“ den folgenden Inhalt hinzu, und speichern und schließen Sie die Datei dann:
Hinweis
Führen Sie mit dem zuvor festgelegten Wert Ihrer Umgebungsvariablen AZ_CONTAINER_REGISTRY eine Aktualisierung aus, zum Beispiel 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
Hinweis
Optional enthält die Datei deployment_solution.yml
im Stammverzeichnis Ihres Projekts die erforderlichen Inhalte. Möglicherweise ist es einfacher, den Inhalt dieser Datei umzubenennen/zu aktualisieren.
In der oben genannten Datei deployment.yml
erkennen Sie, dass diese eine Bereitstellung und einen Dienst enthält. Die Bereitstellung wird verwendet, um eine Gruppe von Pods zu verwalten, und der Dienst wird verwendet, um Netzwerkzugriff auf die Pods zu ermöglichen. Sie werden feststellen, dass die Pods so konfiguriert sind, dass sie ein einzelnes Image pullen, nämlich <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latest
aus Azure Container Registry. Sie werden außerdem feststellen, dass der Dienst so konfiguriert ist, dass eingehender HTTP-Poddatenverkehr an Port 8080 zugelassen wird. Dies entspricht der Art und Weise, wie Sie das Containerimage lokal mit dem -p
-Portargument ausgeführt haben.
Die Erstellung ihres Azure Kubernetes-Clusters sollte nun erfolgreich abgeschlossen worden sein.
Sie müssen die Azure CLI für den Zugriff auf Ihren Azure Kubernetes-Cluster über den kubectl
-Befehl konfigurieren. Installieren Sie kubectl lokal mit dem az aks install-cli
-Befehl. Führen Sie folgenden Befehl in der CLI aus:
az aks install-cli
Konfigurieren Sie kubectl, um mithilfe des az aks get-credentials
-Befehls eine Verbindung mit Ihrem Kubernetes-Cluster herzustellen. Führen Sie folgenden Befehl in der CLI aus:
az aks get-credentials --resource-group $AZ_RESOURCE_GROUP --name $AZ_KUBERNETES_CLUSTER
Die Ausgabe sieht in etwa wie folgt aus:
Merged AZ_KUBERNETES_CLUSTER as current context in ~/.kube/config
Nun weisen Sie Azure Kubernetes Service an, die Änderungen in „deployment.yml“ auf Ihren Cluster anzuwenden. Führen Sie folgenden Befehl in der CLI aus:
kubectl apply -f deployment.yml
Die Ausgabe sieht in etwa wie folgt aus:
deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created
Sie können jetzt kubectl
verwenden, um den Status der Bereitstellung zu überwachen. Führen Sie folgenden Befehl in der CLI aus:
kubectl get all
Die Ausgabe sieht in etwa wie folgt aus:
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
Wenn Ihr POD
-Status Running
lautet, sollte auf die App zugegriffen werden können.
Sie können auch die App-Protokolle in jedem Pod anzeigen. Führen Sie folgenden Befehl in der CLI aus:
kubectl logs pod/flightbookingsystemsample-<POD_IDENTIFIER_FROM_YOUR_RUNNING_POD>
Die Ausgabe sieht in etwa wie folgt aus:
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
Sie können jetzt die EXTERNAL-IP
aus Ihrer kubectl get services flightbookingsystemsample
-Ausgabe verwenden, um auf die ausgeführte App in Azure Kubernetes Service zuzugreifen.
Hinweis
Ersetzen Sie die IP-Adresse (20.81.13.151) durch die von EXTERNAL-IP aus dem zuvor ausgeführten Befehl.
Öffnen Sie einen Browser, und besuchen Sie die Angebotsseite des Flight Booking System-Beispiels unter http://20.81.13.151:8080/FlightBookingSystemSample.
Die Seite sieht ähnlich wie die folgende aus:
Sie können sich optional mit jedem Benutzer bzw. jeder Benutzerin von tomcat-users.xml
anmelden, z. B. mit someuser@azure.com: password
.