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

Container Service for Kubernetes:キャッシュアフィニティに基づいてポッドをスケジュールする

最終更新日:Mar 06, 2025

Fluidを使用すると、キャッシュアフィニティに基づいてポッドをスケジュールできます。 これにより、キャッシュデータが格納されているノード、キャッシュデータが配置されているゾーン内のノード、またはキャッシュデータが配置されているリージョン内のノードにアプリケーションポッドをデプロイできます。 これにより、データアクセス効率が向上します。

制限事項

前提条件

説明

Fluidは、変化するWebhookに基づいて、キャッシュアフィニティルールをポッド仕様に挿入できます。 ポッドを作成するときに、異なるレベルのキャッシュアフィニティ規則をポッド仕様に注入するようにFluidを構成できます。 このように、kube-schedulerは、キャッシュされたデータが格納されているノード、キャッシュされたデータが配置されているゾーン内のノード、またはキャッシュされたデータが配置されているリージョン内のノードにポッドを優先的にスケジュールします。

重要

ポッド仕様でspec.affinityまたはspec.nodeSelectorパラメーターが既に指定されている場合、Fluidはポッド仕様にキャッシュアフィニティ規則を挿入しません。

スケジューリングポリシーの設定

デフォルト設定

Fluidは、ノード、ゾーン、リージョンのレベルのキャッシュアフィニティスケジューリングをサポートしています。 クラスターのスケジューリングポリシーを確認するには、次のコマンドを実行します。

kubectl get cm -n fluid-system webhook-plugins -oyaml

期待される出力:

apiVersion: v1
data:
  pluginsProfile: |
    pluginConfig:
    - args: |
        preferred:
          # fluid existed node affinity, the name can not be modified.
          - name: fluid.io/node
            weight: 100
          # runtime worker's zone label name, can be changed according to k8s environment.
          - name: topology.kubernetes.io/zone
            weight: 50
          # runtime worker's region label name, can be changed according to k8s environment.
          - name: topology.kubernetes.io/region
            weight: 20
        # used when app pod with label fluid.io/dataset.{dataset name}.sched set true
        required:
          - fluid.io/node
      name: NodeAffinityWithCache
    plugins:
      serverful:
        withDataset:
        - RequireNodeWithFuse
        - NodeAffinityWithCache
        - MountPropagationInjector
        withoutDataset:
        - PreferNodesWithoutCache
      serverless:
        withDataset:
        - FuseSidecar
        withoutDataset: []

次の表に、前述のConfigMapのpluginsProfileセクションのパラメーターを示します。

パラメーター

説明

fluid.io /ノード

Fluidによって事前定義されたパラメータ。 このパラメーターを有効にすると、Fluidは自動的にノード固有のキャッシュアフィニティ規則をポッド仕様に挿入します。 ノード固有のキャッシュアフィニティルールは、キャッシュされたデータが格納されるノードを指定します。 ルールの重みは100です。

topology.kubernetes.io/zone

ゾーン固有のキャッシュアフィニティルールを指定するKubernetesクラスターパラメーター。 このパラメーターを有効にすると、Fluidは自動的にゾーン固有のキャッシュアフィニティルールをポッド仕様に挿入します。 ゾーン固有のキャッシュアフィニティルールは、キャッシュされたデータが配置されているゾーンを指定します。 ルールの重みは50です。

topology.kubernetes.io/region

リージョン固有のキャッシュアフィニティルールを指定するKubernetesクラスターパラメーター。 このパラメーターを有効にすると、Fluidは自動的にリージョン固有のキャッシュアフィニティルールをポッド仕様に注入します。 リージョン固有のキャッシュアフィニティルールは、キャッシュされたデータが配置されているリージョンを指定します。 ルールの重みは20です。

カスタム設定

