×

作为集群管理员,您可以在任何使用 volume 类型为 csi 的 Kubernetes 对象中使用共享资源容器存储接口 (CSI) 驱动程序,以预配包含 SecretConfigMap 对象内容的内联临时卷。这样,公开卷挂载点的 Pod 和其他 Kubernetes 类型以及 OpenShift Container Platform 构建就可以安全地跨集群中任何命名空间使用这些对象的内容。为此,目前有两种类型的共享资源:

  • SharedSecret 自定义资源,用于 Secret 对象

  • SharedConfigMap 自定义资源,用于 ConfigMap 对象

关于 CSI

存储供应商传统上将存储驱动程序作为 Kubernetes 的一部分提供。通过容器存储接口 (CSI) 的实现,第三方提供商可以使用标准接口交付存储插件,而无需更改核心 Kubernetes 代码。CSI 操作符为构建用户提供了诸如卷快照之类的存储选项,而这些选项在树内卷插件中是不可能的。

跨命名空间共享密钥

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

先决条件
  • 您已创建要与其他命名空间共享的 Secret 对象。

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

    • 您已订阅集群并已通过 Insights Operator 同步授权密钥。

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

    • 您已为 SharedConfigMap CR 创建了 ClusterRole 对象。

    • 您已为共享资源 CSI 驱动程序创建了 RoleRoleBinding 对象。

    • 您已在集群中的命名空间之间管理角色和角色绑定以控制用户。

    • 您已管理角色和角色绑定,以控制 Pod 指定的服务帐户是否可以挂载引用您要使用的 SecretConfigmap CR 的容器存储接口 (CSI) 卷。

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

步骤
  1. 使用以下示例配置创建一个 SharedSecret 实例,以跨集群中的命名空间共享引用的 Secret

    apiVersion: sharedresource.openshift.io/v1alpha1
    kind: SharedSecret
    metadata:
      name: shared-test-secret (1)
    spec:
      secretRef:
        name: test-secret
        namespace: <name_of_the_source_namespace>
    1 定义 SharedSecret CR 的名称。
  2. 使用以下示例配置创建一个 ClusterRole 对象,该对象授予使用引用的共享资源的 RBAC 权限:

    . apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: use-shared-test-secret (1)
    rules:
      - apiGroups:
          - sharedresource.openshift.io
        resources:
          - sharedsecrets
        resourceNames:
          - shared-test-secret
        verbs:
          - use
    1 定义 ClusterRole CR 的名称。
  3. 创建授予共享资源 CSI 驱动程序访问 SharedSecret 对象权限的 RoleRoleBinding 对象。

    Role 对象示例
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: share-etc-pki-entitlement (1)
      namespace: openshift-config-managed
    rules:
      - apiGroups:
          - ""
        resources:
          - secrets
        resourceNames:
          - etc-pki-entitlement
        verbs:
          - get
          - list
          - watch
    1 定义 Role CR 的名称。
    RoleBinding 对象示例
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: share-etc-pki-entitlement (1)
      namespace: openshift-config-managed
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: share-etc-pki-entitlement (2)
    subjects:
      - kind: ServiceAccount
        name: csi-driver-shared-resource (3)
        namespace: openshift-builds
    1 定义 RoleBinding CR 的名称。
    2 定义 Role CR 的名称。
    3 定义 ServiceAccount CR 的名称。

在 Pod 中使用 SharedSecret 实例

要从 Pod 访问 SharedSecret 自定义资源 (CR),您可以向服务帐户授予基于角色的访问控制 (RBAC) 权限。

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

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

    • 通过输入 oc get sharedconfigmaps 命令获取 SharedConfigMap CR 实例的列表。

    • 通过运行 oc adm policy who-can use <sharedsecret_identifier> 命令检查服务帐户是否被允许使用 SharedSecret CR 以及服务帐户是否列在您的命名空间中。

    • 确认您的 Pod 的服务帐户是否被允许使用 csi 卷。如果您以用户的身份创建了 Pod,请确认您是否被允许使用 csi 卷。

如果您无法完成最后两个先决条件,则集群管理员可以建立必要的基于角色的访问控制 (RBAC),以便您可以使服务帐户能够使用 SharedConfigMap CR。

