apiVersion: operator.openshift.io/v1
kind: ClusterCSIDriver
metadata:
name: smb.csi.k8s.io
spec:
managementState: Managed
OpenShift Container Platform能够使用容器存储接口(CSI)驱动程序为通用互联网文件系统(CIFS)方言/服务器消息块(SMB)协议配置持久卷(PV)。
CIFS/SMB CSI驱动程序操作符仅为技术预览功能。技术预览功能不受Red Hat生产服务级别协议(SLA)的支持,并且可能功能不完整。Red Hat不建议在生产环境中使用它们。这些功能可让客户尽早访问即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。 有关Red Hat技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。 |
安装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。
存储供应商传统上将存储驱动程序作为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 驱动程序操作符(一个 Red Hat 操作符)默认情况下未安装在 OpenShift Container Platform 中。请使用以下步骤在您的集群中安装和配置 CIFS/SMB CSI 驱动程序操作符。
访问 OpenShift Container Platform Web 控制台。
要从 Web 控制台安装 CIFS/SMB CSI 驱动程序操作符
登录到 Web 控制台。
安装 CIFS/SMB CSI 操作符
单击**操作符** → **OperatorHub**。
在筛选框中键入**CIFS/SMB CSI** 以查找 CIFS/SMB CSI 操作符。
单击**CIFS/SMB CSI 驱动程序操作符**按钮。
在**CIFS/SMB CSI 驱动程序操作符**页面上,单击**安装**。
在**安装操作符**页面上,确保:
已选择**集群上的所有命名空间(默认)**。
**已安装命名空间**设置为**openshift-cluster-csi-drivers**。
单击**安装**。
安装完成后,CIFS/SMB CSI 操作符将列在 Web 控制台的**已安装操作符**部分。
安装 CIFS/SMB 容器存储接口 (CSI) 驱动程序操作符后,安装 CIFS/SMB CSI 驱动程序。
访问 OpenShift Container Platform Web 控制台。
已安装 CIFS/SMB CSI 驱动程序操作符。
单击**管理** → **CustomResourceDefinitions** → **ClusterCSIDriver**。
在**实例**选项卡上,单击**创建 ClusterCSIDriver**。
使用以下 YAML 文件
apiVersion: operator.openshift.io/v1
kind: ClusterCSIDriver
metadata:
name: smb.csi.k8s.io
spec:
managementState: Managed
单击**创建**。
等待以下条件变为“True”状态
SambaDriverControllerServiceControllerAvailable
SambaDriverNodeServiceControllerAvailable
您可以创建一个存储类,用于动态配置通用互联网文件系统 (CIFS) 方言/服务器消息块 (SMB) 协议卷。配置卷会在存储类中定义的source
下创建一个具有持久卷 (PV) 名称的子目录。
已安装 CIFS/SMB CSI 驱动程序操作符和驱动程序。
您已登录到正在运行的 OpenShift Container Platform 集群。
您已安装 SMB 服务器,并了解有关服务器的以下信息:
主机名
共享名
用户名和密码
要设置动态配置,请执行以下操作:
使用以下命令和示例 YAML 文件创建访问 Samba 服务器的密钥:
$ oc create -f <file_name>.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 服务器的密钥密码。 |
使用以下命令和示例 YAML 文件创建存储类:
$ oc create -f <sc_file_name>.yaml (1)
1 | 存储类示例 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 服务器的密钥命名空间。 |
创建 PVC
使用以下命令和示例 YAML 文件创建 PVC:
$ oc create -f <pv_file_name>.yaml (1)
1 | 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 存储类的名称。 |
通过运行以下命令确保已创建 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 服务器,并了解有关服务器的以下信息:
主机名
共享名
用户名和密码
要设置静态配置,请执行以下操作:
使用以下命令和示例 YAML 文件创建访问 Samba 服务器的密钥:
$ oc create -f <file_name>.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 服务器的密钥密码。 |
使用以下命令和示例 YAML 文件创建 PV:
$ oc create -f <pv_file_name>.yaml (1)
1 | 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 | 适用的命名空间。 |
创建 PVC
使用以下命令和示例 YAML 文件创建 PVC:
$ oc create -f <pv_file_name>.yaml (1)
1 | 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 的名称。 |
通过运行以下命令确保已创建 PVC 并处于“Bound”状态:
$ oc describe pvc <pvc_name> (1)
1 | 您在前面步骤中创建的 PVC 的名称。 |
Name: pvc-test
Namespace: default
StorageClass:
Status: Bound (1)
...
1 | PVC 处于 Bound 状态。 |
通过运行以下命令和示例 YAML 文件在 Linux 上创建部署:
以下部署对于使用前面步骤中创建的 PV 和 PVC 并不是必需的。它是一个如何使用它们的示例。 |
$ oc create -f <deployment_file_name>.yaml (1)
1 | 部署 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 的名称。 |
在容器中运行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) 文件系统挂载。