Implantar a imagem de contêiner no Serviço Kubernetes do Azure
Nesta unidade, você implantará uma imagem de contêiner no Serviço Kubernetes do Azure.
Com o Serviço Kubernetes do Azure, você configurará seu Cluster Kubernetes para ser executado em um estado desejado por meio de uma Implantação, que é o processo de fornecer atualizações declarativas para Pods e ReplicaSets. Essa declaração de estado é administrada no arquivo de manifesto (YAML), e o controlador Kubernetes alterará o estado atual para o estado declarado quando instruído. Você criará esse deployment.yml
arquivo de manifesto e instruirá seu Serviço Kubernetes do Azure a ser executado em um estado desejado com pods configurados para extrair/executar a flightbookingsystemsample
imagem de contêiner que reside no Registro de Contêiner do Azure (que enviamos por push na unidade anterior). Sem esse arquivo de manifesto, você teria que criar, atualizar e excluir pods manualmente em vez de deixar o Kubernetes orquestrar o processo.
Nota
Se sua sessão estiver ociosa ou se você estiver executando essa etapa em outro momento e/ou de outra CLI, talvez seja necessário reinicializar as variáveis de ambiente e autenticar novamente com os seguintes comandos da CLI.
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
Implantar uma imagem de contêiner
Aqui, você implantará a imagem de flightbookingsystemsample
contêiner em seu Cluster Kubernetes do Azure.
Dentro da raiz do seu projeto, Flight-Booking-System-JavaServlets_App/Project/Airlines, crie um arquivo chamado deployment.yml. Execute o seguinte comando na sua CLI:
vi deployment.yml
Adicione o seguinte conteúdo ao deployment.yml e, em seguida, salve e saia:
Nota
Atualize com o valor da variável de ambiente AZ_CONTAINER_REGISTRY que você definiu anteriormente; por exemplo, 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
Opcionalmente, o deployment_solution.yml
arquivo na raiz do seu projeto contém o conteúdo necessário, você pode achar mais fácil renomear/atualizar o conteúdo desse arquivo.
No anterior deployment.yml
, você notará que o arquivo contém uma Implantação e um Serviço. A implantação é usada para administrar um conjunto de pods, e o serviço é usado para permitir o acesso de rede aos pods. Você notará que os pods estão configurados para extrair uma única imagem, o <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latest
do Registro de Contêiner do Azure. Você também notará que o serviço está configurado para permitir o tráfego de pod HTTP de entrada para a porta 8080, semelhante à maneira como você executou a imagem do contêiner localmente com o -p
argumento port.
Até agora, sua criação do Cluster Kubernetes do Azure deve ter sido concluída com êxito.
Você desejará configurar sua CLI do Azure para acessar seu Cluster Kubernetes do Azure por meio do kubectl
comando. Instale kubectl localmente usando o az aks install-cli
comando. Execute o seguinte comando na sua CLI:
az aks install-cli
Configure o kubectl para se conectar ao cluster do Kubernetes usando o az aks get-credentials
comando. Execute o seguinte comando na sua CLI:
az aks get-credentials --resource-group $AZ_RESOURCE_GROUP --name $AZ_KUBERNETES_CLUSTER
Você obterá uma saída semelhante à seguinte:
Merged AZ_KUBERNETES_CLUSTER as current context in ~/.kube/config
Agora você instruirá o Serviço Kubernetes do Azure a aplicar deployment.yml alterações ao seu cluster. Execute o seguinte comando na sua CLI:
kubectl apply -f deployment.yml
Você obterá uma saída semelhante à seguinte:
deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created
Agora você pode usar kubectl
para monitorar o status da implantação. Execute o seguinte comando na sua CLI:
kubectl get all
Você obterá uma saída semelhante à seguinte:
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 o seu POD
estado for Running
, a aplicação deve estar acessível.
Você também pode visualizar os logs do aplicativo dentro de cada pod. Execute o seguinte comando na sua CLI:
kubectl logs pod/flightbookingsystemsample-<POD_IDENTIFIER_FROM_YOUR_RUNNING_POD>
Você obterá uma saída semelhante à seguinte:
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
Agora você pode usar o da sua kubectl get services flightbookingsystemsample
saída para acessar o EXTERNAL-IP
aplicativo em execução no Serviço Kubernetes do Azure.
Nota
Substitua o endereço IP a seguir (20.81.13.151) pelo do seu EXTERNAL-IP a partir do comando que você executou anteriormente.
Abra um navegador e visite a página inicial de exemplo do sistema de reserva de voos em http://20.81.13.151:8080/FlightBookingSystemSample
Você receberá uma página semelhante a esta:
Opcionalmente, você pode entrar com qualquer usuário de tomcat-users.xml
, por exemplo, someuser@azure.com: password
.