ACKは、他のノードラベルを使用して、ACKクラスタ内のノードのトポロジ情報を識別し得る。 特定のノードラベルに基づいてカスタムアフィニティルールをポッド仕様に注入するようにFluidを構成するには、次の手順を実行します。

  1. 次のコマンドを実行して、webhook-plugins ConfigMapを変更します。

    kubectl edit -n fluid-system cm webhook-plugins
  2. 次のサンプルコードに基づいて、webhook-plugins ConfigMapを変更します。

    • ビジネス要件に基づいて、クラスターのトポロジ情報を識別する既存のラベルを削除できます。 詳細については、「例1: ノードのアフィニティを無視」をご参照ください。

    • 特定のノードラベル (<topology_key> など) に基づいてカスタムアフィニティルールを追加し、ルールの重み (<topology_weight> など) を設定できます。 詳細については、「例2: ノードプールのアフィニティの追加」をご参照ください。

    apiVersion: v1
    data:
      pluginsProfile: |
        pluginConfig:
        - args: |
            preferred:
              # fluid existed node affinity, the name can not be modified.
              - name: fluid.io/node
                weight: 100
              # runtime worker's zone label name, can be changed according to k8s environment.
              - name: topology.kubernetes.io/zone
                weight: 50
              # runtime worker's region label name, can be changed according to k8s environment.
              - name: topology.kubernetes.io/region
                weight: 20
              - name: <topology_key>
                weight: <topology_weight>
            # used when app pod with label fluid.io/dataset.{dataset name}.sched set true
            required:
              - fluid.io/node
          name: NodeAffinityWithCache
        plugins:
          serverful:
            withDataset:
            - RequireNodeWithFuse
            - NodeAffinityWithCache
            - MountPropagationInjector
            withoutDataset:
            - PreferNodesWithoutCache
          serverless:
            withDataset:
            - FuseSidecar
            withoutDataset: []

    例1: ノード固有のキャッシュ類似性ルールを無視する

    apiVersion: v1
    data:
      pluginsProfile: |
        pluginConfig:
        - args: |
            preferred:
              # fluid existed node affinity, the name can not be modified.
    -         #- name: fluid.io/node
    -         #  weight: 100
              # runtime worker's zone label name, can be changed according to k8s environment.
              - name: topology.kubernetes.io/zone
                weight: 50
              # runtime worker's region label name, can be changed according to k8s environment.
              - name: topology.kubernetes.io/region
                weight: 20
            # used when app pod with label fluid.io/dataset.{dataset name}.sched set true
            required:
              - fluid.io/node
          name: NodeAffinityWithCache
        plugins:
          serverful:
            withDataset:
            - RequireNodeWithFuse
            - NodeAffinityWithCache
            - MountPropagationInjector
            withoutDataset:
            - PreferNodesWithoutCache
          serverless:
            withDataset:
            - FuseSidecar
            withoutDataset: []

    例2: ノードプール固有のキャッシュアフィニティルールの追加

    apiVersion: v1
    data:
      pluginsProfile: |
        pluginConfig:
        - args: |
            preferred:
              # fluid existed node affinity, the name can not be modified.
              - name: fluid.io/node
                weight: 100
    +         - name: alibabacloud.com/nodepool-id
    +           weight: 80
              # runtime worker's zone label name, can be changed according to k8s environment.
              - name: topology.kubernetes.io/zone
                weight: 50
              # runtime worker's region label name, can be changed according to k8s environment.
              - name: topology.kubernetes.io/region
                weight: 20
            # used when app pod with label fluid.io/dataset.{dataset name}.sched set true
            required:
              - fluid.io/node
          name: NodeAffinityWithCache
        plugins:
          serverful:
            withDataset:
            - RequireNodeWithFuse
            - NodeAffinityWithCache
            - MountPropagationInjector
            withoutDataset:
            - PreferNodesWithoutCache
          serverless:
            withDataset:
            - FuseSidecar
            withoutDataset: []
  3. 次のコマンドを実行してFluid Webhookを再起動し、変更を適用します。

    kubectl rollout restart deployment -n fluid-system fluid-webhook

