5.21. CIFS/SMB CSI Driver Operator


OpenShift Container Platform 能够置备持久性卷 (PV),它带有一个用于通用互联网文件系统(CIFS) dialect/Server Message Block (SMB)协议的 Container Storage Interface (CSI) 驱动程序。

重要

CIFS/SMB CSI Driver Operator 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

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

在使用 CSI Operator 和驱动程序时,建议先熟悉 持久性存储配置 CSI 卷

安装 CIFS/SMB CSI Driver Operator 后,OpenShift Container Platform 默认会在 openshift-cluster-csi-drivers 命名空间中为 Operator 和驱动程序安装对应的 pod。这允许 CIFS/SMB CSI 驱动程序创建挂载到 CIFS/SMB 共享的 CSI 置备的持久性卷 (PV)。

  • 安装之后,CIFS/SMB CSI Driver Operator 不会默认创建存储类来创建持久性卷声明 (PVC)。但是,您可以手动为动态置备创建 CIFS/SMB StorageClass。CIFS/SMB CSI Driver Operator 支持动态卷置备,方法是允许按需创建存储卷。这消除了集群管理员预置备存储的需求。
  • CIFS/SMB CSI 驱动程序 允许您创建并挂载 CIFS/SMB PV。

5.21.1. 关于 CSI

在过去,存储厂商一般会把存储驱动作为 Kubernetes 的一个部分提供。随着容器存储接口 (CSI) 的实现,第三方供应商可以使用标准接口来提供存储插件,而无需更改核心 Kubernetes 代码。

CSI Operators 为 OpenShift Container Platform 用户提供了存储选项,如卷快照,它无法通过 in-tree 卷插件实现。

5.21.2. 限制:

以下限制适用于通用互联网文件系统(CIFS)/服务器消息块(SMB) Container Storage Interface (CSI) Driver Operator:

  • 不支持 FIPS 模式:

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

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

    由于 CIFS/SMB 是 LAN 协议,但可以路由到子网,它不设计为通过 WAN 扩展,且不支持 HTTP 代理设置。

5.21.3. 安装 CIFS/SMB CSI Driver Operator

默认情况下,在 OpenShift Container Platform 中不会安装 CIFS/SMB CSI Driver Operator (Red Hat Operator)。使用以下步骤在集群中安装和配置 CIFS/SMB CSI Driver Operator。

先决条件

  • 访问 OpenShift Container Platform Web 控制台。

流程

从 web 控制台安装 CIFS/SMB CSI Driver Operator:

  1. 登录到 web 控制台。
  2. 安装 CIFS/SMB CSI Operator:

    1. Operators OperatorHub
    2. 通过在过滤器框中输入 CIFS/SMB CSI 来找到 CIFS/SMB CSI
    3. CIFS/SMB CSI Driver Operator 按钮。
    4. CIFS/SMB CSI Driver Operator 页中,点 Install
    5. Install Operator 页面中,确保:

      • 选择 All namespaces on the cluster (default)
      • 安装的命名空间 被设置为 openshift-cluster-csi-drivers
    6. Install

      安装完成后,Web 控制台的 Installed Operators 部分列出了 CIFS/SMB CSI Operator。

5.21.4. 安装 CIFS/SMB CSI 驱动程序

安装 CIFS/SMB Container Storage Interface (CSI) Driver Operator 后,安装 CIFS/SMB CSI 驱动程序。

先决条件

  • 访问 OpenShift Container Platform Web 控制台。
  • 已安装 CIFS/SMB CSI Driver Operator。

流程

  1. Administration CustomResourceDefinitions ClusterCSIDriver
  2. Instances 选项卡上,单击 Create ClusterCSIDriver
  3. 使用以下 YAML 文件:

    apiVersion: operator.openshift.io/v1
    kind: ClusterCSIDriver
    metadata:
        name: smb.csi.k8s.io
    spec:
      managementState: Managed
  4. Create
  5. 等待以下 Conditions 更改为 "True" 状态:

    • SambaDriverControllerServiceControllerAvailable
    • SambaDriverNodeServiceControllerAvailable

5.21.5. 动态置备

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

先决条件

  • 已安装 CIFS/SMB CSI Driver Operator 和驱动程序。
  • 已登陆到正在运行的 OpenShift Container Platform 集群。
  • 已安装 SMB 服务器并了解有关服务器的以下信息:

    • 主机名
    • 共享名称
    • 用户名和密码

流程

设置动态置备:

  1. 使用以下命令,使用以下示例 YAML 文件创建 Secret 以访问 Samba 服务器:

    $ oc create -f <file_name>.yaml

    Secret YAML 文件示例

    apiVersion: v1
    kind: Secret
    metadata:
      name: smbcreds 1
      namespace: samba-server 2
    stringData:
      username: <username> 3
      password: <password> 4

    1
    Samba 服务器的 Secret 名称。
    2
    Samba 服务器的 Secret 的命名空间。
    3
    Samba 服务器 Secret 的用户名。
    4
    Samba 服务器的 Secret 的密码。
  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 5
      csi.storage.k8s.io/node-stage-secret-namespace: samba-server 6
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    mountOptions:
      - dir_mode=0777
      - file_mode=0777
      - uid=1001
      - gid=1001

    1
    存储类的名称。
    2
    Samba 服务器必须安装在某个可从集群中访问的位置,其中 <'hostname>' 是 Samba 服务器的主机名,<shares> 是服务器配置为在导出的共享中的路径。
    3 5
    上一步中设置的 Samba 服务器的 Secret 名称。如果提供了 csi.storage.k8s.io/provisioner-secret,则会使用 PV 名称在 source 下创建一个子目录。
    4 6
    上一步中设置的 Samba 服务器的 Secret 的命名空间。
  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 状态。

5.21.6. 静态置备

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

先决条件

  • 访问 OpenShift Container Platform Web 控制台。
  • 已安装 CIFS/SMB CSI Driver Operator 和驱动程序。
  • 已安装 SMB 服务器并了解有关服务器的以下信息:

    • 主机名
    • 共享名称
    • 用户名和密码

流程

设置静态置备:

  1. 使用以下命令,使用以下示例 YAML 文件创建 Secret 以访问 Samba 服务器:

    $ oc create -f <file_name>.yaml

    Secret YAML 文件示例

    apiVersion: v1
    kind: Secret
    metadata:
      name: smbcreds 1
      namespace: samba-server 2
    stringData:
      username: <username> 3
      password: <password> 4

    1
    Samba 服务器的 Secret 名称。
    2
    Samba 服务器的 Secret 的命名空间。
    3
    Samba 服务器 Secret 的用户名。
    4
    Samba 服务器的 Secret 的密码。
  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
    共享的 Secret 名称。
    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> 2
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
            - name: <deployment_name> 3
              image: quay.io/centos/centos:stream8
              command:
                - "/bin/bash"
                - "-c"
                - set -euo pipefail; while true; do echo $(date) >> <mount_path>/outfile; sleep 1; done 4
              volumeMounts:
                - name: <vol_mount_name> 5
                  mountPath: <mount_path> 6
                  readOnly: false
          volumes:
            - name: <vol_mount_name> 7
              persistentVolumeClaim:
                claimName: <pvc_name> 8
      strategy:
        rollingUpdate:
          maxSurge: 0
          maxUnavailable: 1
        type: RollingUpdate

    1 2 3
    部署的名称。
    4 6
    卷挂载路径。
    5 7
    卷挂载的名称。
    8
    上一步中创建的 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 目录被挂载为通用 Internet 文件系统 (CIFS) 文件系统。

5.21.7. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.