6.3. 共享资源 CSI Driver Operator
共享资源 CSI 驱动程序功能现在包括在 Red Hat OpenShift 1.1 的构建中。此功能现在在 OpenShift Container Platform 中已弃用。要使用这个功能,请确保使用 Red Hat OpenShift 1.1 或更新版本的构建。
作为集群管理员,您可以在 OpenShift Container Platform 中使用 Shared Resource CSI Driver 来置备包含 Secret 或 ConfigMap 对象的内联临时卷。这样,pod 和其他 Kubernetes 类型用来公开卷挂载,OpenShift Container Platform 构建可以安全地在集群中的任何命名空间中使用这些对象的内容。要达到此目的,目前有两种类型的共享资源: Secret 对象的 SharedSecret 自定义资源,以及 ConfigMap 对象的 SharedConfigMap 自定义资源。
要启用共享资源 CSI 驱动程序,您必须使用功能门启用功能。
6.3.1. 关于 CSI 复制链接链接已复制到粘贴板!
在过去,存储厂商一般会把存储驱动作为 Kubernetes 的一个部分提供。随着容器存储接口 (CSI) 的实现,第三方供应商可以使用标准接口来提供存储插件,而无需更改核心 Kubernetes 代码。
CSI Operators 为 OpenShift Container Platform 用户提供了存储选项,如卷快照,它无法通过 in-tree 卷插件实现。
6.3.2. 在命名空间间共享 secret 复制链接链接已复制到粘贴板!
要在集群中的命名空间间共享 secret,您可以为您要共享的 Secret 对象创建一个 SharedSecret 自定义资源(CR)实例。
先决条件
您必须具有执行以下操作的权限:
-
在集群范围的级别上创建
sharedsecrets.sharedresource.openshift.io自定义资源定义(CRD)的实例。 - 管理集群中命名空间中的角色和角色绑定,以控制哪些用户可以获取、列出和监视这些实例。
-
管理角色和角色绑定,以控制 Pod 指定的服务帐户是否可以挂载引用您要使用的
SharedSecretCR 实例的 Container Storage Interface(CSI)卷。 - 访问包含您要共享 Secret 的命名空间。
流程
为您要在集群中的命名空间之间共享的
Secret对象创建一个SharedSecretCR 实例:oc apply -f - <<EOF apiVersion: sharedresource.openshift.io/v1alpha1 kind: SharedSecret metadata: name: my-share spec: secretRef: name: <name of secret> namespace: <namespace of secret> EOF$ oc apply -f - <<EOF apiVersion: sharedresource.openshift.io/v1alpha1 kind: SharedSecret metadata: name: my-share spec: secretRef: name: <name of secret> namespace: <namespace of secret> EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.3.3. 在 pod 中使用 SharedSecret 实例 复制链接链接已复制到粘贴板!
要从 Pod 访问 SharedSecret 自定义资源(CR)实例,您需要向给定的服务帐户 RBAC 权限授予该 SharedSecret CR 实例。
先决条件
-
您已为要在集群中的命名空间间共享的 secret 创建
SharedSecretCR 实例。 您必须具有执行以下操作的权限
-
输入
oc get sharedsecrets命令并返回非空列表来发现哪些SharedSecretCR 实例可用。 -
确定您的 Pod 指定的服务帐户是否可以使用给定的
SharedSecretCR 实例。也就是说,您可以运行oc adm policy who-can use <identifier of specific SharedSecret>来查看是否列出命名空间中的服务帐户。 -
确定您的 Pod 指定的服务帐户是否允许
csi卷使用 csi 卷,或者作为直接创建 pod 的请求用户使用csi卷。详情请参阅"识别和管理 pod 安全准入"。
-
输入
如果没有满足此列表中的最后两个先决条件,则建立或询问某人建立所需的基于角色的访问控制(RBAC),以便您可以发现 SharedSecret CR 实例,并启用服务帐户使用 SharedSecret CR 实例。
流程
通过使用带有 YAML 内容的
oc apply,为给定服务帐户 RBAC 权限授予其 pod 中的SharedSecretCR 实例:注意目前,
kubectl和oc具有硬编码的特殊大小写逻辑,以便将use动词的使用限制为只限于 pod 安全性相关的角色。因此,您无法使用oc create role …创建使用SharedSecretCR 实例所需的角色。oc apply -f - <<EOF apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: shared-resource-my-share namespace: my-namespace rules: - apiGroups: - sharedresource.openshift.io resources: - sharedsecrets resourceNames: - my-share verbs: - use EOF$ oc apply -f - <<EOF apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: shared-resource-my-share namespace: my-namespace rules: - apiGroups: - sharedresource.openshift.io resources: - sharedsecrets resourceNames: - my-share verbs: - use EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
oc命令创建与角色关联的RoleBinding:oc create rolebinding shared-resource-my-share --role=shared-resource-my-share --serviceaccount=my-namespace:builder
$ oc create rolebinding shared-resource-my-share --role=shared-resource-my-share --serviceaccount=my-namespace:builderCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从 Pod 访问
SharedSecretCR 实例:oc apply -f - <<EOF kind: Pod apiVersion: v1 metadata: name: my-app namespace: my-namespace spec: serviceAccountName: default containers omitted …. Follow standard use of ‘volumeMounts’ for referencing your shared resource volume volumes: - name: my-csi-volume csi: readOnly: true driver: csi.sharedresource.openshift.io volumeAttributes: sharedSecret: my-share EOF$ oc apply -f - <<EOF kind: Pod apiVersion: v1 metadata: name: my-app namespace: my-namespace spec: serviceAccountName: default # containers omitted …. Follow standard use of ‘volumeMounts’ for referencing your shared resource volume volumes: - name: my-csi-volume csi: readOnly: true driver: csi.sharedresource.openshift.io volumeAttributes: sharedSecret: my-share EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.3.4. 在命名空间间共享配置映射 复制链接链接已复制到粘贴板!
要在集群中的命名空间间共享配置映射,您可以为该配置映射创建 SharedConfigMap 自定义资源(CR)实例。
先决条件
您必须具有执行以下操作的权限:
-
在集群范围的级别上创建
sharedconfigmaps.sharedresource.openshift.io自定义资源定义(CRD)的实例。 - 管理集群中命名空间中的角色和角色绑定,以控制哪些用户可以获取、列出和监视这些实例。
- 管理集群中命名空间中的角色和角色绑定,以控制挂载 Container Storage Interface(CSI)卷的 pod 中的哪些服务帐户可以使用这些实例。
- 访问包含您要共享 Secret 的命名空间。
流程
为您要在集群中的命名空间之间共享的配置映射创建
SharedConfigMapCR 实例:oc apply -f - <<EOF apiVersion: sharedresource.openshift.io/v1alpha1 kind: SharedConfigMap metadata: name: my-share spec: configMapRef: name: <name of configmap> namespace: <namespace of configmap> EOF$ oc apply -f - <<EOF apiVersion: sharedresource.openshift.io/v1alpha1 kind: SharedConfigMap metadata: name: my-share spec: configMapRef: name: <name of configmap> namespace: <namespace of configmap> EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.3.5. 在 pod 中使用 SharedConfigMap 实例 复制链接链接已复制到粘贴板!
后续步骤
要从 pod 访问 SharedConfigMap 自定义资源(CR)实例,您需要授予给定服务帐户 RBAC 权限以使用该 SharedConfigMap CR 实例。
先决条件
-
为您要在集群中的命名空间之间共享的配置映射创建
SharedConfigMapCR 实例。 您必须具有执行以下操作的权限:
-
输入
oc get sharedconfigmaps命令并返回非空列表来发现哪些SharedConfigMapCR 实例可用。 -
确定您的 Pod 指定的服务帐户是否可以使用给定的
SharedSecretCR 实例。也就是说,您可以运行oc adm policy who-can use <identifier of specific SharedSecret>来查看是否列出命名空间中的服务帐户。 -
确定您的 Pod 指定的服务帐户是否允许
csi卷使用 csi 卷,或者作为直接创建 pod 的请求用户使用csi卷。详情请参阅"识别和管理 pod 安全准入"。
-
输入
如果没有满足此列表中的最后两个先决条件,则建立或询问某人建立所需的基于角色的访问控制(RBAC),以便您可以发现 SharedConfigMap CR 实例,并启用服务帐户使用 SharedConfigMap CR 实例。
流程
通过使用带有 YAML 内容的
oc apply,为给定服务帐户 RBAC 权限授予其 pod 中的SharedConfigMapCR 实例。注意目前,
kubectl和oc具有硬编码的特殊大小写逻辑,以便将use动词的使用限制为只限于 pod 安全性相关的角色。因此,您无法使用oc create role …创建使用SharedConfigMapCR 实例所需的角色。oc apply -f - <<EOF apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: shared-resource-my-share namespace: my-namespace rules: - apiGroups: - sharedresource.openshift.io resources: - sharedconfigmaps resourceNames: - my-share verbs: - use EOF$ oc apply -f - <<EOF apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: shared-resource-my-share namespace: my-namespace rules: - apiGroups: - sharedresource.openshift.io resources: - sharedconfigmaps resourceNames: - my-share verbs: - use EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
oc命令创建与角色关联的RoleBinding:oc create rolebinding shared-resource-my-share --role=shared-resource-my-share --serviceaccount=my-namespace:builder
oc create rolebinding shared-resource-my-share --role=shared-resource-my-share --serviceaccount=my-namespace:builderCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从 pod 访问
SharedConfigMapCR 实例:oc apply -f - <<EOF kind: Pod apiVersion: v1 metadata: name: my-app namespace: my-namespace spec: serviceAccountName: default containers omitted …. Follow standard use of ‘volumeMounts’ for referencing your shared resource volume volumes: - name: my-csi-volume csi: readOnly: true driver: csi.sharedresource.openshift.io volumeAttributes: sharedConfigMap: my-share EOF$ oc apply -f - <<EOF kind: Pod apiVersion: v1 metadata: name: my-app namespace: my-namespace spec: serviceAccountName: default # containers omitted …. Follow standard use of ‘volumeMounts’ for referencing your shared resource volume volumes: - name: my-csi-volume csi: readOnly: true driver: csi.sharedresource.openshift.io volumeAttributes: sharedConfigMap: my-share EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.3.6. 共享资源 CSI 驱动程序的额外支持限制 复制链接链接已复制到粘贴板!
共享资源 CSI 驱动程序有以下值得注意的限制:
- 驱动程序会受 Container Storage Interface(CSI)内联临时卷的限制。
-
readOnly字段的值必须是true。在创建Pod时,如果readOnly为false,验证准入 Webhook 会拒绝创建 pod。如果出于某种原因,验证准入 Webhook 无法在 pod 启动过程中在卷置备上联系,则驱动程序会向 kubelet 返回错误。要求readOnly为true,可以保持上游 Kubernetes CSI 驱动程序的建议最佳实践,以将 SELinux 标签应用到关联的卷。 -
驱动程序忽略
FSType字段,因为它仅支持tmpfs卷。 -
驱动程序忽略
NodePublishSecretRef字段。相反,它使用SubjectAccessReviews和use动词来评估 pod 是否可以获取包含SharedSecret或SharedConfigMap自定义资源(CR)实例的卷。 -
您无法创建名称以
openshift开头的SharedSecret或SharedConfigMap自定义资源 (CR) 实例。
6.3.7. 有关共享资源 pod 卷上的 VolumeAttributes 的更多详情 复制链接链接已复制到粘贴板!
共享资源 CSI 驱动程序功能现在包括在 Red Hat OpenShift 1.1 的构建中。此功能现在在 OpenShift Container Platform 中已弃用。要使用这个功能,请确保使用 Red Hat OpenShift 1.1 或更新版本的构建。
以下属性通过多种方式影响共享资源 pod 卷:
-
volumeAttributes属性中的refreshResource属性。 -
Shared Resource CSI Driver 配置中的
refreshResources属性。 -
volumeAttributes属性中的sharedSecret和sharedConfigMap属性。
6.3.7.1. refreshResource 属性 复制链接链接已复制到粘贴板!
Shared Resource CSI Driver 遵循卷的 volumeAttributes 属性中的 refreshResource 属性。此属性用于控制,在卷作为 pod 启动的一部分被初始置备后,的过程中,对底层 Secret 或 ConfigMap 对象的内容的更新是否会被复制到卷中。refreshResource 的默认值为 true,这意味着内容会被更新。
如果 Shared Resource CSI Driver 配置禁用了对 sharedSecret 和 SharedConfigMap 自定义资源(CR)实例的刷新,则 volumeAttribute 属性中的 refreshResource 属性没有作用。这个属性的目的是在通常允许刷新时为特定卷挂载禁用刷新。
6.3.7.2. refreshResources 属性 复制链接链接已复制到粘贴板!
您可以使用全局开关启用或禁用共享资源刷新。这个开关是 Shared Resource CSI Driver 的 csi-driver-shared-resource-config 配置映射中的 refreshResources 属性,您可以在 openshift-cluster-csi-drivers 命名空间中找到。如果将这个 refreshResources 属性设置为 false,则卷的初始置备后不会更新卷中存储的 Secret 或 ConfigMap 对象相关内容。
使用此共享资源 CSI 驱动程序配置来禁用刷新会影响所有使用共享资源 CSI Driver 的卷挂载,无论这些卷的 volumeAttributes 属性中的 refreshResource 属性是什么。
6.3.7.3. 在为 pod 置备共享资源卷前验证 volumeAttribute 复制链接链接已复制到粘贴板!
在单个卷的 volumeAttributes 中,您必须将 sharedSecret 或 sharedConfigMap 属性的值设置为 SharedSecret 或 SharedConfigMap CS 实例的值。否则,当在 pod 启动过程中置备卷时,验证会检查该卷的 volumeAttributes,并在出现以下条件时向 kubelet 返回错误:
-
sharedSecret和sharedConfigMap属性都指定了值。 -
sharedSecret和sharedConfigMap属性都没有指定值。 -
sharedSecret或sharedConfigMap属性的值与集群中的SharedSecret或SharedConfigMapCR 实例的名称不对应。
共享资源、Insights Operator 和 OpenShift Container Platform 构建之间的集成可以在 OpenShift Container Platform 构建中更轻松地使用红帽订阅(RHEL 权利)。
在以前的版本中,在 OpenShift Container Platform 4.9.x 及更早版本中,您可以手动导入凭证并将其复制到运行构建的每个项目或命名空间中。
现在,在 OpenShift Container Platform 4.10 及更新的版本中,OpenShift Container Platform 构建可以通过引用共享资源和 Insights Operator 提供的简单内容访问功能来使用红帽订阅(RHEL 权利):
-
简单的内容访问功能将您的订阅凭证导入到众所周知的
Secret对象。请参阅以下 "Additional resources" 部分的链接。 -
集群管理员创建与该
Secret对象相关的SharedSecret自定义资源(CR)实例,并授予特定项目或命名空间的权限。特别是,集群管理员会赋予builder服务帐户权限,以使用该SharedSecretCR 实例。 -
在这些项目或命名空间中运行的构建可以挂载一个 CSI 卷,该卷引用
SharedSecretCR 实例及其授权的 RHEL 内容。