例1: ノード固有のキャッシュアフィニティ規則に基づいてポッドをスケジュールする

  1. シークレットを作成します。

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    stringData:
      fs.oss.accessKeyId: <ACCESS_KEY_ID>
      fs.oss.accessKeySecret: <ACCESS_KEY_SECRET>
  2. DatasetとRuntimeオブジェクトを作成します。

    重要

    この例では、JindoRuntimeが作成されます。 他のキャッシュランタイムを使用するには、「EFCを使用したNASまたはCPFSへのアクセスの高速化」をご参照ください。 JindoFSを使用してObject Storage Service (OSS) へのアクセスを高速化する方法の詳細については、「JindoFSを使用してOSSへのアクセスを高速化する」をご参照ください。

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: demo-dataset
    spec:
      mounts:
        - mountPoint: oss://<oss_bucket>/<bucket_dir>
          options:
            fs.oss.endpoint: <oss_endpoint>
          name: hadoop
          path: "/"
          encryptOptions:
            - name: fs.oss.accessKeyId
              valueFrom:
                secretKeyRef:
                  name: mysecret
                  key: fs.oss.accessKeyId
            - name: fs.oss.accessKeySecret
              valueFrom:
                secretKeyRef:
                  name: mysecret
                  key: fs.oss.accessKeySecret
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: JindoRuntime
    metadata:
      name: demo-dataset
    spec:
      replicas: 2
      tieredstore:
        levels:
          - mediumtype: MEM
            path: /dev/shm
            quota: 10G
            high: "0.99"
            low: "0.8"
  3. アプリケーションポッドを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        fuse.serverful.fluid.io/inject: "true"
    spec:
      containers:
        - name: nginx
          image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
          volumeMounts:
            - mountPath: /data
              name: data-vol
      volumes:
        - name: data-vol
          persistentVolumeClaim:
            claimName: demo-dataset

    次のパラメーターは、ノード固有のキャッシュアフィニティルールに基づいてポッドスケジューリングを有効にするために使用されます。

    パラメーター

    説明

    fuse.serverful.fluid.io/inject: "true"

    Fluidがキャッシュアフィニティ規則をポッド仕様に注入できるようにします。

    claimName

    ポッドにマウントされている永続的なボリュームクレーム (PVC) 。 PVCはFluidによって自動的に作成され、作成したデータセットにちなんで名前が付けられます。

  4. ポッド仕様のアフィニティ設定を確認します。

    kubectl get pod nginx -oyaml

    期待される出力:

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        fuse.serverful.fluid.io/inject: "true"
      name: nginx
      namespace: default
      ...
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - preference:
              matchExpressions:
              - key: fluid.io/s-default-demo-dataset
                operator: In
                values:
                - "true"
            weight: 100
    

    ノード固有のキャッシュアフィニティ規則 (fluid.io/s-default-demo-dataset) がポッド仕様に挿入されます。 ルールの重みは、スケジューリングポリシー内のノードトポロジカルパラメータの構成に依存します。

例2: ゾーン固有のキャッシュアフィニティ規則に基づいてポッドをスケジュールする

  1. シークレットを作成します。

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    stringData:
      fs.oss.accessKeyId: <ACCESS_KEY_ID>
      fs.oss.accessKeySecret: <ACCESS_KEY_SECRET>
  2. DatasetとRuntimeオブジェクトを作成します。

    重要

    この例では、JindoRuntimeが作成されます。 他のキャッシュランタイムを使用するには、「EFCを使用したNASまたはCPFSへのアクセスの高速化」をご参照ください。 JindoFSを使用してObject Storage Service (OSS) へのアクセスを高速化する方法の詳細については、「JindoFSを使用してOSSへのアクセスを高速化する」をご参照ください。

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: demo-dataset
    spec:
      nodeAffinity:
        required:
          nodeSelectorTerms:
            - matchExpressions:
                - key: topology.kubernetes.io/zone
                  operator: In
                  values:
                  - "<ZONE_ID>" # e.g. cn-beijing-i
      mounts:
        - mountPoint: oss://<oss_bucket>/<bucket_dir>
          options:
            fs.oss.endpoint: <oss_endpoint>
          name: hadoop
          path: "/"
          encryptOptions:
            - name: fs.oss.accessKeyId
              valueFrom:
                secretKeyRef:
                  name: mysecret
                  key: fs.oss.accessKeyId
            - name: fs.oss.accessKeySecret
              valueFrom:
                secretKeyRef:
                  name: mysecret
                  key: fs.oss.accessKeySecret
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: JindoRuntime
    metadata:
      name: demo-dataset
    spec:
      replicas: 2
      master:
        nodeSelector:
          topology.kubernetes.io/zone: <ZONE_ID> # e.g. cn-beijing-i
      tieredstore:
        levels:
          - mediumtype: MEM
            path: /dev/shm
            quota: 10G
            high: "0.99"
            low: "0.8"

    ゾーン固有のキャッシュアフィニティルールに基づいてポッドをスケジュールするには、キャッシュされたデータが配置されているゾーンを暗黙的に指定する必要があります。 上記のコードブロックでは、topology.kubernetes.io/zone=cn-beijing-iラベルがnodeAffinity.required.nodeSelectorTermsパラメーターで指定されています。

  3. アプリケーションポッドを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        fuse.serverful.fluid.io/inject: "true"
    spec:
      containers:
        - name: nginx
          image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
          volumeMounts:
            - mountPath: /data
              name: data-vol
      volumes:
        - name: data-vol
          persistentVolumeClaim:
            claimName: demo-dataset

    次のパラメーターは、ゾーン固有のキャッシュアフィニティルールに基づいてポッドスケジューリングを有効にするために使用されます。

    パラメーター

    説明

    fuse.serverful.fluid.io/inject: "true"

    Fluidがキャッシュアフィニティ規則をポッド仕様に注入できるようにします。

    claimName

    ポッドにマウントされているPVC。 PVCはFluidによって自動的に作成され、作成したデータセットにちなんで名前が付けられます。

  4. ポッド仕様のアフィニティ設定を確認します。

    kubectl get pod nginx -oyaml

    期待される出力:

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        fuse.serverful.fluid.io/inject: "true"
      name: nginx
      namespace: default
      ...
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - preference:
              matchExpressions:
              - key: fluid.io/s-default-demo-dataset
                operator: In
                values:
                - "true"
            weight: 100
          - preference:
              matchExpressions:
              - key: topology.kubernetes.io/zone
                operator: In
                values:
                - <ZONE_ID> # e.g. cn-beijing-i
            weight: 50
    ...

    ノード固有のキャッシュアフィニティ規則 (fluid.io/s-default-demo-dataset) とゾーン固有のキャッシュアフィニティ規則 (topology.kubernetes.io/zone) がポッド仕様に挿入されます。 ルールの重みは、スケジューリングポリシーにおけるノードのトポロジパラメータの構成に依存する。

