第1章 Shared Resource CSI Driver Operator
ストレージベンダーはこれまで Kubernetes の一部としてストレージドライバーを提供してきました。Container Storage Interface (CSI) の実装により、サードパーティープロバイダーは、Kubernetes のコアコードを変更することなく、標準インターフェイスを使用してストレージプラグインを提供できます。CSI Operator は、in-tree のボリュームプラグインでは不可能なボリュームスナップショットなどのストレージオプションを Builds ユーザーに提供します。
Shared Resource CSI Driver は特殊なタイプの CSI ドライバーです。これを使用すると、クラスター管理者は csi ボリュームタイプを使用して、namespace 間で Secret オブジェクトと ConfigMap オブジェクトをセキュアに共有できます。Shared Resource CSI Driver は、インラインの一時ボリュームをプロビジョニングし、Pod と OpenShift Container Platform Builds がこれらの共有リソースを使用できるようにします。
Shared Resource CSI Driver は、次の種類のカスタムリソースをサポートしています。
-
Secretオブジェクトを共有するためのSharedSecretカスタムリソース -
ConfigMapオブジェクトを共有するためのSharedConfigMapカスタムリソース
1.1. namespace 間での Secret オブジェクトの共有 リンクのコピーリンクがクリップボードにコピーされました!
Secret オブジェクトは、パスワード、OAuth トークン、SSH 鍵などの機密情報を保存および管理するために使用されます。SharedSecret カスタムリソース (CR) を使用すると、Secret オブジェクトを手動で複製することなく、クラスター内の異なる namespace 間でオブジェクトをセキュアに共有できます。Secret オブジェクトを共有すると、機密データの情報源が一元化され、許可された namespace がそのデータに確実にアクセスできるようになります。
1.1.1. SharedSecret カスタムリソースの作成 リンクのコピーリンクがクリップボードにコピーされました!
SharedSecret カスタムリソース (CR) を作成すると、namespace 間で Secret オブジェクトを共有できます。
前提条件
-
他の namespace で共有する
Secretオブジェクトを作成した。Secretオブジェクトを作成するには、「Secret の作成」を参照してください。 - クラスターにサブスクライブし、Insights Operator を通じてエンタイトルメントキーを同期した。
次の操作を実行するための権限がある。
-
クラスタースコープレベルで
sharedsecrets.sharedresource.openshift.ioCR を作成する。 -
SharedSecretCR 用のClusterRoleオブジェクトを作成する。 -
Shared Resource CSI Driver の
RoleおよびRoleBindingオブジェクトを作成する。 - ユーザーを制御するために、クラスター内の namespace 全体のロールとロールバインディングを管理する。
-
Pod によって指定されたサービスアカウントが、
SharedSecretCR を使用して、Secretオブジェクトを参照する CSI ボリュームをマウントできるように、ロールとロールバインディングを管理する。 -
共有する
Secretオブジェクトが含まれている namespace にアクセスする。
-
クラスタースコープレベルで
手順
次の設定例を使用して、Shared Resource CSI Driver に
SharedSecretオブジェクトへのアクセス権を付与するRoleオブジェクトとRoleBindingオブジェクトを作成します。Roleオブジェクトの例apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: share-etc-pki-entitlement namespace: openshift-config-managed rules: - apiGroups: - "" resources: - secrets resourceNames: - etc-pki-entitlement verbs: - get - list - watchapiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: share-etc-pki-entitlement1 namespace: openshift-config-managed rules: - apiGroups: - "" resources: - secrets resourceNames: - etc-pki-entitlement verbs: - get - list - watchCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
RoleCR の名前。
RoleBindingオブジェクトの例apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: share-etc-pki-entitlement 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-buildsapiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: share-etc-pki-entitlement1 namespace: openshift-config-managed roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: share-etc-pki-entitlement2 subjects: - kind: ServiceAccount name: csi-driver-shared-resource3 namespace: openshift-buildsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次の設定例を使用して、
SharedSecretCR を作成します。apiVersion: sharedresource.openshift.io/v1alpha1 kind: SharedSecret metadata: name: shared-test-secret spec: secretRef: name: test-secret namespace: <name_of_the_source_namespace>apiVersion: sharedresource.openshift.io/v1alpha1 kind: SharedSecret metadata: name: shared-test-secret1 spec: secretRef: name: test-secret namespace: <name_of_the_source_namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<name_of_the_source_namespace>は、SharedSecretCR の名前に置き換えます。
次の設定例を使用して、参照される共有リソースを使用するための RBAC 権限を付与する
ClusterRoleオブジェクトを作成します。apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: use-shared-test-secret rules: - apiGroups: - sharedresource.openshift.io resources: - sharedsecrets resourceNames: - shared-test-secret verbs: - useapiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: use-shared-test-secret1 rules: - apiGroups: - sharedresource.openshift.io resources: - sharedsecrets resourceNames: - shared-test-secret verbs: - useCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
ClusterRoleCR の名前。
1.1.2. Pod での SharedSecret カスタムリソースの使用 リンクのコピーリンクがクリップボードにコピーされました!
Pod から SharedSecret カスタムリソース (CR) にアクセスするには、サービスアカウントにロールベースのアクセス制御 (RBAC) 権限を付与します。
前提条件
-
クラスター内の namespace 間で共有する
Secretオブジェクト用のSharedSecretCR インスタンスを作成した。 次の操作を実行するための権限がある。
-
oc adm policy who-can use <sharedsecret_identifier>コマンドを実行して、サービスアカウントがSharedSecretCR を使用できるかどうか、およびサービスアカウントが namespace にリストされるかどうかを確認する。 -
Pod のサービスアカウントが
csiボリュームを使用できることを確認する。ユーザーとして Pod を作成した場合は、ユーザーがcsiボリュームを使用できることを確認する。
-
最後の 2 つの前提条件を満たせない場合は、クラスター管理者に必要な RBAC 権限を設定してもらうことで、サービスアカウントに SharedSecret CR の使用を許可できるようになります。
手順
ロールに関連付けられた
RoleBindingオブジェクトをクラスター内に作成し、共有リソースを使用する権限をサービスアカウントに付与します。次の設定例を参照してください。apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: use-shared-secret namespace: app-namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: use-shared-secret subjects: - kind: ServiceAccount name: <service_account_name>apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: use-shared-secret1 namespace: app-namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: use-shared-secret subjects: - kind: ServiceAccount name: <service_account_name>2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 共有リソース
csiドライバーを、csiボリュームを受け入れる Pod またはその他のリソースにマウントします。次の設定例を参照してください。apiVersion: v1 kind: Pod metadata: name: example-shared-secret namespace: <app_namespace> spec: ... serviceAccountName: default volumes: - name: shared-secret csi: readOnly: true driver: csi.sharedresource.openshift.io volumeAttributes: sharedSecret: shared-test-secretapiVersion: 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-secret2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要sharedSecret属性の値がSharedSecretインスタンスの名前と一致しない場合、Pod は起動に失敗します。