You need to enable JavaScript to run this app.
导航
通过 FSX 客户端使用 TOS 静态存储卷
最近更新时间:2025.02.25 11:00:14首次发布时间:2025.02.25 11:00:14

FSX 支持对接 TOS 文件系统,作为 TOS 高可用 POSIX 文件系统客户端,提供 VKE 场景使用 TOS 客户端的故障恢复能力。本文为您介绍如何通过 FSX 客户端使用 TOS 静态存储卷。

背景信息

FSX 提供统一的接入、鉴权、管理等策略,可以为 vePFS、TOS 等文件系统提供节点级统一、易于接入的文件系统客户端,能够赋能 VKE 跨平台使用相同 FSX 客户端,提供文件系统挂载、接入,以及其他 IO 和安全丰富的特性。

区别于直接使用原生存储的方式,FXS 客户端能够提供更加普适的高性能能力,自由度更高,兼容性更强。

前提条件

  • 已经创建容器服务集群,并安装 csi-fsxfsx-service 组件。此外,如需跨租户挂载 FSX 文件系统,要求安装 vpc-cni-controlplane 组件,并确保当前集群的容器网络为 辅助网卡 Trunk 模式。创建容器集群的详细介绍参见 创建集群;组件安装的操作步骤参见 安装组件
  • 已经创建 TOS 存储桶,详细说明参见:创建存储桶
  • 确保指定命名空间下已经存在合适的密钥,创建密钥所需的火山引擎账号 AK/SK 获取方法参见:如何获取 API 访问密钥。若使用临时 Token 鉴权,需要自主实现刷新 Token 的逻辑。
  • 已经在本地安装 kubectl 工具,并通过 kubectl 连接目标集群。详细说明参见:连接集群

使用限制

  • 若使用临时 Token 鉴权,需要自主实现刷新 Token 的逻辑。
  • 有状态负载需要独占一个卷,暂不支持使用手动创建的存储卷声明。
  • FSX 客户端当前仅支持 x86_64 的体系结构,暂不支持在 Windows 和 macOS 环境使用,支持的环境详情参见:运行环境

操作步骤

通过 FSX 客户端使用 TOS 静态存储卷的详细步骤如下,可选步骤根据实际情况选择。

步骤一:(可选)创建 VPCENIDefinition

说明

仅跨租户挂载 FSX 文件系统场景,需要执行此步骤,否则跳过。

  1. 创建 VPCENIDefinition 的 Yaml 文件 vke-vepfs-fsx-ved.yaml,示例代码如下:
apiVersion: network.volcengine.com/v1beta1
kind: VPCENIDefinition
metadata:
  name: vpceni1             # 自定义 VPCENIDefinition 名称。
  namespace: default
spec:
  vpcID: vpc-rr1s2d***      # 必选,集群所属私有网络的 ID。
  allocateType:
    type: Elastic           # 必选,IP 分配模式,Elastic 表示弹性分配模式。
  securityGroupIDs: 
  - sg-rrhowl***            # 必选,Pod 默认安全组。
  subnetIDs:
  - subnet-13f64***         # 必选,指定 VPC 中的子网 ID。包括:集群 Pod 子网中的部分或全部子网、集群 Pod 子网中未指定但属于指定 VPC ID 的其他子网 ID。
  - subnet-13fy9***
  userAuth:
    chainingRoles:
    - trn:iam::xxxx:role/RoleForVke
    permissionServiceName: vke
  1. 执行以下命令,创建 VPCENIDefinition。
kubectl create -f vke-vepfs-fsx-ved.yaml

步骤二:(可选)创建 PodNetworkDefinition

说明

仅跨租户挂载 FSX 文件系统场景,需要执行此步骤,否则跳过。

  1. 创建 PodNetworkDefinition 的 Yaml 文件vke-vepfs-fsx-pnd.yaml,示例代码如下:
apiVersion: network.volcengine.com/v1beta1
kind: PodNetworkDefinition
metadata:
  name: vpceni1
  namespace: default
spec:
  ipResource:
    name: vpceni1              # 必选,自定义的 VPCENIDefinition 名称,要求与步骤一中配置的一致。
    type: VPCENIDefinition     # 必选,指定网络资源类型,固定值。
  1. 执行以下命令,创建 PodNetworkDefinition。
kubectl create -f vke-vepfs-fsx-pnd.yaml

步骤三:(可选)创建策略

说明

仅使用临时 Token 场景,需要执行此步骤,否则跳过。

创建策略的操作步骤参见 新建自定义策略,如需实现动态刷新临时 Token 的逻辑,参考 AssumeRole 接口。创建 TOS 策略的 Json 示例如下:

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "tos:Get*",
        "tos:ListBucket",
        "tos:Put*",
        "tos:Head*",
        "tos:DeleteObject",
        "tos:AbortMultipartUpload"
      ],
      "Resource": [
        "trn:tos:::<对象存储桶名称>",
        "trn:tos:::<对象存储桶名称>/*"
      ]
    }
  ]
}

