×

OpenShift Container Platform能够使用容器存储接口(CSI)驱动程序为通用互联网文件系统(CIFS)方言/服务器消息块(SMB)协议配置持久卷(PV)。

CIFS/SMB CSI驱动程序操作符仅为技术预览功能。技术预览功能不受Red Hat生产服务级别协议(SLA)的支持,并且可能功能不完整。Red Hat不建议在生产环境中使用它们。这些功能可让客户尽早访问即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。

有关Red Hat技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

建议在使用CSI操作符和驱动程序时熟悉持久性存储配置CSI卷

安装CIFS/SMB CSI驱动程序操作符后,OpenShift Container Platform默认在openshift-cluster-csi-drivers命名空间中为操作符和驱动程序安装相应的Pod。这允许CIFS/SMB CSI驱动程序创建挂载到CIFS/SMB共享的CSI配置的持久卷(PV)。

  • CIFS/SMB CSI驱动程序操作符安装后,默认情况下不会创建用于创建持久卷声明(PVC)的存储类。但是,您可以手动创建用于动态配置的CIFS/SMB StorageClass。CIFS/SMB CSI驱动程序操作符支持动态卷配置,允许按需创建存储卷。这消除了集群管理员预配置存储的需要。

  • CIFS/SMB CSI驱动程序使您可以创建和挂载CIFS/SMB PV。

关于CSI

存储供应商传统上将存储驱动程序作为Kubernetes的一部分提供。通过实现容器存储接口(CSI),第三方提供商可以使用标准接口交付存储插件,而无需更改核心Kubernetes代码。

CSI操作符为OpenShift Container Platform用户提供了诸如卷快照之类的存储选项,而这些选项在树内卷插件中是不可能的。

限制

以下限制适用于通用互联网文件系统 (CIFS)/服务器消息块 (SMB) 容器存储接口 (CSI) 驱动程序操作符

  • 不支持 FIPS 模式

    启用联邦信息处理标准 (FIPS) 模式时,将禁用 md4 和 md5 的使用,这会阻止用户使用 ntlm、ntlmv2 或 ntlmssp 身份验证。此外,由于签名使用 md5,因此无法使用签名。启用 FIPS 模式时,使用这些方法的任何 CIFS 挂载都会失败。

  • CSI 驱动程序不支持使用 HTTP 代理配置连接到集群外部的 SMB 服务器。

    由于 CIFS/SMB 是一种局域网协议,尽管它可以路由到子网,但它并非设计用于扩展到广域网,并且不支持 HTTP 代理设置。

安装 CIFS/SMB CSI 驱动程序操作符

CIFS/SMB CSI 驱动程序操作符(一个 Red Hat 操作符)默认情况下未安装在 OpenShift Container Platform 中。请使用以下步骤在您的集群中安装和配置 CIFS/SMB CSI 驱动程序操作符。

先决条件
  • 访问 OpenShift Container Platform Web 控制台。

步骤

要从 Web 控制台安装 CIFS/SMB CSI 驱动程序操作符

  1. 登录到 Web 控制台。

  2. 安装 CIFS/SMB CSI 操作符

    1. 单击**操作符** → **OperatorHub**。

    2. 在筛选框中键入**CIFS/SMB CSI** 以查找 CIFS/SMB CSI 操作符。

    3. 单击**CIFS/SMB CSI 驱动程序操作符**按钮。

    4. 在**CIFS/SMB CSI 驱动程序操作符**页面上,单击**安装**。

    5. 在**安装操作符**页面上,确保:

      • 已选择**集群上的所有命名空间(默认)**。

      • **已安装命名空间**设置为**openshift-cluster-csi-drivers**。

    6. 单击**安装**。

      安装完成后,CIFS/SMB CSI 操作符将列在 Web 控制台的**已安装操作符**部分。

安装 CIFS/SMB CSI 驱动程序

安装 CIFS/SMB 容器存储接口 (CSI) 驱动程序操作符后,安装 CIFS/SMB CSI 驱动程序。

先决条件
  • 访问 OpenShift Container Platform Web 控制台。

  • 已安装 CIFS/SMB CSI 驱动程序操作符。

