アプリケーションがJavaで記述され、Java仮想マシン (JVM) のヒープサイズが小さい場合、アプリケーションでメモリ不足 (OOM) エラーが発生する可能性があります。 Container Network File System (CNFS) ボリュームをアプリケーションのログディレクトリにマウントできます。 これにより、OOMエラーを記録するログが自動的にCNFSボリュームに保存されます。 このトピックでは、CNFSを使用してJVMのヒープダンプを自動的に収集する方法について説明します。
前提条件
Kubernetes クラスターが作成されてること。 Container Storage Interface (CSI) プラグインがボリュームプラグインとして使用されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。
Container Registry Enterprise Editionのインスタンスが作成されます。 詳細については、「Container Registry Enterprise Editionのインスタンスの作成」をご参照ください。
CNFSは、NAS (File Storage NAS) ファイルシステムの管理に使用されます。 詳細については、「CNFSを使用したNASファイルシステムの管理 (推奨) 」をご参照ください。
背景情報
CNFSでは、CustomResourceDefinition (CRD) リソースを使用して、NASファイルシステムをカスタムKubernetesオブジェクトとして抽象化できます。 カスタムオブジェクトを使用して、NASファイルシステムを作成、削除、記述、マウント、監視、および拡張できます。 詳細については、「CNFS」をご参照ください。
Container Registryは、Open Container Initiative (OCI) の標準を満たすクラウドネイティブのアーティファクトを効果的に管理および配布できる安全なプラットフォームです。 アーティファクトには、コンテナ画像とHelmチャートが含まれます。 詳細については、「」をご参照ください。Container Registryとは.
考慮事項
Java引数Xmxをアプリケーションポッドのメモリ制限より小さい値に設定します。 これにより、OOMエラーがポッドで発生するが、JVMでは発生しない状況を防ぎます。
JVMのヒープダンプを収集するには、新しいCNFSボリュームをマウントすることをお勧めします。 これにより、アプリケーションデータとヒープダンプは別々のCNFSボリュームに保存されます。 これにより、. hprofアプリケーションに悪影響を与える可能性があります。
手順
registry.cn-hangzhou.aliyuncs.com/acs1/java-oom-test:v1.0イメージを使用して、JVMでOOMエラーをトリガーするためのJavaプログラムをデプロイできます。
イメージのビルド方法の詳細については、「Container Registry Enterprise Editionインスタンスを使用したイメージのビルド」をご参照ください。
次のテンプレートを使用して、java-applicationという名前の配置を作成します。
Mycodeプログラムを起動すると、ヒープサイズは80 MBに設定され、ヒープダンプは /mnt/oom/logsディレクトリに書き込まれます。 ヒープがJVMの要件を満たすことができない場合、HeapDumpOnOutOfMemoryErrorエラーが返されます。
cat << EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: java-application spec: selector: matchLabels: app: java-application template: metadata: labels: app: java-application spec: containers: - name: java-application image: registry.cn-hangzhou.aliyuncs.com/acs1/java-oom-test:v1.0 # The image address of the sample Java application. imagePullPolicy: Always env: # Specify two environment variables. Set the key of one variable to POD_NAME and the value to metadata.name. Set the key of the other variable to POD_NAMESPACE and the value to metadata.namespace. - name: POD_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace args: - java # Run the Java command. - -Xms80m # The minimum heap size. - -Xmx80m # The maximum heap size. - -XX:HeapDumpPath=/mnt/oom/logs # The path in which heap dumps are stored when OOM errors occur. - -XX:+HeapDumpOnOutOfMemoryError # Generate heap dumps when OOM errors occur. - Mycode # Run the Mycode program. volumeMounts: - name: java-oom-pv mountPath: "/mnt/oom/logs" # Mount the CNFS volume to the /mnt/oom/logs directory. subPathExpr: $(POD_NAMESPACE).$(POD_NAME) # Create a subdirectory named $(POD_NAMESPACE).$(POD_NAME). The subdirectory is used to store heap dumps that are generated due to OOM errors. volumes: - name: java-oom-pv persistentVolumeClaim: claimName: cnfs-nas-pvc # The persistent volume claim (PVC) that is used to mount the CNFS volume. The PVC name is cnfs-nas-pvc. EOF
Container Service for Kubernetes (ACK) コンソールのイベントセンターモジュールに移動します。 ページにバックオフ再開警告イベントが表示された場合、java-applicationアプリケーションでOOMエラーが発生しています。
ACKコンソールにログインします。
ACKコンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。 クラスターの詳細ページが表示されます。
クラスターの詳細ページの左側のナビゲーションウィンドウで、 を選択します。
NASファイルシステムでファイルを表示、アップロード、ダウンロードするには、ファイルブラウザーアプリケーションをデプロイします。 これにより、webページでこれらの操作を実行できます。 NASファイルシステムをfile BrowserアプリケーションのrootDirパスにマウントします。 次に、
kubectl port-forward
コマンドを実行して、ファイルブラウザーアプリケーションのコンテナーポートをオンプレミスのコンピューターにマッピングします。 これにより、ブラウザを使用してNASファイルシステムのファイルにアクセスできます。次のテンプレートを使用して、ファイルブラウザーとファイルブラウザーの配置で使用されるConfigMapを作成します。 デフォルトでは、ポート80が開かれています。
cat << EOF | kubectl apply -f - apiVersion: v1 data: .filebrowser.json: | { "port": 80 } kind: ConfigMap metadata: labels: app.kubernetes.io/instance: filebrowser app.kubernetes.io/name: filebrowser name: filebrowser namespace: default --- apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/instance: filebrowser app.kubernetes.io/name: filebrowser name: filebrowser namespace: default spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app.kubernetes.io/instance: filebrowser app.kubernetes.io/name: filebrowser template: metadata: labels: app.kubernetes.io/instance: filebrowser app.kubernetes.io/name: filebrowser spec: containers: - image: docker.io/filebrowser/filebrowser:v2.18.0 imagePullPolicy: IfNotPresent name: filebrowser ports: - containerPort: 80 name: http protocol: TCP resources: {} securityContext: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /.filebrowser.json name: config subPath: .filebrowser.json - mountPath: /db name: rootdir - mountPath: /rootdir name: rootdir dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 volumes: - configMap: defaultMode: 420 name: filebrowser name: config - name: rootdir persistentVolumeClaim: claimName: cnfs-nas-pvc EOF
期待される出力:
configmap/filebrowser unchanged deployment.apps/filebrowser configured
File Browserのポート80をオンプレミスのマシンにマップします。
kubectl port-forward deployment/filebrowser 8080:80
期待される出力:
Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80
ブラウザを開き、アドレスバーに127.0.0.1:8080と入力し、enterキーを押します。 ファイルブラウザのログインページが表示されます。 デフォルトのユーザー名 (admin) とパスワード (admin) を入力します。 次に、[ログイン] をクリックします。
cnfs-nas-pvc PVCはrootDirディレクトリにマウントされます。 rootDirをダブルクリックして、NASファイルシステムを開きます。
結果
[ファイルブラウザー] ページで、java-application用に作成され、subPathExpr: $(POD_NAMESPACE).$(POD_NAME)
設定に基づいて名前が付けられたdefault.java-application-76d8cd95b7-prrl2ディレクトリを見つけます。
このディレクトリに移動し、ヒープダンプファイルjava_pid1.hprofを見つけます。 OOMエラーを引き起こすコードの正確な行を特定する場合は、java_pid1.hprofをオンプレミスのマシンにダウンロードし、Eclipse Memory Analyzer Tool (MAT) を使用してJVMスタックを分析します。