Por que minha implementação do File Storage for VPC falha devido a um erro de permissões?

Nuvem Privada Virtual

Seu aplicativo que utiliza o File Storage for VPC apresenta uma falha devido a um erro de permissão.

Resolva problemas de acesso de usuários não root ao armazenamento de arquivos do VPC.

Você criou sua própria classe de armazenamento para usar com um compartilhamento de arquivo existente, mas não especificou uid e gid corretos. Quando os processos são executados no UNIX e no Linux, o sistema operacional identifica um usuário por meio de um ID de usuário (UID) e um grupo por meio de um ID de grupo (GID). Esses IDs determinam quais recursos do sistema um usuário ou grupo pode acessar. Por exemplo, se o ID do usuário do armazenamento de arquivos for 12345 e o ID do grupo for 6789, a montagem no nó host e no contêiner deverá ter esses mesmos IDs. O processo principal do contêiner deve corresponder a um ou ambos os IDs para acessar o compartilhamento de arquivos.

Você pode resolver o problema de uma das seguintes maneiras.

  • Se você precisar que seu app seja executado como não raiz, crie sua própria classe de armazenamento com os uid e gid corretos que seu app precisa.

  • Se você quiser executar seu aplicativo como usuário root, edite sua configuração de implantação para usar fsGroup: 0``.

Crie sua própria classe de armazenamento e especifique as uid e gid que seu app precisa

Se desejar usar o File Storage for VPC com o fornecimento estático, deve-se fazer referência ao uid e ao gid corretos.

  1. Crie uma classe de armazenamento com os uid e gid corretos que seu app precisa. Para obter uma lista de perfis de armazenamento, consulte File Storage for VPC profiles.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: custom-storageclas
    provisioner: vpc.file.csi.ibm.io
    mountOptions:
        - hard
        - nfsvers=4.0
        - sec=sys
    parameters:
      profile: "custom-iops"            # The VPC Storage profile used.
      iops: "400"                       # Default IOPS. User can override from secrets
      billingType: "hourly"             # The default billing policy used. User can override this default
      encrypted: "false"                # By default, all PVC using this class will only be provider managed encrypted. The user can override this default
      encryptionKey: ""                 # If encrypted is true, then a user must specify the encryption key used associated KP instance
      resourceGroup: ""                 # Use resource group if specified here. Otherwise, use the one mentioned in storage-secrete-store
      zone: ""                          # By default, the storage vpc driver will select a zone. The user can override this default
      tags: ""                          # A list of tags "a, b, c" that will be created when the volume is created. This can be overidden by user
      classVersion: "1"
      uid: "1234"                           # The initial user identifier for the file share.
      gid: "5678"                           # The initial group identifier for the file share.
    reclaimPolicy: "Delete"
    allowVolumeExpansion: true
    
  2. Crie a classe de armazenamento customizada no cluster.

    oc apply -f custom-storageclass.yaml
    
  3. Verifique se a classe de armazenamento está disponível no cluster.

    oc get sc
    

    Saída de exemplo

    NAME                                          PROVISIONER
    ibmc-vpc-file-10iops-tier                     vpc.file.csi.ibm.io
    ibmc-vpc-file-3iops-tier                      vpc.file.csi.ibm.io
    ibmc-vpc-file-5iops-tier                      vpc.file.csi.ibm.io
    ibmc-vpc-file-retain-10iops-tier              vpc.file.csi.ibm.io
    ibmc-vpc-file-retain-3iops-tier               vpc.file.csi.ibm.io
    ibmc-vpc-file-retain-5iops-tier               vpc.file.csi.ibm.io
    ibmc-vpc-file-custom                         vpc.file.csi.ibm.io
    
  4. Incluir filestorage em seu app

Edite seu app para executar como raiz com o fsGroup: 0

  1. Efetue login em seu cluster.

  2. Identifique a implementação em seu cluster que você deseja editar

    kubectl get deployments
    
  3. Edite a implementação, incluindo fsGroup: 0 na seção securityContext de sua implementação

    kubectl get deployment -o yaml YOUR-DEPLOYMENT
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: <deployment_name>
      labels:
        app: <deployment_label>
    spec:
      securityContext:
        fsGroup: 0
    selector:
        matchLabels:
        app: <app_name>
    template:
        metadata:
        labels:
            app: <app_name>
        spec:
        containers:
        - image: <image_name>
            name: <container_name>
            volumeMounts:
            - name: <volume_name>
            mountPath: /<file_path>
        volumes:
        - name: <volume_name>
            persistentVolumeClaim:
            claimName: PVC-NAME
    
  4. Aplique as mudanças em sua implementação.