步骤
  1. 创建与角色关联的 RoleBinding 对象,并授予您的服务帐户使用共享资源的权限。请参见以下示例配置:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: use-shared-secret (1)
      namespace: app-namespace
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: use-shared-secret
    subjects:
      - kind: ServiceAccount
        name: <service_account_name> (2)
    1 定义 RoleBinding CR 的名称。
    2 指定应用程序的服务帐户名称。
  2. 将共享资源csi驱动程序挂载到Pod或任何其他接受csi卷的资源中。请参阅以下示例配置

    apiVersion: v1
    kind: Pod
    metadata:
      name: example-shared-secret
      namespace: <app_namespace> (1)
    spec:
      ...
      serviceAccountName: default
      volumes:
        - name: shared-secret
          csi:
            readOnly: true
            driver: csi.sharedresource.openshift.io
            volumeAttributes:
              sharedSecret: shared-test-secret (2)
    1 将<app_namespace>替换为应用程序的命名空间名称。
    2 定义sharedSecret属性的值,该值必须与SharedSecret CR的名称相同。

跨命名空间共享ConfigMap

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

先决条件

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

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

  • SharedConfigMap CR创建ClusterRole对象。

  • 为共享资源容器存储接口 (CSI) 驱动程序创建角色和角色绑定。

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

  • 管理集群中跨命名空间的角色和角色绑定,以控制哪些Pod中挂载CSI卷的服务帐户可以使用这些实例。

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

步骤
  1. 为要在集群中跨命名空间共享的ConfigMap创建一个SharedConfigMap CR 实例。请参阅以下示例配置

    apiVersion: sharedresource.openshift.io/v1alpha1
    kind: SharedConfigMap
    metadata:
      name: share-test-config (1)
    spec:
      configMapRef:
        name: shared-config
        namespace: <name_of_the_source_namespace> (2)
    1 定义SharedConfigMap CR的名称。
    2 <name_of_the_source_namespace>替换为源命名空间的名称。
  2. 创建一个ClusterRole CR 实例,使用以下示例配置授予基于角色的访问控制 (RBAC) 权限以使用引用的共享资源

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: <cluster_role_name> (1)
    rules:
      - apiGroups:
          - sharedresource.openshift.io
        resources:
          - sharedconfigmaps
        resourceNames:
          - share-test-config (2)
        verbs:
          - use
    1 将<cluster_role_name>替换为集群角色的名称。
    2 定义 SharedSecret CR 的名称。
  3. 创建RoleRoleBinding对象,以授予CSI驱动程序访问ConfigMap的权限

    Role 对象示例
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: shared-test-config
      namespace: test-share-source (1)
    rules:
      - apiGroups: [""]
        resources: ["configmaps"]
        resourceNames: ["shared-config"]
        verbs: ["get", "list", "watch"]
    1 定义源命名空间的名称。
    RoleBinding 对象示例
     apiVersion: rbac.authorization.k8s.io/v1
     kind: RoleBinding
     metadata:
       name: shared-test-config
       namespace: test-share-source (1)
     roleRef:
       apiGroup: rbac.authorization.k8s.io
       kind: Role
       name: shared-test-config
     subjects: (2)
       - kind: ServiceAccount
         name: csi-driver-shared-resource
         namespace: openshift-builds
    1 定义源命名空间的名称。
    2 定义共享资源CSI驱动程序DaemonSet的服务帐户列表。当与OpenShift构建一起部署时,服务帐户名称为csi-driver-shared-resource,命名空间与部署OpenShift构建操作符的命名空间相同。

在Pod中使用SharedConfigMap实例

要从Pod访问SharedConfigMap自定义资源 (CR) 实例,需要授予给定的服务帐户基于角色的访问控制 (RBAC) 权限以使用该SharedConfigMap CR 实例。

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

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

    • 通过输入 oc get sharedconfigmaps 命令获取 SharedConfigMap CR 实例的列表。

    • 通过运行 oc adm policy who-can use <sharedsecret_identifier> 命令检查服务帐户是否被允许使用 SharedSecret CR 以及服务帐户是否列在您的命名空间中。

    • 确认您的 Pod 的服务帐户是否被允许使用 csi 卷。如果您以用户的身份创建了 Pod,请确认您是否被允许使用 csi 卷。

如果您无法完成最后两个先决条件,则集群管理员可以建立必要的基于角色的访问控制 (RBAC),以便您可以使服务帐户能够使用 SharedConfigMap CR。

步骤
  1. 创建与角色关联的 RoleBinding 对象,并授予您的服务帐户使用共享资源的权限。请参见以下示例配置:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: use-shared-config
      namespace: <app_namespace> (1)
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: use-shared-config
    subjects:
      - kind: ServiceAccount
        name: <service_account_name> (2)
    1 将<app_namespace>替换为应用程序的命名空间名称。
    2 指定应用程序的服务帐户名称。
  2. 将共享资源csi驱动程序挂载到Pod或任何其他接受csi卷的资源中。请参阅以下示例配置

    apiVersion: v1
    kind: Pod
    metadata:
      name: example-shared-config
      namespace: <app_namespace> (1)
    spec:
      ...
      serviceAccountName: default
      volumes:
        - name: shared-config
          csi:
            readOnly: true
            driver: csi.sharedresource.openshift.io
            volumeAttributes:
              sharedConfigMap: share-test-config (2)
    1 将<app_namespace>替换为应用程序的命名空间名称。
    2 定义sharedConfigMap对象的名称。

