×

共享资源CSI驱动程序功能现已在Red Hat OpenShift 1.1构建中普遍可用。此功能现已在OpenShift Container Platform中弃用。要使用此功能,请确保您使用的是Red Hat OpenShift 1.1构建或更高版本。

作为集群管理员,您可以使用OpenShift Container Platform中的共享资源CSI驱动程序来配置包含SecretConfigMap对象内容的内联临时卷。这样,公开卷挂载的Pod和其他Kubernetes类型以及OpenShift Container Platform构建就可以安全地在集群中任何命名空间中使用这些对象的内容。为此,目前有两种类型的共享资源:用于Secret对象的SharedSecret自定义资源和用于ConfigMap对象的SharedConfigMap自定义资源。

要启用共享资源CSI驱动程序,您必须使用特性门启用特性

关于CSI

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

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

跨命名空间共享密钥

要在集群中跨命名空间共享密钥,您可以为要共享的Secret对象创建一个SharedSecret自定义资源 (CR) 实例。

先决条件

您必须具有执行以下操作的权限

  • 在集群范围级别创建sharedsecrets.sharedresource.openshift.io自定义资源定义 (CRD) 的实例。

  • 管理集群中命名空间的 roles 和 role bindings,以控制哪些用户可以获取、列出和监视这些实例。

  • 管理 roles 和 role bindings,以控制Pod指定的Service Account是否可以挂载引用要使用的SharedSecret CR实例的容器存储接口 (CSI) 卷。

  • 访问包含要共享的密钥的命名空间。

步骤
  • 为要在集群中跨命名空间共享的Secret对象创建一个SharedSecret CR 实例

    $ 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

在Pod中使用SharedSecret实例

要从Pod访问SharedSecret自定义资源 (CR) 实例,您可以授予给定的Service Account使用该SharedSecret CR实例的RBAC权限。

先决条件
  • 您已为要在集群中跨命名空间共享的密钥创建了SharedSecret CR 实例。

  • 您必须具有执行以下操作的权限

    • 通过输入oc get sharedsecrets命令并获得非空列表来发现可用的SharedSecret CR实例。

    • 确定Pod指定的Service Account是否允许使用给定的SharedSecret CR实例。也就是说,您可以运行oc adm policy who-can use <特定SharedSecret的标识符>来查看您的命名空间中的Service Account是否列出。

    • 确定Pod指定的Service Account是否允许使用csi卷,或者您(作为直接创建Pod的请求用户)是否允许使用csi卷。有关详细信息,请参阅“了解和管理Pod安全准入”。

如果此列表中的最后两个先决条件均未满足,请创建或请求其他人创建必要的基于角色的访问控制 (RBAC),以便您可以发现SharedSecret CR实例并启用Service Account使用SharedSecret CR实例。

步骤
  1. 使用带有YAML内容的oc apply命令授予给定的Service Account使用其Pod中的SharedSecret CR实例的RBAC权限

    目前,kubectloc具有硬编码的特殊情况逻辑,将use动词限制在围绕Pod安全的 roles 上。因此,您不能使用oc create role …​来创建使用SharedSecret CR实例所需的 role。

    $ 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
  2. 使用oc命令创建与 role 关联的RoleBinding

    $ oc create rolebinding shared-resource-my-share --role=shared-resource-my-share --serviceaccount=my-namespace:builder
  3. 从Pod访问SharedSecret CR实例

    $ 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

跨命名空间共享ConfigMap

要在集群中跨命名空间共享ConfigMap,您可以为该ConfigMap创建一个SharedConfigMap自定义资源 (CR) 实例。

先决条件

您必须具有执行以下操作的权限

  • 在集群范围级别创建sharedconfigmaps.sharedresource.openshift.io自定义资源定义 (CRD) 的实例。

  • 管理集群中命名空间的 roles 和 role bindings,以控制哪些用户可以获取、列出和监视这些实例。

  • 管理集群中命名空间的 roles 和 role bindings,以控制挂载容器存储接口 (CSI) 卷的Pod中的哪些Service Account可以使用这些实例。

  • 访问包含要共享的密钥的命名空间。

步骤
  1. 为要在集群中跨命名空间共享的ConfigMap创建一个SharedConfigMap CR 实例

    $ 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

在Pod中使用SharedConfigMap实例

后续步骤

要从Pod访问SharedConfigMap自定义资源 (CR) 实例,您可以授予给定的Service Account使用该SharedConfigMap CR实例的RBAC权限。

先决条件
  • 您已为要在集群中跨命名空间共享的ConfigMap创建了SharedConfigMap CR 实例。

  • 您必须具有执行以下操作的权限

    • 通过输入oc get sharedconfigmaps命令并获得非空列表来发现可用的SharedConfigMap CR实例。

    • 确定Pod指定的Service Account是否允许使用给定的SharedSecret CR实例。也就是说,您可以运行oc adm policy who-can use <特定SharedSecret的标识符>来查看您的命名空间中的Service Account是否列出。

    • 确定Pod指定的Service Account是否允许使用csi卷,或者您(作为直接创建Pod的请求用户)是否允许使用csi卷。有关详细信息,请参阅“了解和管理Pod安全准入”。

如果此列表中的最后两个先决条件均未满足,请创建或请求其他人创建必要的基于角色的访问控制 (RBAC),以便您可以发现SharedConfigMap CR实例并启用Service Account使用SharedConfigMap CR实例。

