Menyebarkan gambar kontainer ke Azure Kubernetes Service

Selesai

Di unit ini, Anda menyebarkan gambar kontainer ke Azure Kubernetes Service (AKS). Dengan AKS, Anda mengonfigurasi kluster Kubernetes untuk berjalan dalam keadaan yang diinginkan melalui penyebaran, yang merupakan proses penyediaan pembaruan deklaratif untuk pod dan ReplicaSets. Deklarasi status ini dikelola dalam file YAML manifes, dan pengontrol Kubernetes mengubah status saat ini ke status yang dinyatakan ketika diinstruksikan. Anda membuat file manifes deployment.yml ini dan menginstruksikan instans AKS Anda untuk berjalan dalam keadaan yang diinginkan dengan pod yang dikonfigurasi untuk menarik dan menjalankan flightbookingsystemsample gambar kontainer yang terkandung dalam registri kontainer Azure yang Anda dorong di unit sebelumnya. Manifes ini secara deklaratif mendefinisikan Deployment dan Service. Kubernetes menggunakan Deployment controller untuk mengelola pod aplikasi; Anda juga dapat membuat Deployment secara imperatif dengan kubectl create deployment.

Nota

Jika sesi Anda telah berhenti karena tidak aktif, atau jika Anda melakukan langkah ini pada waktu atau dari CLI yang berbeda, Anda mungkin harus menginisialisasi ulang variabel lingkungan dan mengotentikasi ulang dengan menggunakan perintah berikut:

Pulihkan nilai variabel resource yang digunakan dalam pengaturan. Ganti <your-subscription-ID> di bawah ini dengan ID langganan yang Anda gunakan untuk modul ini. Jika proses masuk menyajikan pemilih langganan, pilih langganan yang sama. Jalankan perintah autentikasi satu per satu. Setelah az account show, konfirmasikan bahwa langganan aktif cocok dengan konfigurasi sebelum melanjutkan. Jika perintah gagal, hentikan dan atasi kesalahan.

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"

Menyebarkan gambar kontainer

Sekarang Anda menyebarkan flightbookingsystemsample gambar kontainer ke kluster AKS Anda. Di containerize-and-deploy-Java-app-to-Azure/Project/Airlines, gunakan editor teks yang diinstal untuk membuat file bernama deployment.yml. Jalur ini relatif terhadap direktori induk tempat Anda mengkloning repositori. Jika Anda sudah berada di Project/Airlines, tetap di sana daripada mengubah ke jalur relatif penuh lagi. Buat file dan jalankan perintah selanjutnya kubectl apply -f deployment.yml dari direktori ini.

Tambahkan konten berikut ke deployment.yml, lalu simpan file. Ganti placeholder <AZ_CONTAINER_REGISTRY> dengan nilai variabel lingkungan AZ_CONTAINER_REGISTRY yang Anda tetapkan sebelumnya.

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

Nota

Jika Anda menggunakan file deployment_solution.yml di folder akar proyek Anda sebagai titik awal, perbarui image-nya ke image registri dan tag :latest yang sama yang ditampilkan di sini. Tambahkan juga Linux AMD64 nodeSelector yang sama di bawah spec.template.spec milik Deployment, bersama containers. Jangan gunakan alternatif apa adanya: pemilih gambar dan simpulnya harus cocok dengan platform build modul ini.

Di deployment.yml sebelumnya, file berisi penyebaran dan layanan. Penyebaran digunakan untuk mengelola sekumpulan pod, dan layanan digunakan untuk mengizinkan akses jaringan ke sekumpulan pod. Pod dikonfigurasi untuk mengambil satu citra, <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latest, dari Azure Container Registry. Layanan ini dikonfigurasi untuk memungkinkan lalu lintas pod HTTP masuk ke port 8080, mirip dengan cara Anda menjalankan gambar kontainer secara lokal dengan -p argumen port.

