Fluidを使用すると、キャッシュアフィニティに基づいてポッドをスケジュールできます。 これにより、キャッシュデータが格納されているノード、キャッシュデータが配置されているゾーン内のノード、またはキャッシュデータが配置されているリージョン内のノードにアプリケーションポッドをデプロイできます。 これにより、データアクセス効率が向上します。
制限事項
この機能は、ACK Proクラスターでのみサポートされています。
この機能は、Elastic Container Instanceベースのスケジューリングまたはpriorityベースのリソーススケジューリングと互換性がありません。
前提条件
Kubernetes 1.18以降を実行するACK Proクラスターが作成されます。 詳細については、「ACK Proクラスターの作成」をご参照ください。
クラスターにクラウドネイティブAIスイートとack-fluid 1.0.6以降がデプロイされます。 詳細については、「クラウドネイティブ AI スイートをデプロイする」をご参照ください。
重要既にオープンソースFluidをインストールしている場合は、Fluidをアンインストールしてack-fluidコンポーネントをデプロイします。
kubectlクライアントがクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
説明
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によって事前定義されたパラメータ。 このパラメーターを有効にすると、Fluidは自動的にノード固有のキャッシュアフィニティ規則をポッド仕様に挿入します。 ノード固有のキャッシュアフィニティルールは、キャッシュされたデータが格納されるノードを指定します。 ルールの重みは100です。 |
| ゾーン固有のキャッシュアフィニティルールを指定するKubernetesクラスターパラメーター。 このパラメーターを有効にすると、Fluidは自動的にゾーン固有のキャッシュアフィニティルールをポッド仕様に挿入します。 ゾーン固有のキャッシュアフィニティルールは、キャッシュされたデータが配置されているゾーンを指定します。 ルールの重みは50です。 |
| リージョン固有のキャッシュアフィニティルールを指定するKubernetesクラスターパラメーター。 このパラメーターを有効にすると、Fluidは自動的にリージョン固有のキャッシュアフィニティルールをポッド仕様に注入します。 リージョン固有のキャッシュアフィニティルールは、キャッシュされたデータが配置されているリージョンを指定します。 ルールの重みは20です。 |
カスタム設定
ACKは、他のノードラベルを使用して、ACKクラスタ内のノードのトポロジ情報を識別し得る。 特定のノードラベルに基づいてカスタムアフィニティルールをポッド仕様に注入するようにFluidを構成するには、次の手順を実行します。
次のコマンドを実行して、webhook-plugins ConfigMapを変更します。
kubectl edit -n fluid-system cm webhook-plugins次のサンプルコードに基づいて、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: []次のコマンドを実行してFluid Webhookを再起動し、変更を適用します。
kubectl rollout restart deployment -n fluid-system fluid-webhook
例
例1: ノード固有のキャッシュアフィニティ規則に基づいてポッドをスケジュールする
シークレットを作成します。
apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: <ACCESS_KEY_ID> fs.oss.accessKeySecret: <ACCESS_KEY_SECRET>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"アプリケーションポッドを作成します。
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によって自動的に作成され、作成したデータセットにちなんで名前が付けられます。
ポッド仕様のアフィニティ設定を確認します。
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: ゾーン固有のキャッシュアフィニティ規則に基づいてポッドをスケジュールする
シークレットを作成します。
apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: <ACCESS_KEY_ID> fs.oss.accessKeySecret: <ACCESS_KEY_SECRET>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パラメーターで指定されています。アプリケーションポッドを作成します。
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によって自動的に作成され、作成したデータセットにちなんで名前が付けられます。
ポッド仕様のアフィニティ設定を確認します。
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: ノード固有のキャッシュアフィニティ規則に基づいてポッドのスケジューリングを強制する
シークレットを作成します。
apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: <ACCESS_KEY_ID> fs.oss.accessKeySecret: <ACCESS_KEY_SECRET>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"アプリケーションポッドを作成します。
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によって自動的に作成され、作成したデータセットにちなんで名前が付けられます。
ポッド仕様のアフィニティ設定を確認します。
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) がポッド仕様に注入されます。