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 | 指定要推送构建镜像的位置。 |