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

Container Service for Kubernetes:CNFSクライアントの分散キャッシュ機能の有効化

最終更新日:Dec 11, 2024

Container Network File System (CNFS) クライアントを使用すると、複数の接続、キャッシュメタデータ、およびキャッシュデータを介してデータに分散してアクセスし、読み取り速度を向上させることができます。 CNFSクライアントは、パフォーマンス監視とサービス品質 (QoS) もサポートします。 このトピックでは、CNFSクライアントの分散キャッシュ機能を有効にする方法と、CNFSクライアントの分散キャッシュ機能を使用して読み取り速度を向上させる方法について説明します。

目次

前提条件

  • カーネルバージョン4.19.91-23 ~ 4.19.91-26のAlibaba Cloud Linux 2が使用されています。 分散キャッシュ機能は、Alibaba Cloud Linux 2をサポートしています。

  • Kubernetes 1.20以降を実行するContainer Service for Kubernetes (ACK) クラスターが作成されます。 Container Storage Interface (CSI) プラグインがボリュームプラグインとして使用されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。

  • csi-pluginとcsi-provisionerのバージョンはv1.22.11-abbb810e-aliyun以降です。 csi-pluginとcsi-provisionerを更新する方法の詳細については、「CSIプラグインのインストールと更新」をご参照ください。

  • storage-operatorのバージョンはv1.22.86-041b094-aliyun以降です。 storage-operatorの更新方法の詳細については、「コンポーネントの管理」をご参照ください。

  • kubectlクライアントがクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。

分散キャッシュ機能の主なパフォーマンス指標

インジケータ

ベンチマークシナリオ

分散キャッシュ無効

分散キャッシュの有効化

メタデータの読み取りと書き込みのパフォーマンス

百万のディレクトリを横断する期間

18分

<60秒

サイズが4 KBのファイルを作成する期間

3,000マイクロ秒

<200マイクロ秒

4 KBのサイズのファイルを2回目に読み取る期間

400マイクロ秒

<100マイクロ秒

読み取りおよび書き込みスループット

単一ノードの読み書きスループット

500メガバイト/秒に200

> 800メガバイト/秒

包括的なシナリオでの全体的なパフォーマンス

それぞれサイズが150 KBの5,000画像を抽出する期間

52秒

15秒について

Redisプロジェクトの作成期間

27秒

21秒について

重要

前の表に示した値は、理論値 (基準値) のみである。 実際の値は、お客様の運用環境によって異なります。

  • 注 ①: ベンチマークテストの実行に使用されるElastic Compute Service (ECS) インスタンスのタイプはecs.hfg6.4xlargeです。 ベンチマークデータは、環境に基づいて変化し得る。

  • 注 ②: ECSインスタンスの帯域幅とFile Storage NAS (NAS) ファイルシステムのタイプは、ノードの読み取りおよび書き込みスループットに影響します。

