Using encrypted disks for persistent volumes
Managed Service for Kubernetes supports the use of Compute Cloud disks encrypted with custom Yandex Key Management Service symmetric keys for persistent volumes.
Note
To use encrypted disks, the cloud service account attached to your Managed Service for Kubernetes cluster must have the kms.keys.encrypterDecrypter role for the key or folder.
You can use encrypted disks for both static and dynamic provisioning of persistent volumes.
Static volume provisioning
-
Create a symmetric key in Key Management Service.
-
Create an encrypted disk using the key you created.
Save the disk ID for later use.
-
Assign the
kms.keys.encrypterDecrypterrole for a key or folder to the cloud service account of the Managed Service for Kubernetes cluster. -
Provide a persistent volume. In the
PersistentVolumemanifest, specify the ID of the disk you created in thespec:csi:volumeHandleparameter.
Dynamic volume provisioning
-
Create a symmetric key in Key Management Service.
Save the key ID for later use.
-
Assign the
kms.keys.encrypterDecrypterrole for a key or folder to the cloud service account of the Managed Service for Kubernetes cluster. -
Install kubect
and configure it to work with the new cluster. -
In the
encrypted-storage-class.yamlfile, create a manifest for the new storage class:kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <storage_class_name> provisioner: disk-csi-driver.mks.ycloud.io volumeBindingMode: WaitForFirstConsumer parameters: type: <disk_type> csi.storage.k8s.io/fstype: ext4 kmsKeyId: <symmetric_key_ID> allowVolumeExpansion: true reclaimPolicy: DeleteWhere:
metadata:name: Any storage class name.parameters:type: Disk type in Compute Cloud. The possible values are:network-ssd: Network SSD.network-hdd: Network HDD.network-ssd-nonreplicated: Non-replicated SSD.network-ssd-io-m3: Ultra high-speed network storage with three replicas (SSD).
parameters:kmsKeyId: Symmetric key ID.
-
Create a storage class:
kubectl apply -f encrypted-storage-class.yaml -
In the
encrypted-pvc.yamlfile, create a manifest for the newPersistentVolumeClaim:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: <PVC_name> spec: accessModes: - ReadWriteOnce storageClassName: <storage_class_name> resources: requests: storage: 4GiWhere:
metadata:name: Any name for thePersistentVolumeClaim.spec:storageClassName: Name of the storage class you created earlier.
-
Create a
PersistentVolumeClaim:kubectl apply -f encrypted-pvc.yaml -
In the
pod-with-encrypted-pvc.yamlfile, create a manifest for the pod with a dynamically provisioned persistent volume:apiVersion: v1 kind: Pod metadata: name: <pod_name> spec: containers: - name: app image: ubuntu command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"] volumeMounts: - name: persistent-storage mountPath: /data volumes: - name: persistent-storage persistentVolumeClaim: claimName: <PVC_name>Where:
metadata:name: Any name for the pod.spec:volumes:persistentVolumeClaim:claimName: Name of thePersistentVolumeClaimyou created earlier.
-
Create a pod:
kubectl apply -f pod-with-encrypted-pvc.yamlAfter you create the pod, a new encrypted disk with
k8s-csiprefixed to its name will appear under Compute Cloud in Disks in the management console .