すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:CNFSを使用してJVMのヒープダンプを自動的に収集する

最終更新日:Dec 11, 2024

アプリケーションがJavaで記述され、Java仮想マシン (JVM) のヒープサイズが小さい場合、アプリケーションでメモリ不足 (OOM) エラーが発生する可能性があります。 Container Network File System (CNFS) ボリュームをアプリケーションのログディレクトリにマウントできます。 これにより、OOMエラーを記録するログが自動的にCNFSボリュームに保存されます。 このトピックでは、CNFSを使用してJVMのヒープダンプを自動的に収集する方法について説明します。

前提条件

背景情報

  • CNFSでは、CustomResourceDefinition (CRD) リソースを使用して、NASファイルシステムをカスタムKubernetesオブジェクトとして抽象化できます。 カスタムオブジェクトを使用して、NASファイルシステムを作成、削除、記述、マウント、監視、および拡張できます。 詳細については、「CNFS」をご参照ください。

  • Container Registryは、Open Container Initiative (OCI) の標準を満たすクラウドネイティブのアーティファクトを効果的に管理および配布できる安全なプラットフォームです。 アーティファクトには、コンテナ画像とHelmチャートが含まれます。 詳細については、「」をご参照ください。Container Registryとは.

考慮事項

  • Java引数Xmxをアプリケーションポッドのメモリ制限より小さい値に設定します。 これにより、OOMエラーがポッドで発生するが、JVMでは発生しない状況を防ぎます。

  • JVMのヒープダンプを収集するには、新しいCNFSボリュームをマウントすることをお勧めします。 これにより、アプリケーションデータとヒープダンプは別々のCNFSボリュームに保存されます。 これにより、. hprofアプリケーションに悪影響を与える可能性があります。

手順

  1. registry.cn-hangzhou.aliyuncs.com/acs1/java-oom-test:v1.0イメージを使用して、JVMでOOMエラーをトリガーするためのJavaプログラムをデプロイできます。

    イメージのビルド方法の詳細については、「Container Registry Enterprise Editionインスタンスを使用したイメージのビルド」をご参照ください。

  2. 次のテンプレートを使用して、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
  3. Container Service for Kubernetes (ACK) コンソールのイベントセンターモジュールに移動します。 ページにバックオフ再開警告イベントが表示された場合、java-applicationアプリケーションでOOMエラーが発生しています。

    1. ACKコンソールにログインします。

    2. ACKコンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。

    3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。 クラスターの詳細ページが表示されます。

    4. クラスターの詳細ページの左側のナビゲーションウィンドウで、[操作] > [イベントセンター] を選択します。

    CNFS

  4. NASファイルシステムでファイルを表示、アップロード、ダウンロードするには、ファイルブラウザーアプリケーションをデプロイします。 これにより、webページでこれらの操作を実行できます。 NASファイルシステムをfile BrowserアプリケーションのrootDirパスにマウントします。 次に、kubectl port-forwardコマンドを実行して、ファイルブラウザーアプリケーションのコンテナーポートをオンプレミスのコンピューターにマッピングします。 これにより、ブラウザを使用してNASファイルシステムのファイルにアクセスできます。

    1. 次のテンプレートを使用して、ファイルブラウザーとファイルブラウザーの配置で使用される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
    2. File Browserのポート80をオンプレミスのマシンにマップします。

      kubectl port-forward deployment/filebrowser 8080:80

      期待される出力:

      Forwarding from 127.0.0.1:8080 -> 80
      Forwarding from [::1]:8080 -> 80
    3. ブラウザを開き、アドレスバーに127.0.0.1:8080と入力し、enterキーを押します。 ファイルブラウザのログインページが表示されます。 デフォルトのユーザー名 (admin) とパスワード (admin) を入力します。 次に、[ログイン] をクリックします。

      file browser.png

    4. cnfs-nas-pvc PVCはrootDirディレクトリにマウントされます。 rootDirをダブルクリックして、NASファイルシステムを開きます。

      file browser2

結果

[ファイルブラウザー] ページで、java-application用に作成され、subPathExpr: $(POD_NAMESPACE).$(POD_NAME) 設定に基づいて名前が付けられたdefault.java-application-76d8cd95b7-prrl2ディレクトリを見つけます。

file browser3

このディレクトリに移動し、ヒープダンプファイルjava_pid1.hprofを見つけます。 OOMエラーを引き起こすコードの正確な行を特定する場合は、java_pid1.hprofをオンプレミスのマシンにダウンロードし、Eclipse Memory Analyzer Tool (MAT) を使用してJVMスタックを分析します。

CNFS 02