例3: ノード固有のキャッシュアフィニティ規則に基づいてポッドのスケジューリングを強制する

  1. シークレットを作成します。

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    stringData:
      fs.oss.accessKeyId: <ACCESS_KEY_ID>
      fs.oss.accessKeySecret: <ACCESS_KEY_SECRET>
  2. DatasetとRuntimeオブジェクトを作成します。

    重要

    この例では、JindoRuntimeが作成されます。 他のキャッシュランタイムを使用するには、「EFCを使用したNASまたはCPFSへのアクセスの高速化」をご参照ください。 JindoFSを使用してObject Storage Service (OSS) へのアクセスを高速化する方法の詳細については、「JindoFSを使用してOSSへのアクセスを高速化する」をご参照ください。

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: demo-dataset
    spec:
      mounts:
        - mountPoint: oss://<oss_bucket>/<bucket_dir>
          options:
            fs.oss.endpoint: <oss_endpoint>
          name: hadoop
          path: "/"
          encryptOptions:
            - name: fs.oss.accessKeyId
              valueFrom:
                secretKeyRef:
                  name: mysecret
                  key: fs.oss.accessKeyId
            - name: fs.oss.accessKeySecret
              valueFrom:
                secretKeyRef:
                  name: mysecret
                  key: fs.oss.accessKeySecret
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: JindoRuntime
    metadata:
      name: demo-dataset
    spec:
      replicas: 2
      tieredstore:
        levels:
          - mediumtype: MEM
            path: /dev/shm
            quota: 10G
            high: "0.99"
            low: "0.8"
  3. アプリケーションポッドを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        fuse.serverful.fluid.io/inject: "true"
        fluid.io/dataset.demo-dataset.sched: required
    spec:
      containers:
        - name: nginx
          image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
          volumeMounts:
            - mountPath: /data
              name: data-vol
      volumes:
        - name: data-vol
          persistentVolumeClaim:
            claimName: demo-dataset

    次のパラメーターは、ノード固有のキャッシュアフィニティルールに基づいてポッドのスケジューリングを強制するために使用されます。

    パラメーター

    説明

    fuse.serverful.fluid.io/inject: "true"

    Fluidがキャッシュアフィニティ規則をポッド仕様に注入できるようにします。

    fluid.io/dataset.<dataset_name>.sched: 必須

    <dataset_name> を指定します。これは、注入する強制ノード固有のアフィニティルールに関連しています。

    claimName

    ポッドにマウントされているPVC。 PVCはFluidによって自動的に作成され、作成したデータセットにちなんで名前が付けられます。

  4. ポッド仕様のアフィニティ設定を確認します。

    kubectl get pod nginx -oyaml

    期待される出力:

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        fluid.io/dataset.demo-dataset.sched: required
        fuse.serverful.fluid.io/inject: "true"
      name: nginx
      namespace: default
      ...
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: fluid.io/s-default-demo-dataset
                operator: In
                values:
                - "true"

    強制ノード固有のキャッシュアフィニティ規則 (fluid.io/s-default-demo-dataset) がポッド仕様に注入されます。