Pemilih simpul membatasi pod ke simpul Linux AMD64, yang sesuai dengan image linux/amd64 yang dibuat sebelumnya. Ini milik Deployment, bukan Service. Selector membatasi penjadwalan; itu tidak membuat image yang tidak kompatibel berjalan pada arsitektur lain.

Sebelum mengonfigurasi akses kluster, pastikan pembuatan kluster AKS di unit penyiapan berhasil diselesaikan. Periksa status provisi dan versi Kubernetes saat ini:

az aks show \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --name "$AZ_KUBERNETES_CLUSTER" \
    --query '{provisioningState:provisioningState,currentKubernetesVersion:currentKubernetesVersion}' \
    --output table

Jangan lanjutkan jika perintah gagal, provisioningState bukan currentKubernetesVersion, atau major.minor.patch bukan versi yang tidak kosong dalam format Succeeded.

Instruksi alat berikut berlaku untuk sesi Linux, macOS, atau WSL Bash lokal yang dibuat dalam penyiapan, bukan PowerShell asli atau Prompt Perintah. Jika Anda sudah memiliki instalasi kubectl dan kubelogin yang berfungsi dalam sesi tersebut, pertahankan alih-alih menginstal ulang. Periksa dengan kubectl version --client dan kubelogin --version, dan pastikan bahwa memenuhi kubectl untuk kluster.

Jika tidak, ganti <control-plane-version> dengan yang dikembalikan currentKubernetesVersion. Instal versi yang cocok kubectl dan kubelogin ke lokasi yang dapat ditulis pengguna:

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

Kedua jalur penginstalan mencakup nama file yang dapat dieksekusi. Ekspor PATH hanya berlaku untuk shell saat ini; ulangi dalam sesi baru atau tambahkan ke konfigurasi startup Bash yang sesuai. Atasi kegagalan penginstalan atau pemeriksaan versi sebelum melanjutkan.

Setelah kedua alat tersedia dan diverifikasi, konfigurasikan kubectl untuk terhubung ke kluster AKS Anda:

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

Output berikut ini umum:

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

Periksa sistem operasi dan arsitektur node aktual sebelum menerapkan manifes:

kubectl get nodes \
    -o custom-columns='NAME:.metadata.name,OS:.status.nodeInfo.operatingSystem,ARCH:.status.nodeInfo.architecture'

Jalur build modul linux/amd64 ini memerlukan node Linux AMD64. Jika tidak ada simpul yang cocok, hentikan dan atasi ketidakcocokan sebelum melanjutkan. Gunakan kumpulan simpul AMD64 yang didukung, atau bangun kembali, jalankan, dan dorong gambar untuk arsitektur simpul Linux lain yang didukung dan perbarui pemilih arsitektur Penyebaran agar sesuai. Opsi Docker --platform tidak membuat atau mengubah kumpulan simpul AKS.

Dari containerize-and-deploy-Java-app-to-Azure/Project/Airlines, terapkan deployment.yml ke kluster Anda:

kubectl apply -f deployment.yml

Output berikut ini umum:

deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created

Pantau status penyebaran dengan menggunakan perintah berikut:

kubectl get all

Output berikut ini umum:

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

Status pod Running tidak mengonfirmasi bahwa Tomcat telah selesai menyebarkan aplikasi atau bahwa permintaan HTTP berhasil. Tunggu rollout deployment, lalu ikuti log startup aplikasi:

kubectl rollout status deployment/flightbookingsystemsample --timeout=300s &&
kubectl logs deployment/flightbookingsystemsample --tail=100 --follow

Peluncuran dinyatakan berhasil jika ketersediaan Kubernetes diperiksa. Karena manifes ini tidak memiliki pemeriksaan kesiapan aplikasi, rollout tersebut bukan uji kesiapan HTTP. Ikuti log hingga Tomcat melaporkan bahwa startup server telah selesai dan penyebaran AirlinesReservationSample.war telah selesai tanpa kesalahan. Lalu tekan Ctrl+C untuk berhenti mengikuti log. Ini hanya menghentikan aliran log, bukan kontainer. Jika peluncuran atau startup aplikasi gagal atau tidak selesai, periksa log dan peristiwa pod alih-alih melanjutkan ke pemeriksaan browser.

