The OpenShift Shared Resource CSI Driver allows Secrets
and ConfigMaps
to be
shared across Kubernetes namespaces in a controlled manner. This CSI driver
ensures that the entity (ServiceAccount) accessing the shared Secret or ConfigMap
has permission to do so before mounting the data as a volume into the requesting
Pod.
This CSI driver only supports the Ephemeral
volume lifecycle mode.
It also requires the following during operation:
podInfoOnMount: true
fsGroupPolicy: File
attachRequired: false
The easiest way to use the Shared Resource CSI Driver is to deploy OpenShift v4.10 or higher, and enable the Tech Preview Features.
Typically there are two individuals/personas involved when sharing resources:
- A "resource owner" - a platform engineer or other person granted the admin role in multiple application namespaces. This could also be a cluster administrator.
- A "resource consumer" - an application developer who is granted the edit role in a namespace.
Sharing resources is done as follows:
-
The resource owner creates a
Secret
orConfigMap
to be shared in a "source" namespace. This could also be created by a controller or other system component.apiVersion: v1 kind: ConfigMap metadata: name: shared-config namespace: test-share-source # This can be any desired "source" namespace data: config.txt: "Hello world!"
-
The resource owner creates a corresponding
SharedSecret
orSharedConfigMap
instance to make the resource shareable. The resource owner should also create aClusterRole
that grants subjects permission touse
the referenced shared resource.--- apiVersion: sharedresource.openshift.io/v1alpha1 kind: SharedConfigMap metadata: name: share-test-config spec: configMapRef: name: shared-config namespace: test-share-source # The "source" namespace" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: shared-configmap-use-share-test-config rules: - apiGroups: - sharedresource.openshift.io resources: - sharedconfigmaps resourceNames: - share-test-config verbs: - use
-
The resource owner then creates a
Role
andRoleBinding
in the source namespace that grants the Shared Resource CSI driver permission to read and watch the referenced ConfigMap:--- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: shared-test-config namespace: test-share-source # This is the source namespace rules: - apiGroups: [""] resources: ["configmaps"] resourceNames: ["shared-config"] verbs: ["get", "list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: shared-test-config namespace: test-share-source # This is the source namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: shared-test-config subjects: # The service account for the Shared Resource CSI driver DaemonSet must be listed here. # When deployed with Builds for OpenShift, the service account name is # `csi-driver-shared-resource`, and the namespace is the same one where the Builds for # OpenShift operator is deployed. - kind: ServiceAccount name: csi-driver-shared-resource namespace: openshift-builds
-
Finally, the resource owner grants the desired
SeviceAccount
in the "target" namespace permission to use the shared resource above:--- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: use-shared-config namespace: app-namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: use-shared-config subjects: - kind: ServiceAccount name: default # or other ServiceAccount specific to the application namespace: app-namespace # This is the "target" namespace
-
The resource consumer mounts the shared resource into a
Pod
(or other resource that acceptsCSI
Volumes):apiVersion: v1 kind: Pod metadata: name: example-shared-config namespace: app-namespace spec: ... serviceAccountName: default volumes: - name: shared-config csi: readOnly: true # required to be true driver: csi.sharedresource.openshift.io volumeAttributes: sharedConfigMap: share-test-config # This must match the name of the SharedConfigMap
See also:
- ServiceAccounts must have the
use
permission to mount the respectiveSharedSecret
orSharedConfigMap
. Volumes fail to mount otherwise - see FAQ for more details. - Automatic sync of the shared resource data (Secret/ConfigMap) into the mounting
Pod
. - Automatic removal/restoration of shared resource data if the Pod's RBAC permissions change at runtime.
- Automatic removal/restoration of shared resource data if the backing Secret/ConfigMap is deleted/re-created.
- Survival of shared resource data with CSI driver restarts/upgrades.
- Multiple
SharedSecret
/SharedConfig
volumes within aPod
. Also supports nested volume mounts within a container. - Reserve a cluster-scoped share name to a specific
Secret
orConfigMap
.
The following CSI interfaces are implemented:
- Identity Service: GetPluginInfo, GetPluginCapabilities, Probe
- Node Service: NodeGetInfo, NodeGetCapabilities, NodePublishVolume, NodeUnpublishVolume
- Controller Service: not implemented.
NOTE: see CSI Volume Specifics for restrictions around these features for read-only Volumes.
Please refer to the FAQ Guide for commonly asked questions.
See the development guide on how to build and test locally.