Uso de uma chave de acesso (AK/SK) personalizada para montar um volume do OBS
Cenário
Armazenamento do contêiner do CCE (Everest) da versão 1.2.8 ou posterior suporta chaves de acesso personalizadas. Dessa forma, os usuários do IAM podem usar suas próprias chaves de acesso personalizadas para montar um volume do OBS. Para obter detalhes, consulte Como controlar o acesso ao OBS?
Pré-requisitos
- A versão do complemento Armazenamento do contêiner do CCE (Everest) deve ser 1.2.8 ou posterior.
- A versão do cluster deve ser 1.15.11 ou posterior.
Restrições
- Quando um volume do OBS é montado usando uma chave de acesso (AK/SK) personalizada, a chave de acesso não pode ser excluída ou desabilitada. Caso contrário, o contêiner de serviço não pode acessar o volume do OBS montado.
- Teclas de acesso personalizadas não podem ser configuradas para contêineres de Kata.
Desativar a montagem automática da chave
A chave que você carregou é usada por padrão ao montar um volume do OBS. Ou seja, todos os usuários do IAM em sua conta usarão a mesma chave para montar buckets do OBS e terão as mesmas permissões em buckets. Essa configuração não permite que você configure permissões diferenciadas para diferentes usuários do IAM.
Se você carregou a AK/SK, desative a montagem automática de chaves de acesso ativando o parâmetro disable_auto_mount_secret no complemento everest para impedir que os usuários do IAM executem operações não autorizadas. Desta forma, as teclas de acesso carregadas no console não serão usadas ao criar volumes do OBS.
- Ao ativar disable-auto-mount-secret, certifique-se de que não exista nenhum volume do OBS no cluster. Uma carga de trabalho montada com um volume do OBS, quando dimensionada ou reiniciada, não conseguirá remontar o volume do OBS porque precisa especificar a chave de acesso, mas é proibida por disable-auto-mount-secret.
- Se disable-auto-mount-secret estiver definido como true, uma chave de acesso deve ser especificada quando um PV ou PVC for criado. Caso contrário, o volume do OBS não será montado.
kubectl edit ds everest-csi-driver -nkube-system
Pesquise disable-auto-mount-secret e defina-o como true.
Execute :wq para salvar as configurações e sair. Aguarde até que o pod seja reiniciado.
Obter uma chave de acesso
- Faça logon no console.
- Passe o cursor sobre o nome de usuário no canto superior direito e escolha My Credentials na lista suspensa.
- No painel de navegação, escolha Access Keys.
- Clique em Create Access Key. A caixa de diálogo Create Access Key é exibida.
- Clique em OK para baixar a chave de acesso.
Criar um segredo usando uma chave de acesso
- Obtenha uma chave de acesso.
- Codifique as chaves usando Base64. (Suponha que o AK é xxx e a SK é yyy.)
echo -n xxx|base64
echo -n yyy|base64
Grave o AK e a SK codificados.
- Crie um arquivo YAML para o segredo, por exemplo, 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
Especificamente:
Parâmetro
Descrição
access.key
AK codificado em Base64.
secret.key
SK codificada em Base64.
name
Nome de segredo.
namespace
Namespace do segredo.
secret.kubernetes.io/used-by: csi
Adicione este rótulo no arquivo YAML se quiser disponibilizá-lo no console do CCE ao criar um PV/PVC do OBS.
type
Tipo de segredo. O valor deve ser cfe/secure-opaque.
Quando este tipo é usado, os dados inseridos pelos usuários são automaticamente criptografados.
- Crie o segredo.
kubectl create -f test-user.yaml
Montar um segredo ao criar estaticamente um volume do OBS
Depois que um segredo é criado usando a AK/SK, você pode associar o segredo com o PV a ser criado e, em seguida, usar a AK/SK no segredo para montar um volume do OBS.
- Faça logon no console do OBS, crie um bucket do OBS e registre o nome do bucket e a classe de armazenamento. O sistema de arquivos paralelo é usado como exemplo.
- Crie um arquivo YAML para o PV, por exemplo, 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
Descrição
nodePublishSecretRef
Segredo especificado durante a montagem.
- name: nome do segredo
- namespace: namespace do segredo
fsType
Tipo de arquivo. O valor pode ser obsfs ou s3fs. Se o valor for s3fs, um bucket do OBS será criado e montado usando s3fs. Se o valor for obsfs, um sistema de arquivos paralelo do OBS será criado e montado usando obsfs. É aconselhável definir este campo para obsfs.
volumeHandle
Nome do bucket do OBS.
- Crie um PV.
kubectl create -f pv-example.yaml
Depois que um PV é criado, você pode criar uma PVC e associá-lo ao PV.
- Crie um arquivo YAML para o PVC, por exemplo, pvc-example.yaml.
Exemplo de arquivo YAML para a 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
Descrição
csi.storage.k8s.io/node-publish-secret-name
Nome do segredo
csi.storage.k8s.io/node-publish-secret-namespace
Namespace do segredo
- Crie uma PVC.
kubectl create -f pvc-example.yaml
Depois que a PVC é criada, você pode criar uma carga de trabalho e associá-la à PVC para criar volumes.
Montar um segredo ao criar dinamicamente um volume do OBS
Ao criar dinamicamente um volume do OBS, você pode usar o seguinte método para especificar um segredo:
- Crie um arquivo YAML para a PVC, por exemplo, 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
Descrição
csi.storage.k8s.io/node-publish-secret-name
Nome do segredo
csi.storage.k8s.io/node-publish-secret-namespace
Namespace do segredo
- Crie uma PVC.
kubectl create -f pvc-example.yaml
Depois que a PVC é criada, você pode criar uma carga de trabalho e associá-la à PVC para criar volumes.
Verificação
- Consulte o nome do pod da carga de trabalho.
kubectl get po | grep obs-secret
Saídas esperadas:
obs-secret-5cd558f76f-vxslv 1/1 Running 0 3m22s
- Consulte os objetos no caminho de montagem. Neste exemplo, a consulta foi bem-sucedida.
- Grave dados no caminho de montagem. Neste exemplo, a operação de gravação falhou.
kubectl exec obs-secret-5cd558f76f-vxslv -- touch /temp/test
Saídas esperadas:
touch: setting times of '/temp/test': No such file or directory command terminated with exit code 1
- Defina as permissões de leitura/gravação para o usuário do IAM que montou o volume do OBS referindo-se à configuração da política de bucket.
- Grave dados no caminho de montagem novamente. Neste exemplo, a operação de gravação foi bem-sucedida.
kubectl exec obs-secret-5cd558f76f-vxslv -- touch /temp/test
- Verifique o caminho de montagem no contêiner para ver se os dados foram gravados com êxito.
kubectl exec obs-secret-5cd558f76f-vxslv -- ls -l /temp/
Saídas esperadas:
-rwxrwxrwx 1 root root 0 Jun 7 01:52 test