Nasazení image kontejneru do služby Azure Kubernetes Service
V této lekci nasadíte image kontejneru do služby Azure Kubernetes Service (AKS). V AKS 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 ReplicaSetů. Tato deklarace stavu se spravuje v souboru YAML manifestu a kontroler Kubernetes změní aktuální stav na deklarovaný stav po pokynu. Vytvoříte tento soubor manifestu deployment.yml a dáte instanci AKS pokyn, aby běžela v požadovaném stavu s pody nakonfigurovanými pro vyžádání a spuštění flightbookingsystemsample image kontejneru obsažené v registru kontejneru Azure, který jste odeslali v předchozí lekci. Tento manifest deklarativně definuje Deployment a Service. Kubernetes používá kontroler Deployment ke správě podů aplikace; můžete také vytvořit Deployment imperativně pomocí kubectl create deployment.
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ů:
Obnovte hodnoty proměnných zdrojů použité v nastavení. Nahraďte níže uvedené <your-subscription-ID> ID předplatného, které jste použili pro tento modul. Pokud se při přihlášení zobrazí selektor předplatného, zvolte stejné předplatné. Spusťte ověřovací příkazy po jednom. Po az account show potvrďte, že aktivní předplatné odpovídá nastavení, než budete pokračovat. Pokud příkaz selže, zastavte a vyřešte chybu.
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"
Nasazení image kontejneru
Teď nasadíte image kontejneru flightbookingsystemsample do clusteru AKS. Pomocí containerize-and-deploy-Java-app-to-Azure/Project/Airlinesnainstalovaného textového editoru vytvořte soubor s názvem deployment.yml. Tato cesta je relativní vzhledem k nadřazenému adresáři, ve kterém jste naklonovali úložiště. Pokud už jste v Project/Airlines, zůstaňte tam, místo abyste se znovu změnili na úplnou cestu. Vytvořte soubor a z tohoto adresáře spusťte následující příkaz kubectl apply -f deployment.yml.
Do deployment.yml přidejte následující obsah a pak soubor uložte.
<AZ_CONTAINER_REGISTRY> Zástupný symbol nahraďte hodnotou AZ_CONTAINER_REGISTRY proměnné prostředí, kterou jste nastavili dříve.
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
Poznámka
Pokud jako výchozí bod použijete soubor deployment_solution.yml v kořenové složce projektu, aktualizujte jeho image na stejný image registru a :latest tag, který je zde uveden. Také přidejte stejný Linux AMD64 nodeSelector pod spec.template.spec nasazení, vedle containers. Nepoužívejte alternativu beze změny: její image a selektor uzlu musí odpovídat platformě sestavení tohoto modulu.
V předchozím deployment.yml 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. Pody jsou nakonfigurované tak, <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latestaby z Azure Container Registry načítá jednu image. Služba je nakonfigurovaná tak, aby umožňovala příchozí provoz podů HTTP na port 8080, podobně jako jste spustili image kontejneru místně s argumentem -p portu.
Selektor uzlu omezuje pody na uzly Linux AMD64, které odpovídají imagi linux/amd64 vytvořené dříve. Patří do Deployment, nikoli do Service. Selektor omezuje plánování; nespustí nekompatibilní image na jiné architektuře.
Před konfigurací přístupu ke clusteru se ujistěte, že se vytvoření clusteru AKS v jednotce instalace úspěšně dokončilo. Zkontrolujte stav zřizování a aktuální verzi Kubernetes:
az aks show \
--resource-group "$AZ_RESOURCE_GROUP" \
--name "$AZ_KUBERNETES_CLUSTER" \
--query '{provisioningState:provisioningState,currentKubernetesVersion:currentKubernetesVersion}' \
--output table
Nepokračujte, pokud příkaz selže, provisioningState není Succeeded nebo currentKubernetesVersion není neprázdná verze ve formátu major.minor.patch.
Následující pokyny k nástrojům platí pro místní relaci Linuxu, macOS nebo WSL Bash vytvořenou při nastavování, nikoli nativní PowerShell nebo příkazový řádek. Pokud už máte v této relaci funkční instalace kubectl a kubelogin, zachovejte je místo přeinstalace. Zkontrolujte je pomocí kubectl version --client a kubelogin --version a ujistěte se, že kubectl splňuje zásady podporované odchylky verzí pro cluster.
V opačném případě nahraďte <control-plane-version> vráceným currentKubernetesVersion. Nainstalujte odpovídající kubectl verzi a kubelogin do umístění, do kterých má uživatel právo zápisu:
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
Obě instalační umístění zahrnují název spustitelného souboru. Export PATH se vztahuje pouze na aktuální shell; zopakujte ho v nové relaci nebo ho přidejte do odpovídající spouštěcí konfigurace Bashe. Než budete pokračovat, vyřešte případné selhání instalace nebo kontroly verzí.
Jakmile jsou oba nástroje dostupné a ověřené, nakonfigurujte kubectl tak, aby se připojil k vašemu clusteru AKS:
az aks get-credentials \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_KUBERNETES_CLUSTER
Následující výstup je typický:
Merged AZ_KUBERNETES_CLUSTER as current context in ~/.kube/config
Před použitím manifestu zkontrolujte skutečné operační systémy a architektury uzlů:
kubectl get nodes \
-o custom-columns='NAME:.metadata.name,OS:.status.nodeInfo.operatingSystem,ARCH:.status.nodeInfo.architecture'
Cesta sestavení tohoto modulu linux/amd64 vyžaduje uzly LINUX AMD64. Pokud neexistují žádné odpovídající uzly, před pokračováním zastavte a vyřešte neshodu. Použijte podporovaný fond uzlů AMD64 nebo znovu sestavte, spusťte a odešlete image pro jinou podporovanou architekturu uzlů Linuxu a aktualizujte selektor architektury nasazení tak, aby odpovídal. Možnost Docker --platform nevytvoří ani nezmění fond uzlů AKS.
Z containerize-and-deploy-Java-app-to-Azure/Project/Airlines aplikujte deployment.yml na svůj cluster:
kubectl apply -f deployment.yml
Následující výstup je typický:
deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created
Pomocí následujícího příkazu monitorujte stav nasazení:
kubectl get all
Následující výstup je typický:
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
Stav podu Running nepotvrzuje, že Tomcat dokončil nasazení aplikace nebo že požadavky HTTP proběhnou úspěšně. Počkejte na dokončení nasazování a pak sledujte spouštěcí logy aplikace:
kubectl rollout status deployment/flightbookingsystemsample --timeout=300s &&
kubectl logs deployment/flightbookingsystemsample --tail=100 --follow
Úspěšné zavedení ověřuje dostupnost Kubernetes. Vzhledem k tomu, že tento manifest nemá kontrolu připravenosti aplikace, nasazení není testem stavu HTTP. Postupujte podle protokolů, dokud Tomcat neohlásí dokončení spuštění serveru a nasazení AirlinesReservationSample.war bez chyb. Potom stiskněte Ctrl+C, abyste zastavili sledování logů. Tím se zastaví pouze stream protokolu, nikoli kontejner. Pokud se zavedení nebo spuštění aplikace nezdaří nebo se nedokončí, zkontrolujte protokoly a události podu místo pokračování ke kontrole v prohlížeči.
Následující historický výstup znázorňuje spouštěcí zprávy ze starší image Tomcat 10.1.33. Nejde o výstup z aktualizovaného image v tomto modulu; k ověření spuštění použijte vlastní protokoly a neočekávejte stejné verze, časová razítka nebo podrobnosti o prostředí:
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
Sledujte službu a zjistěte její externí adresu:
kubectl get service flightbookingsystemsample --watch
Tato EXTERNAL-IP hodnota může být <pending> na začátku, během zřizování nástroje pro vyrovnávání zatížení službou Azure. Může to trvat několik minut a samo o sobě to není důkazem selhání nasazení. Jakmile se zobrazí adresa, stiskněte klávesy Ctrl+C a zastavte sledování. Pokud se zřizování nedokončí, zastavte hodinky a zkontrolujte události služby pomocí kubectl describe service flightbookingsystemsample.
Následující ilustrativní výstup ukazuje, kde se zobrazí přiřazená adresa:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
flightbookingsystemsample LoadBalancer 10.0.62.153 <external-IP> 8080:30534/TCP 3m28s
Poznámka
Ip adresu <external-IP> v následující adrese URL nahraďte hodnotou EXTERNAL-IP příkazu, který jste předtím spustili:
Otevřete prohlížeč a přejděte na úvodní stránku ukázky systému Flight Booking System na http://<external-IP>:8080/AirlinesReservationSample/adrese . Potvrďte, že stránka aplikace reaguje; Running pod nebo přiřazená IP adresa samy o sobě neprokazují připravenost aplikace. Váš prohlížeč by měl vypadat podobně jako na následujícím snímku obrazovky:
Volitelně se můžete přihlásit jako kterýkoliv uživatel z tomcat-users.xml - například someuser@azure.com: password.
Řešení potíží s neshodou platformy bitové kopie
V případě selhání spouštění podů zkontrolujte kubectl describe pods -l app=flightbookingsystemsample, kubectl logs deployment/flightbookingsystemsample --tail=100a kubectl get events --sort-by=.metadata.creationTimestamp. Stav CrashLoopBackOff může mít několik příčin, včetně chyb aplikace; nepředpokládejte, že každé selhání je nesoulad architektury.
Pokud potvrdíte, že už nasazená image má nesprávnou platformu, nejprve zopakujte sestavení, místní spuštění, kontrolu image, označování registru a kroky nahrání image s odpovídajícími nastaveními platformy. Po úspěšném vytvoření opravené image, opětovném označení a nahrání do registru pod stejné :latest značky explicitně nahraďte spuštěné pody:
kubectl rollout restart deployment/flightbookingsystemsample &&
kubectl rollout status deployment/flightbookingsystemsample --timeout=300s
U tohoto manifestu je výchozí :latestimagePullPolicy: Always, takže náhradní pody určí aktuální tag registru. Opětovné použití beze změny samotného manifestu neaktivuje nasazení. Pokud jste přizpůsobili zásady stahování image, použijte aktualizovanou značku image nebo digest a místo toho aktualizujte nasazení. Po zavedení opakujte kontroly spouštěcího protokolu a adresy URL aplikace.
Vyčistěte zdroje
Za prostředky, které jste vytvořili v tomto modulu, můžou být účtovány průběžné náklady. Pokud chcete prostředky vyčistit, pomocí následujícího příkazu odstraňte skupinu prostředků, která je obsahuje:
az group delete --name $AZ_RESOURCE_GROUP