Uso de una AK/SK personalizada para montar un volumen de OBS
Escenario
Puede resolver este problema con Everest 1.2.8 y las versiones posteriores para usar claves de acceso personalizadas para diferentes usuarios de IAM. Para obtener más información, vea ¿Cómo puedo controlar los permisos de acceso para OBS.
Requisitos previos
- La versión del complemento más antiguo debe ser 1.2.8 o posterior.
- La versión del clúster debe ser 1.15.11 o posterior.
Restricciones
Las claves de acceso personalizadas no se pueden configurar para los contenedores seguros.
Desactivación del montaje automático de la llave
La clave que ha cargado se utiliza de forma predeterminada al montar un volumen de OBS. Es decir, todos los usuarios de IAM bajo su cuenta usarán la misma clave para montar bucket de OBS, y tienen los mismos permisos en bucket. Esta configuración no permite configurar permisos diferenciados para diferentes usuarios de IAM.
Si ha cargado la AK/SK, se recomienda desactivar el montaje automático de claves de acceso activando el parámetro disable_auto_mount_secret en el complemento everest para evitar que los usuarios de IAM realicen operaciones no autorizadas. De esta manera, las claves de acceso cargadas en la consola no se usarán al crear volúmenes de OBS.
- Al habilitar disable-auto-mount-secret, asegúrese de que no existe ningún volumen de OBS en el clúster. Una carga de trabajo montada con un volumen de OBS, cuando se escala o se reinicia, no podrá volver a montar el volumen de OBS porque necesita especificar la clave de acceso, pero disable-auto-mount-secret lo prohíbe.
- Si disable-auto-mount-secret se establece en true, se debe especificar una clave de acceso cuando se crea un PV o PVC. De lo contrario, el volumen de OBS no se puede montar.
kubectl edit ds everest-csi-driver -nkube-system
Busque disable-auto-mount-secret y configúrelo en true.
Ejecute :wq para guardar la configuración y salir. Espere hasta que se reinicie el pod.
Obtención de una clave de acceso
- Inicie sesión en la consola.
- Pase el cursor sobre el nombre de usuario en la esquina superior derecha y elija My Credentials en la lista desplegable.
- En el panel de navegación, elija Access Keys.
- Haga clic en Create Access Key. Aparece el cuadro de diálogo Create Access Key.
- Haga clic en OK para descargar la clave de acceso.
Creación de un secreto mediante una clave de acceso
- Obtenga una clave de acceso.
- Codifique las claves con Base64. (Asume que la AK es xxx y la SK es yyyy.)
echo -n xxx|base64
echo -n yyy|base64
Registre las AK y SK codificadas.
- Cree un archivo YAML para el secreto, por ejemplo, test-user.yaml.
apiVersion: v1 data: access.key: WE5WWVhVNU***** secret.key: Nnk4emJyZ0***** kind: Secret metadata: name: test-user namespace: default labels: secret.kubernetes.io/used-by: csi type: cfe/secure-opaque
En especial:
Parámetro
Descripción
access.key
AK codificada en Base64.
secret.key
SK codificada en Base64.
name
Nombre de secreto.
namespace
Espacio de nombres del secreto.
secret.kubernetes.io/used-by: csi
Necesita agregar esta etiqueta en el archivo YAML si desea que esté disponible en la consola de CCE cuando cree un PV/PVC de OBS.
type
Tipo secreto. El valor debe ser cfe/secure-opaque.
Cuando se utiliza este tipo, los datos introducidos por los usuarios se cifran automáticamente.
- Cree el secreto.
kubectl create -f test-user.yaml
Montar un secreto al crear estáticamente un volumen de OBS
Después de crear un secreto con la AK/SK, puede asociar el secreto con el PV a crear y luego usar la AK/SK en secreto para montar un volumen de OBS.
- Inicie sesión en la consola de OBS, cree un bucket de OBS y registre el nombre del bucket y la clase de almacenamiento. El sistema de archivos paralelo se utiliza como ejemplo.
- Cree un archivo YAML para el PV, por ejemplo, pv-example.yaml.
apiVersion: v1 kind: PersistentVolume metadata: name: pv-obs-example annotations: pv.kubernetes.io/provisioned-by: everest-csi-provisioner spec: accessModes: - ReadWriteMany capacity: storage: 1Gi csi: nodePublishSecretRef: name: test-user namespace: default driver: obs.csi.everest.io fsType: obsfs volumeAttributes: everest.io/obs-volume-type: STANDARD everest.io/region: ap-southeast-1 storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner volumeHandle: obs-normal-static-pv persistentVolumeReclaimPolicy: Delete storageClassName: csi-obs
Parámetro
Descripción
nodePublishSecretRef
Secreto especificado durante el montaje.
- name: nombre del secreto
- namespace: espacio de nombres del secreto
fsType
Tipo de archivo. El valor puede ser obsfs o s3fs. Si el valor es de s3fs, se crea un bucket de OBS y se monta usando s3fs. Si el valor es de obsfs, se crea un sistema de archivos paralelo de OBS y se monta usando obsfs. Se recomienda establecer este campo en obsfs.
volumeHandle
Nombre del bucket de OBS.
- Cree un PV.
kubectl create -f pv-example.yaml
Después de crear un PV, puede crear un PVC y asociarlo con el PV.
- Cree un archivo YAML para el PVC, por ejemplo, pvc-example.yaml.
Ejemplo de archivo YAML para el PVC:
apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: csi.storage.k8s.io/node-publish-secret-name: test-user csi.storage.k8s.io/node-publish-secret-namespace: default volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner everest.io/obs-volume-type: STANDARD csi.storage.k8s.io/fstype: obsfs name: obs-secret namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-obs volumeName: pv-obs-example
Parámetro
Descripción
csi.storage.k8s.io/node-publish-secret-name
Nombre del secreto
csi.storage.k8s.io/node-publish-secret-namespace
Espacio de nombres del secreto
- Cree un PVC.
kubectl create -f pvc-example.yaml
Una vez creado el PVC, puede crear una carga de trabajo y asociarla con el PVC para crear volúmenes.
Montar un secreto al crear dinámicamente un volumen de OBS
Al crear dinámicamente un volumen de OBS, puede utilizar el siguiente método para especificar un secreto:
- Cree un archivo YAML para el PVC, por ejemplo, pvc-example.yaml.
apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: csi.storage.k8s.io/node-publish-secret-name: test-user csi.storage.k8s.io/node-publish-secret-namespace: default everest.io/obs-volume-type: STANDARD csi.storage.k8s.io/fstype: obsfs name: obs-secret namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-obs
Parámetro
Descripción
csi.storage.k8s.io/node-publish-secret-name
Nombre del secreto
csi.storage.k8s.io/node-publish-secret-namespace
Espacio de nombres del secreto
- Cree un PVC.
kubectl create -f pvc-example.yaml
Una vez creado el PVC, puede crear una carga de trabajo y asociarla con el PVC para crear volúmenes.
Verificación
- Consulte el nombre del pod de carga de trabajo.
kubectl get po | grep obs-secret
Productos previstos:
obs-secret-5cd558f76f-vxslv 1/1 Running 0 3m22s
- Consulte los objetos en la ruta de montaje. En este ejemplo, la consulta se realiza correctamente.
- Escriba los datos en la ruta de montaje. En este ejemplo, la operación de escritura falló.
kubectl exec obs-secret-5cd558f76f-vxslv -- touch /temp/test
Productos previstos:
touch: setting times of '/temp/test': No such file or directory command terminated with exit code 1
- Establezca los permisos de lectura/escritura para el usuario de IAM que montó el volumen de OBS haciendo referencia a la configuración de la política de bucket.
- Escriba los datos en el camino de la boca de nuevo. En este ejemplo, la operación de escritura se realizó correctamente.
kubectl exec obs-secret-5cd558f76f-vxslv -- touch /temp/test
- Compruebe la ruta de montaje en el contenedor para ver si los datos se escriben correctamente.
kubectl exec obs-secret-5cd558f76f-vxslv -- ls -l /temp/
Productos previstos:
-rwxrwxrwx 1 root root 0 Jun 7 01:52 test