手順1: 分散キャッシュが有効になっているNASファイルシステムをマウントする

  1. 次のコマンドを実行して、csi-pluginのConfigMapを作成してクラスターにデプロイし、CNFSクライアントをインストールします

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: csi-plugin
      namespace: kube-system
    data:
      cnfs-client-properties: |
        nas-efc=true
      nas-efc-cache: |
        enable=true
        container-number=3
        volume-type=memory
        volume-size=15Gi
      node-selector: |
        cache=true
    EOF

    パラメーター

    説明

    cnfs-client-properties

    分散キャッシュを有効にするかどうかを指定します。 cnfs-cache-propertiesを指定した場合。 enable=true、分散キャッシュ機能が有効になり、読み取り速度が向上します。

    nfs-efc-cache。

    コンテナー番号

    このパラメーターは、分散キャッシュを有効にする場合に必要です。

    このパラメーターは、キャッシュ機能用にDaemonSetが作成するコンテナーの数を指定します。 キャッシュ機能がパフォーマンスのボトルネックに達した場合、このパラメーターの値を増やすことができます。

    nfs-efc-cache。

    ボリュームタイプ

    このパラメーターは、分散キャッシュを有効にする場合に必要です。

    DaemonSetによって作成されたポッドのemptyDirボリュームによって使用されるメディア。 有効な値:

    • ディスク

    • メモリ

    nfs-efc-cache。

    volume-size

    このパラメーターは、分散キャッシュを有効にする場合に必要です。 キャッシュするボリュームのサイズ。 単位:GiB

    cnfs-client-properties

    キャッシュ機能の依存関係。 分散キャッシュ機能を有効にする場合は、cnfs-client-propertiesを指定します。 enable=true

    ノードセレクタ

    分散キャッシュ機能用にDaemonSetによって作成されたポッドは、ラベルに基づいてスケジュールされます。 このパラメーターを指定しない場合、DaemonSetはクラスター内の各ノードにスケジュールされます。

    重要
    • メディアをディスクまたはメモリに設定すると、ノードのデータディスクまたはメモリリソースが使用されます。 これがワークロードに悪影響を及ぼさないことを確認してください。

    • この例では、分散キャッシュ機能のDaemonSetは、それぞれが5 GiBのサイズのtmpfsボリュームでマウントされる3つのコンテナを作成します。 コンテナーは、cache=trueラベルを持つノードにのみスケジュールできます。

    ConfigMapが設定されると、システムはConfigMapに基づいてDaemonSetとサービスを自動的にデプロイします。

  2. 次のコマンドを実行して、インストールの依存関係を持つCSI-Pluginを再起動します。

    kubectl get pod -nkube-system -owide | grep csi-plugin | awk '{print $1}' | xargs kubectl -nkube-system delete pod
  3. 次のコマンドを実行して、CNFSクライアントの分散キャッシュ機能を有効にします。

    CNFSによって管理されるNASファイルシステムを作成します。 StatefulSetは、CNFSによって高速化されたNASボリュームを動的にプロビジョニングされたボリュームとしてマウントします。 この例では、busybox画像が使用される。 ポッドが起動した後、システムはddコマンドを実行して、サイズが1 GBのファイルを /dataパスに書き込みます。 ファイルは、分散キャッシュ機能が有効かどうかを確認するために使用されます。

    YAMLコンテンツを表示する:

    cat << EOF | kubectl apply -f -
    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerNetworkFileSystem
    metadata:
      name: cnfs-nas-filesystem
    spec:
      description: "cnfs"
      type: nas
      reclaimPolicy: Retain
      parameters:
        filesystemType: standard
        storageType: Capacity
        protocolType: NFS
        encryptType: None
        enableTrashCan: "true"
        trashCanReservedDays: "5"
        useClient: "EFCClient" # Use the EFC client to mount a NAS file system that has distributed caching enabled. 
    ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alibabacloud-cnfs-nas-sc
    mountOptions:
      - g_tier_EnableClusterCache=true              # Configure caching settings when mounting the volume. 
      - g_tier_EnableClusterCachePrefetch=true      # Configure prefetching when mounting the volume. 
    parameters:
      volumeAs: subpath
      containerNetworkFileSystem: cnfs-nas-filesystem
      path: "/"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain
    allowVolumeExpansion: true
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: cnfs-nas-sts
      labels:
        app: busybox
    spec:
      serviceName: "busybox"
      replicas: 1
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          containers:
          - name: busybox
            image: busybox
            command: ["/bin/sh"]
            args: ["-c", "dd if=/dev/zero of=/data/1G.tmpfile bs=1G count=1;sleep 3600;"]
            volumeMounts:
            - mountPath: "/data"
              name: www
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "alibabacloud-cnfs-nas-sc"
          resources:
            requests:
              storage: 50Gi
    EOF
  4. 次のコマンドを実行して、分散キャッシュが有効になっているNASボリュームがマウントされているかどうかを確認します。

    kubectl exec cnfs-nas-sts-0   -- mount | grep /data

    期待される出力:

    xxx.cn-xxx.nas.aliyuncs.com:/nas-6b9d1397-6542-4410-816b-4dfd0633****:2fMaQdxU on /data type alifuse.aliyun-alinas-eac (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)

    マウントターゲットが出力に表示されます。 これは、分散キャッシュが有効になっているNASボリュームがマウントされていることを示します。

  5. 次のコマンドを実行して、分散キャッシュ機能のDaemonSetが起動されているかどうかを確認します。

    kubectl get ds/cnfs-cache-ds -n kube-system -owide

    期待される出力:

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS              IMAGES                                                         SELECTOR
    cnfs-cache-ds   3         3         3       3            3           <none>          19d   alinas-dadi-container   registry-vpc.cn-shenzhen.aliyuncs.com/acs/nas-cache:20220420   app=cnfs-cache-ds

    この例では、クラスタは3つのノードを含む。 DaemonSetによって作成された3つのポッドが準備完了です。 これは、分散キャッシュ機能のDaemonSetが起動されたことを示します。

  6. 次のコマンドを実行して、分散キャッシュサービスがバックエンドポッドを検出できるかどうかを確認します。

    kubectl get ep cnfs-cache-ds-service  -n kube-system -owide

    期待される出力:

    NAME                     ENDPOINTS                                          AGE
    cnfs-cache-ds-service   10.19.1.130:6500,10.19.1.40:6500,10.19.1.66:6500   19d

    出力は、サービスがバックエンドポッドを検出したことを示しています。 ポッドのエンドポイントは10.19.1.130、10.19.1.40、10.19.1.66です。 ポートは6500です。

ステップ2: キャッシュ機能を確認する

  1. 次のコマンドを実行して、/dataパスのtmpfileファイルを /ディレクトリにコピーし、消費時間を確認します。 ファイルのサイズは1 GBです。

    kubectl exec cnfs-nas-sts-0 -- time cp /data/1G.tmpfile /

    期待される出力:

    real    0m 5.66s
    user    0m 0.00s
    sys     0m 0.75s

    出力は、分散キャッシュ機能が無効になっている場合、ファイルのコピーに必要な時間が約5秒であることを示しています。

  2. 次のコマンドを複数回実行して、ファイルのコピーに必要な時間を確認します。

    kubectl exec cnfs-nas-sts-0 -- time cp /data/1G.tmpfile /

    期待される出力:

    real    0m 0.79s
    user    0m 0.00s
    sys     0m 0.58s

    出力は、ファイルが複数回アクセスされた場合、ファイルのコピーに必要な時間が6〜7倍に短縮されることを示しています。