Nasazení image kontejneru do služby Azure Kubernetes Service

Dokončeno

V této lekci nasadíte image kontejneru do služby Azure Kubernetes Service.

Pomocí služby Azure Kubernetes Service nakonfigurujete cluster Kubernetes tak, aby běžel v požadovaném stavu prostřednictvím nasazení, což je proces poskytování deklarativních aktualizací podů a sad replik. Tato deklarace stavu je spravována v souboru manifestu (YAML) a kontroler Kubernetes změní aktuální stav na deklarovaný stav při zadání pokynu. Vytvoříte tento soubor manifestu deployment.yml a dáte službě Azure Kubernetes Service pokyn, aby běžel v požadovaném stavu s pody nakonfigurovanými ke stažení nebo spuštění image kontejneru flightbookingsystemsample, která se nachází ve službě Azure Container Registry (kterou jsme nasdílili v předchozí lekci). Bez tohoto souboru manifestu byste museli ručně vytvářet, aktualizovat a odstraňovat pody místo toho, abyste umožnili orchestraci procesu Kubernetes.

Poznámka

Pokud vaše relace vypršela nebo tento krok provádíte v jiném okamžiku nebo z jiného rozhraní příkazového řádku, možná budete muset znovu inicializovat proměnné prostředí a znovu provést ověření pomocí následujících příkazů rozhraní příkazového řádku.

AZ_RESOURCE_GROUP=javacontainerizationdemorg

AZ_CONTAINER_REGISTRY=<YOUR_CONTAINER_REGISTRY>

AZ_KUBERNETES_CLUSTER=javacontainerizationdemoaks

AZ_LOCATION=<YOUR_AZURE_REGION>

AZ_KUBERNETES_CLUSTER_DNS_PREFIX=<VAŠ_UNIQUE_DNS_PREFIX_PRO_PŘÍSTUP_K_VAŠEMU_AKS_CLUSTER>

az login

az acr login -n $AZ_CONTAINER_REGISTRY

Nasazení image kontejneru

Tady nasadíte image kontejneru flightbookingsystemsample do clusteru Azure Kubernetes.

V kořenovém adresáři vašeho projektu Flight-Booking-System-JavaServlets_App/Project/Airlines vytvořte soubor s názvem deployment.yml. V rozhraní příkazového řádku spusťte následující příkaz:

vi deployment.yml

Do deployment.yml přidejte následující obsah a pak ho uložte a ukončete:

Poznámka

Aktualizujte hodnotu proměnné prostředí AZ_CONTAINER_REGISTRY, kterou jste nastavili dříve; například 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

Poznámka

Volitelně deployment_solution.yml soubor v kořenovém adresáři projektu obsahuje potřebný obsah; Možná budete moct snadněji přejmenovat nebo aktualizovat obsah tohoto souboru.

V předchozím deployment.ymlsi všimnete, že soubor obsahuje nasazení a službu. Nasazení se používá ke správě sady podů a služba se používá k povolení síťového přístupu k podům. Všimněte si, že pody jsou nakonfigurované tak, aby načítály jednu image, <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latest ze služby Azure Container Registry. Všimněte si také, že je služba nakonfigurovaná tak, aby umožňovala příchozí provoz podů HTTP na port 8080, podobně jako jste spustili image kontejneru místně s argumentem portu -p.

Vytvoření clusteru Azure Kubernetes by teď mělo být úspěšně dokončeno.

Azure CLI budete chtít nakonfigurovat pro přístup ke clusteru Azure Kubernetes prostřednictvím příkazu kubectl. Nainstalujte kubectl místně pomocí příkazu az aks install-cli. V rozhraní příkazového řádku spusťte následující příkaz:

az aks install-cli

Nakonfigurujte kubectl pro připojení ke clusteru Kubernetes pomocí příkazu az aks get-credentials. V rozhraní příkazového řádku spusťte následující příkaz:

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

Zobrazí se výstup podobný následujícímu:

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

Nyní udělíte službě Azure Kubernetes Service pokyn, aby na váš cluster aplikovala změny z deployment.yml. V rozhraní příkazového řádku spusťte následující příkaz:

kubectl apply -f deployment.yml

Zobrazí se výstup podobný následujícímu:

deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created

Teď můžete použít kubectl ke sledování stavu nasazení. V rozhraní příkazového řádku spusťte následující příkaz:

kubectl get all

Zobrazí se výstup podobný následujícímu:

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

Pokud je váš stav PODRunning, měla by být aplikace přístupná.

Protokoly aplikace můžete zobrazit také v jednotlivých podech. V rozhraní příkazového řádku spusťte následující příkaz:

 kubectl logs pod/flightbookingsystemsample-<POD_IDENTIFIER_FROM_YOUR_RUNNING_POD>

Zobrazí se výstup podobný následujícímu:

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

Teď můžete použít EXTERNAL-IP z výstupu kubectl get services flightbookingsystemsample pro přístup ke spuštěné aplikaci ve službě Azure Kubernetes Service.

Poznámka

Nahraďte IP adresu v následujícím (20.81.13.151) IP adresou vašeho EXTERNAL-IP z příkazu, který jste předtím spustili.

Otevřete prohlížeč a přejděte na úvodní stránku Ukázky rezervačního systému letů na http://20.81.13.151:8080/FlightBookingSystemSample

Zobrazí se stránka podobná této:

Snímek obrazovky se spuštěnou aplikací

Volitelně se můžete přihlásit s libovolným uživatelem z tomcat-users.xml; například someuser@azure.com: password.