コンテナー イメージを Azure Kubernetes Service にデプロイする
このユニットでは、コンテナー イメージを Azure Kubernetes Service (AKS) にデプロイします。 AKS では、 デプロイを介して目的の状態で実行されるように Kubernetes クラスターを構成します。これは、ポッドと ReplicaSet に宣言型の更新を提供するプロセスです。 この状態宣言はマニフェスト YAML ファイルで管理され、指示されると Kubernetes コントローラーによって現在の状態が宣言された状態に変更されます。 この deployment.yml マニフェスト ファイルを作成し、前のユニットでプッシュした Azure コンテナー レジストリに含まれる flightbookingsystemsample コンテナー イメージをプルして実行するように構成されたポッドを使用して、目的の状態で実行するように AKS インスタンスに指示します。 このマニフェストは、Deploymentとサービスを宣言によって定義します。 Kubernetes は Deployment コントローラーを使用してアプリケーションのポッドを管理します。また、kubectl create deployment を使用して命令型で Deployment を作成することもできます。
注
セッションがアイドル状態になった場合、または別の時点または別の CLI からこの手順を実行している場合は、次のコマンドを使用して環境変数を再初期化し、再認証する必要があります。
セットアップで使用されたリソース変数の値を復元します。 以下の <your-subscription-ID> を、このモジュールで使用したサブスクリプションの ID に置き換えます。 サインインにサブスクリプション セレクターが表示される場合は、同じサブスクリプションを選択します。 認証コマンドを 1 つずつ順番に実行します。
az account show後、続行する前に、アクティブなサブスクリプションがセットアップと一致することを確認してください。 コマンドが失敗した場合は、停止して、エラーを解決してください。
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"
コンテナー イメージをデプロイする
次に、 flightbookingsystemsample コンテナー イメージを AKS クラスターにデプロイします。
containerize-and-deploy-Java-app-to-Azure/Project/Airlinesで、インストールされているテキスト エディターを使用して、deployment.ymlという名前のファイルを作成します。 このパスは、リポジトリを複製した親ディレクトリに対する相対パスです。 既に Project/Airlines にいる場合は、完全な絶対パスにもう一度変更するのではなく、そこにとどまります。 ファイルを作成し、後でこのディレクトリから kubectl apply -f deployment.yml コマンドを実行してください。
次の内容を deployment.ymlに追加し、ファイルを保存します。
<AZ_CONTAINER_REGISTRY> プレースホルダーを、先ほど設定した AZ_CONTAINER_REGISTRY 環境変数の値に置き換えます。
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
注
プロジェクトの root フォルダーにある deployment_solution.yml ファイルを開始点として使用する場合は、そのイメージをここに示す同じレジストリ イメージと :latest タグに更新します。 また、デプロイのspec.template.specの下に、nodeSelectorと並べて同じ Linux AMD64 containersを追加します。 代替を変更せずに使用しないでください。そのイメージとノード セレクターは、このモジュールのビルド プラットフォームと一致している必要があります。
上記の deployment.ymlでは、ファイルにはデプロイとサービスが含まれています。 デプロイはポッドのセットを管理するために使用され、サービスはポッドへのネットワーク アクセスを許可するために使用されます。 ポッドは、Azure Container Registry から 1 つのイメージ ( <AZ_CONTAINER_REGISTRY>.azurecr.io/flightbookingsystemsample:latest) をプルするように構成されています。 このサービスは、ポート 8080 への受信 HTTP ポッド トラフィックを許可するように構成されています。これは、 -p ポート引数を使用してコンテナー イメージをローカルで実行した方法と同様です。
ノード セレクターは、ポッドを Linux AMD64 ノードに制限し、前にビルドした linux/amd64 イメージと一致させます。 これは、サービスではなくデプロイに属します。 セレクターはスケジュールを制限します。互換性のないイメージを別のアーキテクチャで実行できるようにはなりません。
クラスター アクセスを構成する前に、セットアップ ユニットでの AKS クラスターの作成が正常に完了したことを確認してください。 プロビジョニングの状態と現在の Kubernetes バージョンを確認してください。
az aks show \
--resource-group "$AZ_RESOURCE_GROUP" \
--name "$AZ_KUBERNETES_CLUSTER" \
--query '{provisioningState:provisioningState,currentKubernetesVersion:currentKubernetesVersion}' \
--output table
コマンドが失敗した場合、 provisioningState が Succeededされていない場合、または currentKubernetesVersion が major.minor.patch 形式の空でないバージョンでない場合は、続行しないでください。
次のツールの手順は、ネイティブの PowerShell やコマンド プロンプトではなく、セットアップで確立されたローカルの Linux、macOS、または WSL Bash セッションに適用されます。 そのセッションで既に動作する kubectl および kubelogin インストールがある場合は、再インストールするのではなく、そのまま保持します。
kubectl version --client と kubelogin --version を使用して、それらを確認し、kubectl が、クラスターでサポートされるバージョン差異ポリシーを満たしていることを確認します。
それ以外の場合は、返されたcurrentKubernetesVersionで<control-plane-version>を置き換えてください。 一致する kubectl バージョンと kubelogin をユーザーが書き込み可能な場所にインストールしてください:
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
どちらのインストール パスにも実行可能ファイル名が含まれています。
PATH エクスポートは、現在のシェルにのみ適用されます。新しいセッションでも繰り返すか、適切な Bash 起動設定ファイルに追加します。 続行する前に、インストールまたはバージョン チェックの失敗を解決してください。
両方のツールが利用可能であることを確認したら、AKS クラスターに接続するように kubectl を構成します。
az aks get-credentials \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_KUBERNETES_CLUSTER
次の出力が一般的です。
Merged AZ_KUBERNETES_CLUSTER as current context in ~/.kube/config
マニフェストを適用する前に、実際のノードのオペレーティング システムとアーキテクチャを確認します。
kubectl get nodes \
-o custom-columns='NAME:.metadata.name,OS:.status.nodeInfo.operatingSystem,ARCH:.status.nodeInfo.architecture'
このモジュールの linux/amd64 ビルド パスには、Linux AMD64 ノードが必要です。 一致するノードがない場合は、停止し、不一致を解決してから続行してください。 サポートされている AMD64 ノード プールを使用するか、サポートされている別の Linux ノード アーキテクチャのイメージを再構築、実行、プッシュし、一致するようにデプロイのアーキテクチャ セレクターを更新します。 Docker --platform オプションでは、AKS ノード プールは作成または変更されません。
containerize-and-deploy-Java-app-to-Azure/Project/Airlines から、deployment.yml をクラスターに適用します。
kubectl apply -f deployment.yml
次の出力が一般的です。
deployment.apps/flightbookingsystemsample created
service/flightbookingsystemsample created
次のコマンドを使用して、デプロイの状態を監視します。
kubectl get all
次の出力が一般的です。
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 の Running 状態は、Tomcat がアプリケーションのデプロイを完了したことや、HTTP リクエストが成功することを確認するものではありません。 デプロイのロールアウトを待ってから、アプリケーションのスタートアップ ログを確認します。
kubectl rollout status deployment/flightbookingsystemsample --timeout=300s &&
kubectl logs deployment/flightbookingsystemsample --tail=100 --follow
成功したロールアウトは、Kubernetes の可用性を確認します。 このマニフェストにはアプリケーションの準備プローブがないため、ロールアウトは HTTP 正常性テストではありません。 Tomcat がサーバーの起動を完了し、 AirlinesReservationSample.war のデプロイがエラーなしで完了したことを報告するまでログに従います。 次に、+Cキーを押してログのフォローを停止します。 これにより、コンテナーではなく、ログ ストリームのみが停止します。 ロールアウトまたはアプリケーションの起動が失敗した場合、または完了しない場合は、ブラウザーのチェックを続行するのではなく、ログとポッド イベントを調べます。
次の過去の出力例は、以前の Tomcat 10.1.33 イメージのスタートアップ メッセージを示しています。 これはこのモジュール内の更新済みイメージの出力ではありません。同じバージョン、タイムスタンプ、または環境の詳細を想定するのではなく、独自のログを使用してスタートアップを確認してください。
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
外部アドレスについてサービスを監視します:
kubectl get service flightbookingsystemsample --watch
Azure がロード バランサーをプロビジョニングしている間、EXTERNAL-IP値は最初は <pending> になることがあります。 これには数分かかる場合があり、単独でデプロイが失敗した証拠ではありません。 アドレスが表示されたら、Ctrl+C キーを押して監視を停止します。 プロビジョニングが完了しない場合は、監視を停止し、kubectl describe service flightbookingsystemsample でサービス イベントを確認します。
次の例の出力は、割り当てられたアドレスが表示される場所を示しています。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
flightbookingsystemsample LoadBalancer 10.0.62.153 <external-IP> 8080:30534/TCP 3m28s
注
次の URL の IP アドレス <external-IP> を、前に実行したコマンドの EXTERNAL-IP 値に置き換えます。
ブラウザーを開き、 http://<external-IP>:8080/AirlinesReservationSample/のフライト予約システムサンプルのランディング ページにアクセスします。 アプリケーション ページが応答することを確認します。 Running ポッドまたは割り当てられた IP だけでは、アプリケーションの準備は証明されません。 ブラウザーは次のスクリーンショットのようになります。
必要に応じて、 tomcat-users.xml から任意のユーザー ( someuser@azure.com: passwordなど) でサインインできます。
イメージ プラットフォームの不一致のトラブルシューティング
ポッドの起動エラーについては、 kubectl describe pods -l app=flightbookingsystemsample、 kubectl logs deployment/flightbookingsystemsample --tail=100、および kubectl get events --sort-by=.metadata.creationTimestampを調べます。
CrashLoopBackOff状態には、アプリケーション エラーなど、いくつかの原因が考えられます。すべての障害がアーキテクチャの不一致であるとは考えないでください。
既にデプロイされているイメージが誤ったプラットフォーム向けであることを確認した場合は、最初にビルド、ローカル実行、イメージ検査、レジストリのタグ付け、プッシュの各手順を、適合するプラットフォーム設定で繰り返します。 修正されたイメージが正常に再構築され、再タグ付けされ、同じ :latest タグの下にプッシュされたら、実行中のポッドを明示的に置き換えてください。
kubectl rollout restart deployment/flightbookingsystemsample &&
kubectl rollout status deployment/flightbookingsystemsample --timeout=300s
このマニフェストでは、:latest は既定で imagePullPolicy: Always に設定されているため、代替 Pod は現在のレジストリ タグを解決します。 変更されていないマニフェストだけを再適用しても、ロールアウトはトリガーされません。 プル ポリシーをカスタマイズした場合は、更新されたイメージ タグまたはダイジェストを使用し、デプロイメントを更新してください。 ロールアウト後に、スタートアップ ログとアプリケーションの URL チェックを繰り返してください。
リソースをクリーンアップする
このモジュールで作成したリソースには、継続的なコストが発生する可能性があります。 リソースをクリーンアップするには、次のコマンドを使用して、リソースを含むリソース グループを削除します。
az group delete --name $AZ_RESOURCE_GROUP