步骤四:创建 Secret

  1. 创建 Secret 的 Yaml 文件vke-vepfs-fsx-secret.yaml,示例代码如下:
apiVersion: v1
data:
  AccessKeyId: <火山引擎账号 AK>          # Base 64 编码后的火山引擎账号 AK,需要替换为真实信息。
  SecretAccessKey: <火山引擎账号 SK>      # Base 64 编码后的火山引擎账号 SK,与上述 AK 匹配,需要替换为真实信息。
  ExpiredTime: <临时 Token 过期时间>      # Base 64 编码后的临时 Token 过期时间,如果使用账号 AK/SK,不需要指定。
  SessionToken: <临时 Token 内容>        # Base 64 编码后的临时 Token 内容,如果使用账号 AK/SK,不需要指定。
kind: Secret
metadata:
  name: vepfs-fsx-key
  namespace: default
type: Opaque
  1. 执行以下命令,创建 Secret。
kubectl create -f vke-vepfs-fsx-secret.yaml

步骤五:创建 PV

  1. 创建 PV 的 Yaml 文件文件vke-tos-fsx-static-pv.yaml,示例代码如下:
apiVersion: v1
kind: PersistentVolume
metadata:
  name: fsx-tos-with-iam-pv
spec:
  capacity:
    storage: 20Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Delete
  mountOptions:               # 挂载参数。
  - no_writeback_cache
  csi:
    driver: fsx.csi.volcengine.com
    volumeHandle: fsx-tos-pv
    volumeAttributes:
      type: TOS
      server: tos-cn-beijing.ivolces.com
      region: cn-beijing      # 如果 TOS 的 region 和当前集群位于相同 region,可以省略。
      bucket: csi-test
      path: /                                # 务必确保 path 存在,否则挂载会失败。
      subpath: /                             # 务必确保 subpath 存在,否则挂载会失败。
      secretName: tos-fsx-key                # 与步骤四中 Secret 的名称保持一致。  
      secretNamespace: default               # 与步骤四中 Secret 的命名空间保持一致。  
      networkDefinitionName: vpceni1         # 仅跨租户场景需要,与步骤二中 PodNetworkDefinition 的名称保持一致。
      networkDefinitionNamespace: default    # 仅跨租户场景需要,与步骤二中 PodNetworkDefinition 的命名空间保持一致。

说明

TOS 使用 FSX 客户端时支持配置挂载参数,包括基本参数、读缓存参数、写缓存参数等,更多详细说明参见:FXS 挂载参数说明

  1. 执行以下命令,创建 PV。
kubectl create -f vke-tos-fsx-static-pv.yaml

步骤六:创建 PVC

  1. 创建 PVC 的 Yaml 文件文件vke-vepfs-fsx-static-pvc.yaml,示例代码如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: vke-vepfs-fsx-static-pvc       # PVC 名称。
  namespace: default
spec:
  accessModes:                         # PVC 访问模式。目前仅支持 ReadWriteMany ,表示多点读写。
  - ReadWriteMany
  resources:
    requests:
      storage: 20Gi                    # 声明的存储使用量。
  volumeMode: Filesystem
  volumeName: vke-vepfs-fsx-static-pv  # 绑定到该 PVC 的 PV 名称。
  1. 执行以下命令,创建 PVC。
kubectl create -f vke-vepfs-fsx-static-pvc.yaml
  1. 执行以下命令,查看 PVC 与 PV 的静态绑定结果。
kubectl get pvc

预期输出结果如下,表示 PVC 与 PV 静态绑定成功。

NAME                       STATUS   VOLUME                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
vke-vepfs-fsx-static-pvc   Bound    vke-vepfs-fsx-static-pv    20Gi       RWX                          2m36s

步骤七:创建 Deployment

  1. 创建 Deployment 的 Yaml 文件文件vke-vepfs-fsx-static-deployment.yaml,示例代码如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vke-static-vepfs-fsx-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: vke-static-vepfs-fsx-deploy
  template:
    metadata:
      labels:
        app: vke-static-vepfs-fsx-deploy
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx
        volumeMounts:
        - mountPath: /tmp          # FSX 文件系统在容器中挂载的位置。
          name: vepfs-fsx-pv
      volumes:
      - name: vepfs-fsx-pv
        persistentVolumeClaim:
          claimName: vke-vepfs-fsx-static-pvc  # 步骤六中创建的 PVC 名称。
  1. 执行以下命令创建 Deployment。
kubectl create -f vke-vepfs-fsx-static-deployment.yaml