验证volumeAttributes的条件

在单个卷的volumeAttributes字段中,必须将sharedSecretsharedConfigMap属性设置为SharedSecretSharedConfigMap实例的值。否则,当在Pod启动期间预配卷时,验证检查会向kubelet返回错误。请查看以下条件以预配Pod的共享资源卷

  • 必须为sharedSecretsharedConfigMap属性指定值。

  • sharedSecretsharedConfigMap属性的值必须与其自定义资源 (CR) 的名称匹配。

使用OpenShift订阅授权构建镜像

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

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

  • 简单内容访问功能会将您的订阅凭据导入到众所周知的Secret对象中。

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

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

使用SharedSecret对象运行构建

您可以使用SharedSecret对象安全地访问集群中构建的RHEL授权密钥。SharedSecret对象允许您跨命名空间共享和同步密钥。

先决条件
  • 您必须具有执行以下操作的权限:

    • 创建构建配置并启动构建。

    • 创建SharedSecret对象。

    • 通过输入oc get sharedsecrets命令并获取非空列表来发现可用的SharedSecret自定义资源 (CR) 实例。

    • 通过运行 oc adm policy who-can use <sharedsecret_identifier> 命令检查服务帐户是否被允许使用 SharedSecret CR 以及服务帐户是否列在您的命名空间中。

如果您无法完成最后两个前提条件,集群管理员可以建立必要的基于角色的访问控制 (RBAC),以便您可以授予服务帐户使用SharedSecret CR的权限。

步骤
  1. 通过运行以下命令创建包含集群授权密钥的SharedSecret对象实例

    $ oc apply -f -<<EOF
    apiVersion: sharedresource.openshift.io/v1alpha1
    kind: SharedSecret
    metadata:
      name: etc-pki-entitlement
    spec:
      secretRef:
        name: etc-pki-entitlement
        namespace: openshift-config-managed
    EOF
  2. 使用以下示例配置创建ClusterRole对象以授予访问SharedSecret对象的权限:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: use-share-etc-pki-entitlement (1)
    rules:
      - apiGroups:
          - sharedresource.openshift.io
        resources:
          - sharedsecrets
        resourceNames:
          - etc-pki-entitlement
        verbs:
          - use
    1 定义 ClusterRole CR 的名称。
  3. 创建RoleRoleBinding对象,以授予共享资源CSI驱动程序访问SharedSecret对象的权限

    Role 对象示例
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: share-etc-pki-entitlement (1)
      namespace: openshift-config-managed
    rules:
      - apiGroups:
          - ""
        resources:
          - secrets
        resourceNames:
          - etc-pki-entitlement
        verbs:
          - get
          - list
          - watch
    1 定义 Role CR 的名称。
    RoleBinding 对象示例
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: share-etc-pki-entitlement (1)
      namespace: openshift-config-managed
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: share-etc-pki-entitlement
    subjects:
      - kind: ServiceAccount
        name: csi-driver-shared-resource
        namespace: openshift-builds (2)
    1 定义 RoleBinding CR 的名称。
    2 定义安装openshift-builds的命名空间的名称。
  4. 为构建运行的命名空间中的builderpipeline服务帐户创建RoleBinding对象

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: use-share-etc-pki-entitlement (1)
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: use-share-etc-pki-entitlement
    subjects:
      - kind: ServiceAccount
        name: pipeline
      - kind: ServiceAccount
        name: builder
    1 定义builderpipeline服务帐户的RoleBinding CR的名称。

    使用SharedSecret对象的帐户由OpenShift控制器创建和管理。

  5. 使用buildah构建策略挂载SharedSecret对象。请参阅以下示例

    $ oc apply -f -<<EOF
    apiVersion: shipwright.io/v1beta1
    kind: Build
    metadata:
      name: buildah-rhel
    spec:
      source:
        type: Git
          git:
          url: https://github.com/redhat-openshift-builds/samples
        contextDir: buildah-build
      strategy:
        name: buildah
        kind: ClusterBuildStrategy
      paramValues:
      - name: dockerfile
        value: DockerFile
      volumes:
      - csi:
          driver: csi.sharedresource.openshift.io
          readOnly: true (1)
          volumeAttributes:
            sharedSecret:  <sharedsecret_object_name> (2)
        name: etc-pki-entitlement
      output:
        image: <output_image_location> (3)
    EOF
1 必须将readOnly设置为true才能在构建中挂载共享资源。
2 指定SharedSecret对象的名称以将其包含在构建中。
3 指定要推送构建镜像的位置。