步骤
  1. 使用包含 YAML 内容的 oc apply 命令,授予给定的服务账户 RBAC 权限,以便其 Pod 使用 SharedConfigMap CR 实例。

    目前,kubectloc 具有硬编码的特殊情况逻辑,将 use 动词限制在围绕 Pod 安全性的角色上。因此,您无法使用 oc create role …​ 创建使用 SharedConfigMap CR 实例所需的 role。

    $ 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
  2. 使用oc命令创建与 role 关联的RoleBinding

    oc create rolebinding shared-resource-my-share --role=shared-resource-my-share --serviceaccount=my-namespace:builder
  3. 从 Pod 访问 SharedConfigMap CR 实例

    $ 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

共享资源 CSI 驱动程序的其他支持限制

共享资源 CSI 驱动程序具有以下值得注意的限制

  • 该驱动程序受容器存储接口 (CSI) 内联临时卷的限制。

  • readOnly 字段的值必须为 true。在创建 Pod 时,如果 readOnlyfalse,则验证准入 Webhook 会拒绝 Pod 创建。如果由于某种原因无法联系验证准入 Webhook,则在 Pod 启动期间进行卷置备时,驱动程序会向 kubelet 返回错误。要求 readOnlytrue 符合上游 Kubernetes CSI 驱动程序为关联卷应用 SELinux 标签的建议最佳实践。

  • 驱动程序会忽略 FSType 字段,因为它只支持 tmpfs 卷。

  • 驱动程序会忽略 NodePublishSecretRef 字段。相反,它使用带有 use 动词的 SubjectAccessReviews 来评估 Pod 是否可以获取包含 SharedSecretSharedConfigMap 自定义资源 (CR) 实例的卷。

  • 您无法创建名称以 openshift 开头的 SharedSecretSharedConfigMap 自定义资源 (CR) 实例。

关于共享资源 Pod 卷上 VolumeAttributes 的更多详细信息

共享资源CSI驱动程序功能现已在Red Hat OpenShift 1.1构建中普遍可用。此功能现已在OpenShift Container Platform中弃用。要使用此功能,请确保您使用的是Red Hat OpenShift 1.1构建或更高版本。

以下属性会以各种方式影响共享资源 Pod 卷

  • volumeAttributes 属性中的 refreshResource 属性。

  • 共享资源 CSI 驱动程序配置中的 refreshResources 属性。

  • volumeAttributes 属性中的 sharedSecretsharedConfigMap 属性。

refreshResource 属性

共享资源 CSI 驱动程序会遵守 volumeAttributes 属性中卷的 refreshResource 属性。此属性控制在卷作为 Pod 启动的一部分初始置备**之后**,是否将基础 SecretConfigMap 对象内容的更新复制到卷中。refreshResource 的默认值为 true,这意味着内容会更新。

如果共享资源 CSI 驱动程序配置已禁用共享 SharedSecretSharedConfigMap 自定义资源 (CR) 实例的刷新,则 volumeAttribute 属性中的 refreshResource 属性无效。此属性的目的是在通常允许刷新时禁用特定卷挂载的刷新。

refreshResources 属性

您可以使用全局开关来启用或禁用共享资源的刷新。此开关是共享资源 CSI 驱动程序的 csi-driver-shared-resource-config ConfigMap 中的 refreshResources 属性,您可以在 openshift-cluster-csi-drivers 命名空间中找到它。如果将此 refreshResources 属性设置为 false,则在卷的初始置备之后,不会更新存储在卷中的任何 SecretConfigMap 对象相关内容。

使用此共享资源 CSI 驱动程序配置禁用刷新会影响使用共享资源 CSI 驱动程序的集群的所有卷挂载,而不管这些卷的 volumeAttributes 属性中的 refreshResource 属性如何。

在为 Pod 置备共享资源卷之前验证 volumeAttributes

在单个卷的 volumeAttributes 中,必须将 sharedSecretsharedConfigMap 属性设置为 SharedSecretSharedConfigMap CS 实例的值。否则,在 Pod 启动期间置备卷时,验证会检查该卷的 volumeAttributes,并在以下情况下向 kubelet 返回错误

  • sharedSecretsharedConfigMap 属性都指定了值。

  • sharedSecretsharedConfigMap 属性均未指定值。

  • sharedSecretsharedConfigMap 属性的值与集群中 SharedSecretSharedConfigMap CR 实例的名称不对应。

共享资源、Insights Operator 和 OpenShift Container Platform 构建之间的集成

共享资源、Insights Operator 和 OpenShift Container Platform 构建之间的集成简化了在 OpenShift Container Platform 构建中使用 Red Hat 订阅(RHEL 授权)的过程。

以前,在 OpenShift Container Platform 4.9.x 和更早版本中,您需要手动导入凭据并将它们复制到运行构建的每个项目或命名空间。

现在,在 OpenShift Container Platform 4.10 及更高版本中,OpenShift Container Platform 构建可以通过引用共享资源和 Insights Operator 提供的简单内容访问功能来使用 Red Hat 订阅(RHEL 授权)。

  • 简单内容访问功能会将您的订阅凭据导入到众所周知的 Secret 对象中。请参阅以下“其他资源”部分中的链接。

  • 集群管理员会在该 Secret 对象周围创建一个 SharedSecret 自定义资源 (CR) 实例,并向特定项目或命名空间授予权限。特别是,集群管理员会授予 builder 服务帐户使用该 SharedSecret CR 实例的权限。

  • 在这些项目或命名空间中运行的构建可以挂载引用 SharedSecret CR 实例及其授权的 RHEL 内容的 CSI 卷。