Wdrażanie obrazu kontenera w usłudze Azure Kubernetes Service
W tej lekcji wdrożysz obraz kontenera w usłudze Azure Kubernetes Service (AKS). Usługa AKS umożliwia skonfigurowanie klastra Kubernetes do uruchamiania w żądanym stanie za pośrednictwem wdrożenia, czyli procesu dostarczania deklaratywnych aktualizacji zasobników i zestawów replik. Deklaracja tego stanu jest zarządzana w pliku YAML manifestu, a kontroler Kubernetes zmienia bieżący stan na zadeklarowany, gdy otrzyma odpowiednią instrukcję. Utworzysz ten plik manifestu deployment.yml i poinstruujesz swoją instancję AKS, aby działała w żądanym stanie z zasobnikami skonfigurowanymi do pobierania i uruchamiania obrazu kontenera zawartego w rejestrze kontenerów Azure, który został przesłany w poprzedniej części. Ten manifest deklaratywnie definiuje Deployment i Service. Platforma Kubernetes używa kontrolera wdrażania do zarządzania zasobnikami aplikacji; Możesz również utworzyć wdrożenie w sposób imperatywujący za pomocą polecenia kubectl create deployment.
Notatka
Jeśli sesja uległa bezczynności lub wykonujesz ten krok w innym momencie lub z innego interfejsu wiersza polecenia, może być konieczne ponowne zainicjowanie zmiennych środowiskowych i ponowne uwierzytelnienie przy użyciu następujących poleceń:
Przywróć wartości zmiennych zasobów używane w instalacji. Zastąp poniżej <your-subscription-ID> identyfikatorem subskrypcji użytej dla tego modułu. Jeśli podczas logowania pojawi się selektor subskrypcji, wybierz tę samą subskrypcję. Uruchom polecenia uwierzytelniania pojedynczo. Po az account show upewnij się, że aktywna subskrypcja jest zgodna z konfiguracją przed kontynuowaniem. Jeśli polecenie zakończy się niepowodzeniem, zatrzymaj i rozwiąż problem.
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"
Wdrażanie obrazu kontenera
Teraz wdrożysz obraz kontenera flightbookingsystemsample w klastrze usługi AKS. W containerize-and-deploy-Java-app-to-Azure/Project/Airlinesprogramie użyj zainstalowanego edytora tekstów, aby utworzyć plik o nazwie deployment.yml. Ta ścieżka jest względna względem katalogu nadrzędnego, w którym sklonowano repozytorium. Jeśli jesteś już w Project/Airlines, pozostań tam, zamiast ponownie przechodzić do pełnej ścieżki względnej. Utwórz plik i uruchom następne polecenie kubectl apply -f deployment.yml z tego katalogu.
Dodaj następującą zawartość do pliku deployment.yml, a następnie zapisz plik.
<AZ_CONTAINER_REGISTRY> Zastąp symbol zastępczy wartością AZ_CONTAINER_REGISTRY zmiennej środowiskowej ustawionej wcześniej.
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
Notatka
Jeśli używasz pliku deployment_solution.yml w folderze głównym projektu jako punktu początkowego, zaktualizuj jego obraz tak, aby używał tego samego obrazu rejestru i tagu :latest pokazanego tutaj. Dodaj również ten sam system Linux AMD64 nodeSelector pod spec.template.spec we wdrożeniu, obok containers. Nie używaj niezmienionej alternatywy: jej obraz i selektor węzła muszą być zgodne z platformą kompilacji tego modułu.
W poprzednim deployment.yml plik zawiera wdrożenie i usługę. Wdrożenie służy do administrowania zestawem zasobników, a usługa służy do zezwalania na dostęp sieciowy do zasobników. Zasobniki są skonfigurowane do pobierania pojedynczego obrazu z usługi Azure Container Registry, <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latest. Usługa jest skonfigurowana tak, aby zezwalała na przychodzący ruch zasobników HTTP do portu 8080, podobnie jak w przypadku lokalnego uruchomienia obrazu kontenera z argumentem -p portu.
Selektor węzłów ogranicza zasobniki do węzłów AMD64 z systemem Linux, pasujących do utworzonego linux/amd64 wcześniej obrazu. Należy do Deployment, a nie do Service. Selektor ogranicza planowanie; nie powoduje uruchomienia niezgodnego obrazu na innej architekturze.
Przed skonfigurowaniem dostępu do klastra upewnij się, że tworzenie klastra usługi AKS w module konfiguracji zostało ukończone pomyślnie. Sprawdź stan aprowizacji i bieżącą wersję Kubernetes:
az aks show \
--resource-group "$AZ_RESOURCE_GROUP" \
--name "$AZ_KUBERNETES_CLUSTER" \
--query '{provisioningState:provisioningState,currentKubernetesVersion:currentKubernetesVersion}' \
--output table
Nie kontynuuj, jeśli polecenie zakończy się niepowodzeniem, provisioningState nie ma wartości Succeeded lub currentKubernetesVersion nie jest niepustą wersją w formacie major.minor.patch.
Poniższe instrukcje narzędzia dotyczą lokalnej sesji powłoki Bash systemu Linux, macOS lub WSL ustanowionej w konfiguracji, a nie natywnej sesji programu PowerShell ani Wiersza polecenia. Jeśli masz już działające instalacje kubectl i kubelogin w tej sesji, zachowaj je zamiast ponownie instalować. Sprawdź je za pomocą kubelogin --version i kubectl oraz upewnij się, że jest zgodny z kubectl version --client dla klastra.
W przeciwnym razie zastąp <control-plane-version> zwróconą wartością currentKubernetesVersion. Zainstaluj pasującą kubectl wersję i kubelogin w lokalizacjach z możliwością zapisu użytkownika:
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
Obie ścieżki instalacji zawierają nazwę pliku wykonywalnego. Eksport PATH dotyczy tylko bieżącej powłoki; powtórz go w nowej sesji lub dodaj go do odpowiedniej konfiguracji uruchamiania powłoki Bash. Przed kontynuowaniem rozwiąż wszelkie błędy instalacji lub sprawdzania wersji.
Po udostępnieniu i zweryfikowaniu obu narzędzi skonfiguruj kubectl, aby połączyć się z klastrem AKS:
az aks get-credentials \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_KUBERNETES_CLUSTER
Następujące dane wyjściowe są typowe:
Merged AZ_KUBERNETES_CLUSTER as current context in ~/.kube/config
Przed zastosowaniem manifestu sprawdź rzeczywiste systemy operacyjne i architektury węzłów:
kubectl get nodes \
-o custom-columns='NAME:.metadata.name,OS:.status.nodeInfo.operatingSystem,ARCH:.status.nodeInfo.architecture'
Ścieżka kompilacji tego modułu linux/amd64 wymaga węzłów AMD64 z systemem Linux. Jeśli nie ma pasujących węzłów, zatrzymaj i rozwiąż niezgodność przed kontynuowaniem. Użyj obsługiwanej puli węzłów AMD64 lub ponownie skompiluj, uruchom i wypchnij obraz dla innej obsługiwanej architektury węzła systemu Linux i zaktualizuj selektor architektury wdrożenia, aby był zgodny. Opcja Docker --platform nie tworzy ani nie zmienia puli węzłów usługi AKS.
W pliku containerize-and-deploy-Java-app-to-Azure/Project/Airlines zastosuj deployment.yml do klastra:
kubectl apply -f deployment.yml
Następujące dane wyjściowe są typowe:
deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created
Monitoruj stan wdrożenia przy użyciu następującego polecenia:
kubectl get all
Następujące dane wyjściowe są typowe:
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
Stan zasobnika Running nie potwierdza, że serwer Tomcat zakończył wdrażanie aplikacji lub że żądania HTTP zakończyły się powodzeniem. Poczekaj na zakończenie wdrażania, a następnie śledź dzienniki uruchamiania aplikacji:
kubectl rollout status deployment/flightbookingsystemsample --timeout=300s &&
kubectl logs deployment/flightbookingsystemsample --tail=100 --follow
Pomyślne wdrożenie potwierdza dostępność Kubernetes. Ponieważ ten manifest nie ma sondy gotowości aplikacji, proces wdrażania nie jest testem kondycji HTTP. Śledź logi, aż Tomcat zgłosi zakończenie uruchamiania serwera, a wdrażanie AirlinesReservationSample.war zakończy się bez błędów. Następnie naciśnij klawisze Ctrl+C, aby zatrzymać śledzenie dzienników. Spowoduje to zatrzymanie tylko strumienia dziennika, a nie kontenera. Jeśli wdrożenie lub uruchomienie aplikacji zakończy się niepowodzeniem lub nie zostanie ukończone, sprawdź dzienniki i zdarzenia poda zamiast przechodzić do sprawdzania przeglądarki.
Poniższe historyczne dane wyjściowe ilustrują komunikaty uruchamiania z wcześniejszego obrazu tomcat 10.1.33. Nie jest to dane wyjściowe ze zaktualizowanego obrazu w tym module; użyj własnych dzienników, aby zweryfikować uruchamianie, zamiast oczekiwać tych samych wersji, sygnatur czasowych lub szczegółów środowiska:
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
Obserwuj usługę pod kątem adresu zewnętrznego:
kubectl get service flightbookingsystemsample --watch
Wartość EXTERNAL-IP może początkowo być <pending>, podczas gdy platforma Azure aprowizuje moduł równoważenia obciążenia. Może to potrwać kilka minut i nie jest dowodem na to, że wdrożenie nie powiodło się. Gdy pojawi się adres, naciśnij klawisze Ctrl+C, aby przestać obserwować. Jeśli aprowizacja nie zostanie ukończona, zatrzymaj obserwację i sprawdź zdarzenia usługi za pomocą polecenia kubectl describe service flightbookingsystemsample.
Następujące ilustracyjne dane wyjściowe pokazują, gdzie pojawia się przypisany adres:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
flightbookingsystemsample LoadBalancer 10.0.62.153 <external-IP> 8080:30534/TCP 3m28s
Notatka
Zastąp adres IP <external-IP> w następującym adresie URL wartością EXTERNAL-IP, którą uzyskałeś z wcześniej wykonanego polecenia.
Otwórz przeglądarkę i odwiedź stronę docelową Flight Booking System Sample pod adresem http://<external-IP>:8080/AirlinesReservationSample/. Upewnij się, że strona aplikacji odpowiada; sam Running zasobnik lub przypisany adres IP nie potwierdza gotowości aplikacji. Przeglądarka powinna wyglądać podobnie do poniższego zrzutu ekranu:
Opcjonalnie możesz zalogować się za pomocą dowolnego użytkownika z tomcat-users.xml — na przykład someuser@azure.com: password.
Rozwiązywanie problemów z niezgodnością obrazu i platformy
W przypadku błędów uruchamiania zasobnika sprawdź kubectl describe pods -l app=flightbookingsystemsample, kubectl logs deployment/flightbookingsystemsample --tail=100i kubectl get events --sort-by=.metadata.creationTimestamp. Stan CrashLoopBackOff może mieć kilka przyczyn, w tym błędy aplikacji. Nie zakładaj, że każda awaria wynika z niedopasowania architektury.
Jeśli potwierdzisz, że już wdrożony obraz ma niewłaściwą platformę, najpierw powtórz kroki kompilacji, uruchamiania lokalnego, inspekcji obrazów, tagowania obrazu dla rejestru i wypychania przy użyciu pasujących ustawień platformy. Po pomyślnym odbudowaniu, ponownym oznaczeniu i wypchnięciu poprawionego obrazu pod tym samym :latest tagiem jawnie zastąp uruchomione zasobniki:
kubectl rollout restart deployment/flightbookingsystemsample &&
kubectl rollout status deployment/flightbookingsystemsample --timeout=300s
W przypadku tego manifestu :latest wartością domyślną jest imagePullPolicy: Always, więc zasobniki zastępcze ustalają bieżący tag rejestru. Ponowne zastosowanie niezmienionego manifestu nie powoduje wyzwolenia wdrożenia. Jeśli polityka pobierania została dostosowana, użyj zaktualizowanego tagu obrazu lub digestu i zamiast tego zaktualizuj wdrożenie. Powtórz sprawdzanie dziennika uruchamiania i adresu URL aplikacji po wdrożeniu.
Uprzątnij zasoby
Zasoby utworzone w tym module mogą powodować bieżące koszty. Aby wyczyścić zasoby, usuń grupę zasobów zawierającą je za pomocą następującego polecenia:
az group delete --name $AZ_RESOURCE_GROUP