步骤
  1. 单击**管理** → **CustomResourceDefinitions** → **ClusterCSIDriver**。

  2. 在**实例**选项卡上,单击**创建 ClusterCSIDriver**。

  3. 使用以下 YAML 文件

    apiVersion: operator.openshift.io/v1
    kind: ClusterCSIDriver
    metadata:
        name: smb.csi.k8s.io
    spec:
      managementState: Managed
  4. 单击**创建**。

  5. 等待以下条件变为“True”状态

    • SambaDriverControllerServiceControllerAvailable

    • SambaDriverNodeServiceControllerAvailable

动态配置

您可以创建一个存储类,用于动态配置通用互联网文件系统 (CIFS) 方言/服务器消息块 (SMB) 协议卷。配置卷会在存储类中定义的source下创建一个具有持久卷 (PV) 名称的子目录。

先决条件
  • 已安装 CIFS/SMB CSI 驱动程序操作符和驱动程序。

  • 您已登录到正在运行的 OpenShift Container Platform 集群。

  • 您已安装 SMB 服务器,并了解有关服务器的以下信息:

    • 主机名

    • 共享名

    • 用户名和密码

步骤

要设置动态配置,请执行以下操作:

  1. 使用以下命令和示例 YAML 文件创建访问 Samba 服务器的密钥:

    $ oc create -f <file_name>.yaml
    密钥示例 YAML 文件
    apiVersion: v1
    kind: Secret
    metadata:
      name: smbcreds (1)
      namespace: samba-server (2)
    stringData:
      username: <username> (3)
      password: <password> (4)
    1 Samba 服务器的密钥名称。
    2 Samba 服务器的密钥命名空间。
    3 Samba 服务器的密钥用户名。
    4 Samba 服务器的密钥密码。
  2. 使用以下命令和示例 YAML 文件创建存储类:

    $ oc create -f <sc_file_name>.yaml (1)
    1 存储类示例 YAML 文件的名称。
    存储类示例 YAML 文件
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: <sc_name> (1)
    provisioner: smb.csi.k8s.io
    parameters:
      source: //<hostname>/<shares> (2)
      csi.storage.k8s.io/provisioner-secret-name: smbcreds (3)
      csi.storage.k8s.io/provisioner-secret-namespace: samba-server (4)
      csi.storage.k8s.io/node-stage-secret-name: smbcreds (3)
      csi.storage.k8s.io/node-stage-secret-namespace: samba-server (4)
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    mountOptions:
      - dir_mode=0777
      - file_mode=0777
      - uid=1001
      - gid=1001
    1 存储类的名称。
    2 必须在某个地方安装 Samba 服务器,并且集群可以访问该服务器,其中<`hostname>`是 Samba 服务器的主机名,<shares>是服务器配置为在已导出共享中拥有的路径。
    3 在前面步骤中设置的 Samba 服务器的密钥名称。如果提供了csi.storage.k8s.io/provisioner-secret,则会在source下创建一个具有 PV 名称的子目录。
    4 在前面步骤中设置的 Samba 服务器的密钥命名空间。
  3. 创建 PVC

    1. 使用以下命令和示例 YAML 文件创建 PVC:

      $ oc create -f <pv_file_name>.yaml (1)
      1 PVC YAML 文件的名称。
      PVC 示例 YAML 文件
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: <pvc_name> (1)
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: <storage_amount> (2)
        storageClassName: <sc_name> (3)
      1 PVC 的名称。
      2 存储请求量。
      3 您在前面步骤中创建的 CIFS/SMB 存储类的名称。
    2. 通过运行以下命令确保已创建 PVC 并处于“Bound”状态:

      $ oc describe pvc <pvc_name> (1)
      1 您在前面步骤中创建的 PVC 的名称。
      示例输出
      Name:          pvc-test
      Namespace:     default
      StorageClass:  samba
      Status:        Bound (1)
      ...
      1 PVC 处于 Bound 状态。

静态配置

您可以使用静态配置来创建持久卷 (PV) 和持久卷声明 (PVC) 以使用现有的服务器消息块协议 (SMB) 共享。

先决条件
  • 访问 OpenShift Container Platform Web 控制台。

  • 已安装 CIFS/SMB CSI 驱动程序操作符和驱动程序。

  • 您已安装 SMB 服务器,并了解有关服务器的以下信息:

    • 主机名

    • 共享名

    • 用户名和密码

步骤

