Kapsayıcı görüntüsünü Azure Kubernetes Service'e dağıtma
Bu ünitede Azure Kubernetes Service'e (AKS) bir kapsayıcı görüntüsü dağıtacaksınız. AKS ile Kubernetes kümenizi, podlara ve ReplicaSet'lere bildirim temelli güncelleştirmeler sağlama işlemi olan bir dağıtım aracılığıyla istenen durumda çalışacak şekilde yapılandırabilirsiniz. Bu durum bildirimi bildirim YAML dosyasında yönetilir ve Kubernetes denetleyicisi, bildirildiğinde geçerli durumu bildirilen duruma değiştirir. AKS örneğinizin, önceki ünitede gönderdiğiniz Azure kapsayıcı kayıt defterinde bulunan kapsayıcı görüntüsünü çekip çalıştırmak üzere yapılandırılmış podlarla istenen durumda çalışmasını sağlamak için bu deployment.yml bildirim dosyasını oluşturur ve ona talimat verirsiniz. Bu manifest bildirim temelli olarak bir Dağıtım ve Hizmet tanımlar. Kubernetes, uygulamanın podlarını yönetmek için Dağıtım denetleyicisini kullanır; kubectl create deployment ile imperative olarak bir Dağıtım da oluşturabilirsiniz.
Not
Oturumunuz boştaysa veya bu adımı başka bir zamanda veya başka bir CLI'dan yapıyorsanız, aşağıdaki komutları kullanarak ortam değişkenlerinizi yeniden başlatmanız ve yeniden kimlik doğrulamanız gerekebilir:
Kurulumda kullanılan kaynak değişkeni değerlerini geri yükleyin. Aşağıdaki <your-subscription-ID> öğesini, bu modül için kullandığınız aboneliğin kimliğiyle değiştirin. Oturum açma bir abonelik seçicisi sunuyorsa, aynı aboneliği seçin. Kimlik doğrulama komutlarını teker teker çalıştırın.
az account show sonrasında, devam etmeden önce etkin aboneliğin kurulumla eşleştiğini onaylayın. Bir komut başarısız olursa durun ve hatayı çözün.
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"
Kapsayıcı görüntüsü dağıtın
flightbookingsystemsample kapsayıcı görüntüsü şimdi AKS kümenize dağıtılır.
containerize-and-deploy-Java-app-to-Azure/Project/Airlines içinde yüklü bir metin düzenleyicisi kullanarak deployment.yml adlı bir dosya oluşturun. Bu yol, depoyu klonladığınız üst dizine göreli bir yoldur. zaten Project/Airlines içindeyseniz, yeniden tam bağıl yola geçmek yerine orada kalın. Dosyayı oluşturun ve bu dizinden aşağıda verilen kubectl apply -f deployment.yml komutunu çalıştırın.
Aşağıdaki içeriği deployment.yml dosyasına ekleyin ve dosyayı kaydedin. Daha önce ayarladığınız AZ_CONTAINER_REGISTRY ortam değişkeninin değeriyle <AZ_CONTAINER_REGISTRY> yer tutucusunu değiştirin.
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
Not
Projenizin kök klasöründeki deployment_solution.yml dosyasını başlangıç noktası olarak kullanıyorsanız, görüntüsünü burada gösterilen kayıt defteri görüntüsü ve :latest etiketiyle güncelleştirin. Ayrıca Dağıtımın spec.template.spec altında, containers ile birlikte aynı Linux AMD64'ü nodeSelector ekleyin. Değiştirilmemiş alternatifi kullanmayın: görüntüsü ve düğüm seçicisi bu modülün derleme platformuyla eşleşmelidir.
Önceki deployment.yml, dosya bir dağıtım ve hizmet içerir. Dağıtım, bir dizi podu yönetmek için kullanılır ve servis podlara ağ erişimi sağlamak için kullanılır. Podlar, <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latestAzure Container Registry'den tek bir görüntü çekecek şekilde yapılandırılır. Hizmet, -p bağımsız değişkenini kullanarak kapsayıcı görüntüsünü yerel olarak çalıştırdığınız gibi, 8080 numaralı bağlantı noktasına gelen HTTP pod trafiğine izin verecek şekilde yapılandırılmıştır.
Düğüm seçici, podları daha önce oluşturulan linux/amd64 görüntüsüyle eşleşen Linux AMD64 düğümleriyle sınırlar. Service'e değil, Deployment'a aittir. Seçici zamanlamayı kısıtlar; uyumsuz bir görüntünün başka bir mimaride çalıştırılmasını sağlamaz.
Küme erişimini yapılandırmadan önce, kurulum ünitesinde AKS kümesi oluşturma işleminin başarıyla tamamlandığından emin olun. Sağlama durumunu ve geçerli Kubernetes sürümünü denetleyin:
az aks show \
--resource-group "$AZ_RESOURCE_GROUP" \
--name "$AZ_KUBERNETES_CLUSTER" \
--query '{provisioningState:provisioningState,currentKubernetesVersion:currentKubernetesVersion}' \
--output table
Komut başarısız olursa, provisioningState, Succeeded değilse veya currentKubernetesVersionmajor.minor.patch biçiminde boş olmayan bir sürüm değilse devam etmeyin.
Aşağıdaki araç yönergeleri yerel PowerShell veya Komut İstemi için değil, kurulumda kurulan yerel Linux, macOS veya WSL Bash oturumu için geçerlidir. Bu oturumda zaten çalışan kubectl ve kubelogin kurulumlarınız varsa, yeniden yüklemek yerine bunları koruyun.
kubectl version --client ve kubelogin --version ile denetleyin ve öğesinin küme için kubectl karşıladığından emin olun.
Aksi takdirde, currentKubernetesVersion öğesini döndürülen <control-plane-version> ile değiştirin. Bu eşleşen kubectl sürümü ve kubelogin öğesini kullanıcının yazabildiği konumlara yükleyin:
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
Her iki yükleme yolu da yürütülebilir dosya adını içerir.
PATH export komutu yalnızca geçerli kabuk için geçerlidir; yeni bir oturumda yineleyin veya uygun Bash başlangıç yapılandırmasına ekleyin. Devam etmeden önce yükleme veya sürüm denetimi hatalarını çözün.
Her iki araç da kullanılabilir ve doğrulandıktan sonra, kubectl öğesini AKS kümenize bağlanacak şekilde yapılandırın:
az aks get-credentials \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_KUBERNETES_CLUSTER
Aşağıdaki çıkış tipiktir:
Merged AZ_KUBERNETES_CLUSTER as current context in ~/.kube/config
Manifestı uygulamadan önce gerçek düğüm işletim sistemlerini ve mimarilerini denetleyin:
kubectl get nodes \
-o custom-columns='NAME:.metadata.name,OS:.status.nodeInfo.operatingSystem,ARCH:.status.nodeInfo.architecture'
Bu modülün linux/amd64 derleme yolu Için Linux AMD64 düğümleri gerekir. Eşleşen düğüm yoksa devam etmeden önce durun ve uyuşmazlığı çözün. Desteklenen bir AMD64 düğüm havuzu kullanın veya desteklenen başka bir Linux düğüm mimarisi için görüntüyü yeniden derleyin, oluşturun ve gönderin ve Dağıtım'ın mimari seçicisini eşleşecek şekilde güncelleştirin. Docker --platform seçeneği AKS düğümü havuzu oluşturmaz veya değiştirmez.
containerize-and-deploy-Java-app-to-Azure/Project/Airlines içinden deployment.yml dosyasını kümenize uygulayın:
kubectl apply -f deployment.yml
Aşağıdaki çıkış tipiktir:
deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created
Aşağıdaki komutu kullanarak dağıtımın durumunu izleyin:
kubectl get all
Aşağıdaki çıkış tipiktir:
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
Pod'un durumu Tomcat'in Running uygulamanın dağıtımını tamamladığını veya HTTP isteklerinin başarılı olduğunu doğrulamaz. Dağıtımın tamamlanmasını bekleyin ve ardından uygulama başlatma günlüklerini izleyin:
kubectl rollout status deployment/flightbookingsystemsample --timeout=300s &&
kubectl logs deployment/flightbookingsystemsample --tail=100 --follow
Başarılı bir dağıtım Kubernetes'in kullanılabilirliğini kontrol eder. Bu manifestte uygulama için readiness probe olmadığından, rollout bir HTTP sistem durumu testi değildir. Tomcat raporları sunucu başlatma ve AirlinesReservationSample.war dağıtımı hatasız tamamlanana kadar günlükleri takip edin. Ardından günlükleri takip etmeyi durdurmak için Ctrl+C tuşuna basın. Bu işlem kapsayıcıyı değil yalnızca günlük akışını durdurur. Dağıtım veya uygulama başlatma işlemi başarısız olursa veya tamamlanmazsa, tarayıcı denetimine devam etmek yerine günlükleri ve pod olaylarını inceleyin.
Aşağıdaki geçmiş çıktı, önceki bir Tomcat 10.1.33 görüntüsünden gelen başlangıç iletilerini gösterir. Bu modüldeki güncellenmiş imajın çıktısı değildir; aynı sürümleri, zaman damgalarını veya ortam ayrıntılarını beklemek yerine başlatmayı doğrulamak için kendi günlüklerinizi kullanın:
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
Servisi dış adresi için izleyin:
kubectl get service flightbookingsystemsample --watch
EXTERNAL-IP değeri, Azure yük dengeleyiciyi sağlarken başlangıçta <pending> olabilir. Bu işlem birkaç dakika sürebilir ve başarısız bir dağıtımın tek başına kanıtı değildir. Bir adres görüntülendiğinde izlemeyi durdurmak için Ctrl++ basın. Provisioning tamamlanmazsa, izlemeyi durdurun ve kubectl describe service flightbookingsystemsample ile hizmet olaylarını inceleyin.
Aşağıdaki örnek çıktı, atanan adresin nerede göründüğünü gösterir:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
flightbookingsystemsample LoadBalancer 10.0.62.153 <external-IP> 8080:30534/TCP 3m28s
Not
Aşağıdaki URL'deki IP adresini <external-IP> daha önce yürüttüğünüz komuttaki değerinizle EXTERNAL-IP değiştirin:
Bir tarayıcı açın ve http://<external-IP>:8080/AirlinesReservationSample/ adresinde Uçuş Rezervasyon Sistemi Örneği giriş sayfasını ziyaret edin. Uygulama sayfasının yanıt verdiğini onaylayın; pod Running veya atanmış bir IP tek başına uygulamanın hazır olduğunu kanıtlamaz. Tarayıcınız aşağıdaki ekran görüntüsüne benzer görünmelidir:
İsteğe bağlı olarak tomcat-users.xml herhangi bir kullanıcıyla oturum açabilirsiniz. Örneğin, someuser@azure.com: password.
Görüntü platformu uyuşmazlığı sorunlarını giderme
Pod başlatma hataları için kubectl logs deployment/flightbookingsystemsample --tail=100, kubectl get events --sort-by=.metadata.creationTimestamp ve kubectl describe pods -l app=flightbookingsystemsample öğelerini inceleyin. Bir CrashLoopBackOff durumunun, uygulama hataları da dahil olmak üzere çeşitli nedenleri olabilir; her başarısızlığın bir mimari uyuşmazlığı olduğunu varsaymayın.
Zaten dağıtılmış bir görüntünün yanlış platforma sahip olduğunu onaylarsanız, önce derlemeyi, yerel çalıştırmayı, görüntü incelemeyi, kayıt deposu etiketlemeyi ve eşleşen platform ayarlarıyla gönderme adımlarını yineleyin. Düzeltilen imaj başarıyla yeniden oluşturulduktan, yeniden etiketlendikten ve aynı :latest etiket altına gönderildikten sonra, çalışan podları açıkça değiştirin:
kubectl rollout restart deployment/flightbookingsystemsample &&
kubectl rollout status deployment/flightbookingsystemsample --timeout=300s
Bu bildirim için imagePullPolicy: Always, varsayılan olarak :latest değerine ayarlanır; bu nedenle değiştirme podları geçerli kayıt defteri etiketini çözer. Değişmemiş bir manifesti tek başına yeniden uygulama, bir rollout’u tetiklemez. Çekme ilkesini özelleştirdiyseniz, bunun yerine güncelleştirilmiş bir görüntü etiketi veya digest kullanın ve Dağıtımı güncelleştirin. Dağıtımdan sonra başlangıç günlüğü ve uygulama URL'si denetimlerini yineleyin.
Kaynakları temizle
Bu modülde oluşturduğunuz kaynaklar devam eden maliyetler doğurabilir. Kaynakları temizlemek için, aşağıdaki komutu kullanarak bunları içeren kaynak grubunu silin:
az group delete --name $AZ_RESOURCE_GROUP