Output historis berikut mengilustrasikan pesan startup dari gambar Tomcat 10.1.33 sebelumnya. Ini bukan output dari image yang diperbarui dalam modul ini; gunakan log Anda sendiri untuk memverifikasi startup daripada mengharapkan versi, tanda waktu, atau detail lingkungan yang sama:

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

Pantau layanan untuk alamat eksternalnya:

kubectl get service flightbookingsystemsample --watch

Nilai EXTERNAL-IP awalnya dapat berstatus <pending> sementara Azure menyediakan load balancer. Ini dapat memakan waktu beberapa menit dan bukan bukti kegagalan deployment dengan sendirinya. Saat alamat muncul, tekan Ctrl+C untuk berhenti menonton. Jika provisioning tidak selesai, hentikan pemantauan dan periksa peristiwa layanan dengan kubectl describe service flightbookingsystemsample.

Output ilustrasi berikut menunjukkan tempat alamat yang ditetapkan muncul:

NAME                        TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)          AGE
flightbookingsystemsample   LoadBalancer   10.0.62.153   <external-IP>   8080:30534/TCP   3m28s

Nota

Ganti alamat <external-IP> IP di URL berikut dengan nilai Anda EXTERNAL-IP dari perintah yang sebelumnya Anda jalankan:

Buka browser dan kunjungi contoh halaman muka Sistem Pemesanan Penerbangan di http://<external-IP>:8080/AirlinesReservationSample/. Konfirmasikan bahwa halaman aplikasi merespons; Running pod atau IP yang ditetapkan saja tidak membuktikan kesiapan aplikasi. Browser Anda akan terlihat mirip dengan cuplikan layar berikut:

Cuplikan layar halaman arahan Sistem Pemesanan Penerbangan yang berjalan di Azure Kubernetes Service di browser.

Anda dapat secara opsional masuk dengan pengguna mana pun dari tomcat-users.xml - misalnya, someuser@azure.com: password.

Mengatasi ketidakcocokan image-platform

Untuk kegagalan startup pod, periksa kubectl describe pods -l app=flightbookingsystemsample, kubectl logs deployment/flightbookingsystemsample --tail=100, dan kubectl get events --sort-by=.metadata.creationTimestamp. Keadaan CrashLoopBackOff dapat memiliki beberapa penyebab, termasuk kesalahan aplikasi; jangan asumsikan setiap kegagalan adalah ketidakcocokan arsitektur.

Jika Anda mengonfirmasi bahwa gambar yang sudah disebarkan memiliki platform yang salah, pertama-tama ulangi build, eksekusi lokal, inspeksi gambar, penandaan registri, dan langkah pendorongan dengan pengaturan platform yang cocok. Setelah image yang dikoreksi berhasil dibangun kembali, di-retag, dan di-push di bawah tag yang sama :latest, ganti pod yang sedang berjalan secara eksplisit:

kubectl rollout restart deployment/flightbookingsystemsample &&
kubectl rollout status deployment/flightbookingsystemsample --timeout=300s

Untuk manifes ini, :latest default ke imagePullPolicy: Always, sehingga pod pengganti menggunakan tag registri saat ini. Menerapkan kembali manifes yang tidak berubah saja tidak memicu peluncuran. Jika Anda menyesuaikan kebijakan pull, gunakan tag image yang diperbarui atau digest dan perbarui Deployment sebagai gantinya. Ulangi pemeriksaan log startup dan URL aplikasi setelah peluncuran.

Membersihkan sumber daya

Sumber daya yang Anda buat dalam modul ini mungkin dikenakan biaya berkelanjutan. Untuk membersihkan sumber daya, hapus grup sumber daya yang berisinya, dengan menggunakan perintah berikut:

az group delete --name $AZ_RESOURCE_GROUP