要设置静态配置,请执行以下操作:

  1. 使用以下命令和示例 YAML 文件创建访问 Samba 服务器的密钥:

    $ oc create -f <file_name>.yaml
    密钥示例 YAML 文件
    apiVersion: v1
    kind: Secret
    metadata:
      name: smbcreds (1)
      namespace: samba-server (2)
    stringData:
      username: <username> (3)
      password: <password> (4)
    1 Samba 服务器的密钥名称。
    2 Samba 服务器的密钥命名空间。
    3 Samba 服务器的密钥用户名。
    4 Samba 服务器的密钥密码。
  2. 使用以下命令和示例 YAML 文件创建 PV:

    $ oc create -f <pv_file_name>.yaml (1)
    1 PV YAML 文件的名称。
    PV 示例 YAML 文件
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: smb.csi.k8s.io
      name: <pv_name> (1)
    spec:
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: ""
      mountOptions:
        - dir_mode=0777
        - file_mode=0777
      csi:
        driver: smb.csi.k8s.io
        volumeHandle: smb-server.default.svc.cluster.local/share#(2)
        volumeAttributes:
          source: //<hostname>/<shares> (3)
        nodeStageSecretRef:
          name: <secret_name_shares> (4)
          namespace: <namespace> (5)
    1 PV 的名称。
    2 volumeHandle 格式:{smb-server-address}#{sub-dir-name}#{share-name}。确保此值对于集群中的每个共享都是唯一的。
    3 必须在某个地方安装 Samba 服务器,并且集群可以访问该服务器,其中<hostname>是 Samba 服务器的主机名,<shares>是服务器配置为在已导出共享中拥有的路径。
    4 共享的密钥名称。
    5 适用的命名空间。
  3. 创建 PVC

    1. 使用以下命令和示例 YAML 文件创建 PVC:

      $ oc create -f <pv_file_name>.yaml (1)
      1 PVC YAML 文件的名称。
      PVC 示例 YAML 文件
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: <pvc_name> (1)
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: <storage_amount> (2)
        storageClassName: ""
        volumeName: <pv_name> (3)
      1 PVC 的名称。
      2 存储请求量。
      3 第一步中 PV 的名称。
    2. 通过运行以下命令确保已创建 PVC 并处于“Bound”状态:

      $ oc describe pvc <pvc_name> (1)
      1 您在前面步骤中创建的 PVC 的名称。
      示例输出
      Name:          pvc-test
      Namespace:     default
      StorageClass:
      Status:        Bound (1)
      ...
      1 PVC 处于 Bound 状态。
  4. 通过运行以下命令和示例 YAML 文件在 Linux 上创建部署:

    以下部署对于使用前面步骤中创建的 PV 和 PVC 并不是必需的。它是一个如何使用它们的示例。

    $ oc create -f <deployment_file_name>.yaml (1)
    1 部署 YAML 文件的名称。
    部署示例 YAML 文件
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: <deployment_name> (1)
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
          name: <deployment_name> (1)
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
            - name: <deployment_name> (1)
              image: quay.io/centos/centos:stream8
              command:
                - "/bin/bash"
                - "-c"
                - set -euo pipefail; while true; do echo $(date) >> <mount_path>/outfile; sleep 1; done (2)
              volumeMounts:
                - name: <vol_mount_name> (3)
                  mountPath: <mount_path> (2)
                  readOnly: false
          volumes:
            - name: <vol_mount_name> (3)
              persistentVolumeClaim:
                claimName: <pvc_name> (4)
      strategy:
        rollingUpdate:
          maxSurge: 0
          maxUnavailable: 1
        type: RollingUpdate
    1 部署的名称。
    2 卷挂载路径。
    3 卷挂载的名称。
    4 前面步骤中创建的 PVC 的名称。
  5. 在容器中运行df -h命令检查设置

    $ oc exec -it <pod_name> -- df -h (1)
    1 Pod 的名称。
    示例输出
    Filesystem            Size  Used Avail Use% Mounted on
    ...
    /dev/sda1              97G   21G   77G  22% /etc/hosts
    //20.43.191.64/share   97G   21G   77G  22% /mnt/smb
    ...

    在此示例中,/mnt/smb目录已作为通用互联网文件系统 (CIFS) 文件系统挂载。

其他资源