Я пытался следовать этой документации шаг за шагом:
создать кластер gke ( проверить Совместимость с Kubernetes Совместимость, я решил придерживаться с 1.14 на этот раз), брелок и ключ
развернуть драйвер CSI в кластере
2.1. скачать драйвер $git clone https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver /PATH/gcp-compute-persistent-disk-csi-driver
2.2. настроить переменные для вашего проекта в /PATH/gcp-compute-persistent-disk-csi-driver/deploy/setup-project.sh
2.3. создать учетную запись службы с /PATH/gcp-compute-persistent-disk-csi-driver/deploy/setup-project.sh
2.4. настроить переменные для развертывания драйверов в /PATH/gcp-compute-persistent-disk-csi-driver/deploy/kubernetes/deploy-driver.sh
и /PATH/gcp-compute-persistent-disk-csi-driver/deploy/kubernetes/deploy-driver.shinstall-kustomize.sh
2.5. развернуть драйвер CSI (я придерживаюсь стабильной версии)
$./deploy-driver.sh
включить Cloud KMS API
назначить роль Cloud KMS CryptoKey Encrypter/Decrypter
(roles/cloudkms.cryptoKeyEncrypterDecrypter
) для Compute Engine Service Agent
(service-[PROJECT_NUMBER]@compute-system.iam.gserviceaccount.com
)
create StorageClass
$cat storage.yaml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: csi-gce-pd
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-standard
disk-encryption-kms-key: projects/test-prj/locations/europe-west3/keyRings/TEST-KEY-RING/cryptoKeys/TEST-KEY
$kubectl describe storageclass csi-gce-pd
Name: csi-gce-pd
IsDefaultClass: No
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1beta1","kind":"StorageClass","metadata":{"annotations":{},"name":"csi-gce-pd"},"parameters":{"disk-encryption-kms-key":"projects/test-prj/locations/europe-west3/keyRings/TEST-KEY-RING/cryptoKeys/TEST-KEY","type":"pd-standard"},"provisioner":"pd.csi.storage.gke.io"}
Provisioner: pd.csi.storage.gke.io
Parameters: disk-encryption-kms-key=projects/test-prj/locations/europe-west3/keyRings/TEST-KEY-RING/cryptoKeys/TEST-KEY,type=pd-standard
AllowVolumeExpansion: <unset>
MountOptions: <none>
ReclaimPolicy: Delete
VolumeBindingMode: Immediate
Events: <none>
создать постоянный том
$ kubectl apply -f pv c .yaml
persistentvolumeclaim / podpv c создал
$ kubectl описать pv c podpvc Имя: podpvc Пространство имен: по умолчанию StorageClass: csi-gce-pd Статус: Связанный том: pv c -b383584a-32c5-11ea-ad6e-42010a9c007d Ярлыки : Аннотации:
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"podpvc","namespace":"default"},"spec":{"accessModes...
pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 6Gi
Access Modes: RWO
VolumeMode: Filesystem
Mounted By: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Provisioning 31m pd.csi.storage.gke.io_gke-test-cluster-default-pool-cd22e088-t1h0_c158f4fc-07ba-411e-8a94-74595f2b2f1d External provisioner is provisioning volume for claim "default/podpvc"
Normal ExternalProvisioning 31m (x2 over 31m) persistentvolume-controller waiting for a volume to be created, either by external provisioner "pd.csi.storage.gke.io" or manually created by system administrator
Normal ProvisioningSucceeded 31m pd.csi.storage.gke.io_gke-test-cluster-default-pool-cd22e088-t1h0_c158f4fc-07ba-411e-8a94-74595f2b2f1d Successfully provisioned volume pvc-b383584a-32c5-11ea-ad6e-42010a9c007d
И он успешно подготовлен.
Затем я удалил роль Cloud KMS CryptoKey Encrypter/Decrypter
из Compute Engine Service Agent
и постоянный том, созданный на шаге 6, и попытался снова:
$kubectl apply -f pvc.yaml
persistentvolumeclaim/podpvc created
$kubectl describe pvc podpvc
Name: podpvc
Namespace: default
StorageClass: csi-gce-pd
Status: Pending
Volume:
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"podpvc","namespace":"default"},"spec":{"accessModes...
volume.beta.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io
Finalizers: [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode: Filesystem
Mounted By: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Provisioning 2m15s (x10 over 11m) pd.csi.storage.gke.io_gke-serhii-test-cluster-default-pool-cd22e088-t1h0_c158f4fc-07ba-411e-8a94-74595f2b2f1d External provisioner is provisioning volume for claim "default/podpvc"
Warning ProvisioningFailed 2m11s (x10 over 11m) pd.csi.storage.gke.io_gke-serhii-test-cluster-default-pool-cd22e088-t1h0_c158f4fc-07ba-411e-8a94-74595f2b2f1d failed to provision volume with StorageClass "csi-gce-pd": rpc error: code = Internal desc = CreateVolume failed to create single zonal disk "pvc-b1a238b5-35fa-11ea-bec8-42010a9c01e6": failed to insert zonal disk: unkown Insert disk error: googleapi: Error 400: Cloud KMS error when using key projects/serhii-test-prj/locations/europe-west3/keyRings/SERHII-TEST-KEY-RING/cryptoKeys/SERHII-TEST-KEY: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/serhii-test-prj/locations/europe-west3/keyRings/SERHII-TEST-KEY-RING/cryptoKeys/SERHII-TEST-KEY' (or it may not exist)., kmsPermissionDenied
Normal ExternalProvisioning 78s (x43 over 11m) persistentvolume-controller waiting for a volume to be created, either by external provisioner "pd.csi.storage.gke.io" or manually created by system administrator
и постоянный том остался в состоянии ожидания.
И, как вы можете видеть, в документации необходимо:
Предоставить разрешение на использование ключа
Необходимо назначить служебную учетную запись Compute Engine, используемую узлами в кластере Cloud KMS Cr yptoKey Encrypter / Decrypter роль. Это требуется для постоянных дисков GKE для доступа и использования вашего ключа шифрования.
, и этого недостаточно для создания учетной записи службы с /PATH/gcp-compute-persistent-disk-csi-driver/deploy/setup-project.sh
, предоставляемой драйвером CSI.
РЕДАКТИРОВАТЬ Обратите внимание:
Для загрузочных дисков узла, защищенных CMEK, эта служебная учетная запись Compute Engine - это учетная запись, для которой требуется разрешение на шифрование с использованием вашего Облачный ключ KMS. Это верно, даже если вы используете настраиваемую учетную запись службы на своих узлах.
Таким образом, в этом случае невозможно использовать только учетную запись службы без учетной записи службы Compute Engine, поскольку постоянные тома с защитой CMEK управляются GCE, а не GKE. Между тем, вы можете предоставить только необходимые условия для вашей учетной записи пользовательского сервиса для повышения безопасности вашего проекта.