apiVersion: sharedresource.openshift.io/v1alpha1
kind: SharedSecret
metadata:
name: shared-test-secret (1)
spec:
secretRef:
name: test-secret
namespace: <name_of_the_source_namespace>
作为集群管理员,您可以在任何使用 volume 类型为 csi
的 Kubernetes 对象中使用共享资源容器存储接口 (CSI) 驱动程序,以预配包含 Secret
或 ConfigMap
对象内容的内联临时卷。这样,公开卷挂载点的 Pod 和其他 Kubernetes 类型以及 OpenShift Container Platform 构建就可以安全地跨集群中任何命名空间使用这些对象的内容。为此,目前有两种类型的共享资源:
SharedSecret
自定义资源,用于 Secret
对象
SharedConfigMap
自定义资源,用于 ConfigMap
对象
存储供应商传统上将存储驱动程序作为 Kubernetes 的一部分提供。通过容器存储接口 (CSI) 的实现,第三方提供商可以使用标准接口交付存储插件,而无需更改核心 Kubernetes 代码。CSI 操作符为构建用户提供了诸如卷快照之类的存储选项,而这些选项在树内卷插件中是不可能的。
要在集群中跨命名空间共享密钥,您可以为 Secret
对象创建一个 SharedSecret
自定义资源 (CR) 实例。
您已创建要与其他命名空间共享的 Secret
对象。
您必须具有执行以下操作的权限:
您已订阅集群并已通过 Insights Operator 同步授权密钥。
您已在集群范围内创建了 sharedsecrets.sharedresource.openshift.io
自定义资源定义 (CRD) 的实例。
您已为 SharedConfigMap CR
创建了 ClusterRole
对象。
您已为共享资源 CSI 驱动程序创建了 Role
和 RoleBinding
对象。
您已在集群中的命名空间之间管理角色和角色绑定以控制用户。
您已管理角色和角色绑定,以控制 Pod 指定的服务帐户是否可以挂载引用您要使用的 Secret
或 Configmap
CR 的容器存储接口 (CSI) 卷。
您可以访问包含您要共享的密钥的命名空间。
使用以下示例配置创建一个 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 的名称。 |
使用以下示例配置创建一个 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 的名称。 |
创建授予共享资源 CSI 驱动程序访问 SharedSecret
对象权限的 Role
和 RoleBinding
对象。
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
自定义资源 (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),以便您可以使服务帐户能够使用 |
创建与角色关联的 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 | 指定应用程序的服务帐户名称。 |
将共享资源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,您需要创建一个SharedConfigMap
自定义资源 (CR) 实例。
您必须具有执行以下操作的权限:
在集群范围级别创建sharedconfigmaps.sharedresource.openshift.io
自定义资源定义 (CRD)。
为SharedConfigMap
CR创建ClusterRole
对象。
为共享资源容器存储接口 (CSI) 驱动程序创建角色和角色绑定。
管理集群中跨命名空间的角色和角色绑定,以控制哪些用户可以获取、列出和监视这些实例。
管理集群中跨命名空间的角色和角色绑定,以控制哪些Pod中挂载CSI卷的服务帐户可以使用这些实例。
访问包含要共享的密钥的命名空间。
为要在集群中跨命名空间共享的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> 替换为源命名空间的名称。 |
创建一个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 的名称。 |
创建Role
和RoleBinding
对象,以授予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
自定义资源 (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),以便您可以使服务帐户能够使用 |
创建与角色关联的 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 | 指定应用程序的服务帐户名称。 |
将共享资源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
字段中,必须将sharedSecret
或sharedConfigMap
属性设置为SharedSecret
或SharedConfigMap
实例的值。否则,当在Pod启动期间预配卷时,验证检查会向kubelet返回错误。请查看以下条件以预配Pod的共享资源卷
必须为sharedSecret
和sharedConfigMap
属性指定值。
sharedSecret
和sharedConfigMap
属性的值必须与其自定义资源 (CR) 的名称匹配。
共享资源、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
对象安全地访问集群中构建的RHEL授权密钥。SharedSecret
对象允许您跨命名空间共享和同步密钥。
您必须具有执行以下操作的权限:
创建构建配置并启动构建。
创建SharedSecret
对象。
通过输入oc get sharedsecrets
命令并获取非空列表来发现可用的SharedSecret
自定义资源 (CR) 实例。
通过运行 oc adm policy who-can use <sharedsecret_identifier>
命令检查服务帐户是否被允许使用 SharedSecret
CR 以及服务帐户是否列在您的命名空间中。
如果您无法完成最后两个前提条件,集群管理员可以建立必要的基于角色的访问控制 (RBAC),以便您可以授予服务帐户使用 |
通过运行以下命令创建包含集群授权密钥的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
使用以下示例配置创建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 的名称。 |
创建Role
和RoleBinding
对象,以授予共享资源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 的命名空间的名称。 |
为构建运行的命名空间中的builder
和pipeline
服务帐户创建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 | 定义builder 和pipeline 服务帐户的RoleBinding CR的名称。 |
使用 |
使用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 | 指定要推送构建镜像的位置。 |