Provisioning dei PVC nel servizio di storage di file

Scopri come eseguire il provisioning delle richieste di volume persistenti per i cluster creati utilizzando Kubernetes Engine (OKE) eseguendo il MOUNT dei file system dal servizio di storage di file.

Il servizio Oracle Cloud Infrastructure File Storage fornisce un file system di rete duraturo, scalabile, distribuito e di livello aziendale. Il plugin del volume CSI consente di connettere i cluster ai file system nel servizio di storage di file.

Puoi utilizzare il servizio di storage di file per eseguire il provisioning di richieste di volume persistenti (PVC) in due modi:

  • Definendo e creando una nuova classe di storage (facoltativamente specificando l'OCID di una destinazione di accesso esistente), quindi definendo e creando un nuovo PVC in base alla classe di storage. Quando si crea il PVC, il plugin del volume CSI crea dinamicamente sia un nuovo file system del servizio di storage di file che un nuovo volume persistente supportato dal nuovo file system. Vedere Provisioning di un PVC su un nuovo file system mediante il plugin volume CSI.
  • Creando manualmente un file system e una destinazione di accesso nel servizio di storage di file, quindi definendo e creando un PV supportato dal nuovo file system e infine definendo un nuovo PVC. Quando si crea il PVC, Kubernetes Engine associa il PVC al PV supportato dal servizio di storage di file. Vedere Provisioning di un PVC su un file system esistente.

Tenere presente quanto riportato di seguito.

  • Quando si utilizza il plugin del volume CSI per creare dinamicamente un nuovo file system, non aggiornare manualmente le proprietà del nuovo volume persistente creato dal plugin del volume CSI.
  • Tutti i file system, le destinazioni di MOUNT e le esportazioni del servizio di storage di file creati in modo dinamico dal plugin del volume CSI hanno nomi a partire da csi-fss- .
  • Nella console vengono visualizzati tutti i file system, le destinazioni di MOUNT ed esportazioni del servizio di storage di file creati in modo dinamico dal plugin del volume CSI. Tuttavia, non utilizzare la console (o l'interfaccia CLI o l'API di Oracle Cloud Infrastructure) per modificare queste risorse create dinamicamente. Le modifiche apportate alle risorse Oracle Cloud Infrastructure create dinamicamente dal plugin del volume CSI non vengono riconciliate con gli oggetti Kubernetes.
  • Se si elimina un PVC associato a un PV supportato da un file system creato dal plugin volume CSI, il plugin volume CSI elimina il file system e il PV creato. Se il plugin del volume CSI ha creato anche una nuova destinazione di accesso (perché non è stato specificato l'OCID di una destinazione di accesso esistente nella definizione della classe di storage), il plugin del volume CSI elimina anche la destinazione di accesso. Tenere presente che se è stato specificato l'OCID di una destinazione di accesso esistente, il plugin del volume CSI non elimina la destinazione di accesso.
  • Il provisioning di un PVC in un nuovo file system creato dinamicamente dal plugin del volume CSI è disponibile quando i cluster eseguono Kubernetes 1.22 o versioni successive. Vedere Provisioning di un PVC su un nuovo file system mediante il plugin volume CSI.
  • Il provisioning di un PVC associandolo a un PV supportato da un file system esistente è disponibile quando i cluster eseguono Kubernetes 1.18 o versione successiva. Vedere Provisioning di un PVC su un file system esistente.

Cifratura dei dati in archivio e in transito con il servizio di storage di file

Quando si utilizza il servizio di storage di file per eseguire il provisioning dei PVC, si specifica la cifratura in transito indipendentemente dalla cifratura in archivio.

Il servizio di storage di file cifra sempre i dati in archivio, utilizzando le chiavi di cifratura gestite da Oracle per impostazione predefinita. Tuttavia, hai la possibilità di specificare la cifratura in archivio utilizzando le tue chiavi di cifratura master che gestisci tu stesso nel servizio Vault. Come specificare la crittografia at-rest dipende dal fatto che si stia eseguendo il provisioning di un PVC su:

Se si desidera gestire le proprie chiavi di cifratura master per cifrare i dati in archivio, è necessario effettuare le operazioni riportate di seguito.

Il servizio di storage di file può facoltativamente cifrare i dati in transito. Se si specifica la cifratura in transito, i dati in transito vengono cifrati utilizzando un certificato TLS (Transport Layer Security) sempre gestito da Oracle, indipendentemente dal fatto che i dati in archivio siano cifrati utilizzando chiavi gestite da Oracle o utilizzando chiavi gestite dall'utente. La cifratura in transito protegge i dati trasferiti tra le istanze e i file system di cui è stato eseguito il MOUNT utilizzando la cifratura TLS v. 1.2. Per ulteriori informazioni sulla cifratura in transito e sul servizio di storage di file, vedere Using In-transit TLS Encryption. Come specificare la cifratura in transito dipende dal fatto che si stia eseguendo il provisioning di un PVC su:

Tenere presente che quando si utilizza il servizio di storage di file per eseguire il provisioning dei PVC, la cifratura in transito è supportata solo quando le istanze di computazione che ospitano nodi di lavoro eseguono Oracle Linux 7 e Oracle Linux 8.

Provisioning di un PVC su un nuovo file system mediante il plugin volume CSI

Nota

Quando si esegue il provisioning di un PVC su un nuovo file system creato dinamicamente dal plugin del volume CSI, si applicano i prerequisiti riportati di seguito.
  • I cluster devono eseguire Kubernetes 1.22 o versioni successive per eseguire il provisioning di un PVC in un nuovo file system creato dinamicamente dal plugin del volume CSI.
  • Per consentire al plugin del volume CSI di creare e gestire le risorse di storage di file, devono esistere criteri IAM appropriati. Più specificamente:

    • Criterio per creare e/o gestire file system, destinazioni di MOUNT e percorsi di esportazione. Ad esempio:
      ALLOW any-user to manage file-family in compartment <compartment-name> where request.principal.type = 'cluster'
    • Criterio che consente di utilizzare VNIC, IP privati, zone DNS private e subnet. Ad esempio:
      ALLOW any-user to use virtual-network-family in compartment <compartment-name> where request.principal.type = 'cluster'
  • Se il compartimento a cui appartiene un pool di nodi, una subnet di nodi di lavoro, un file system o una destinazione di accesso è diverso dal compartimento a cui appartiene un cluster, i criteri IAM devono esistere per consentire al plugin del volume CSI di accedere alla posizione appropriata. Ad esempio:

    ALLOW any-user to manage file-family in TENANCY where request.principal.type = 'cluster'
    ALLOW any-user to use virtual-network-family in TENANCY where request.principal.type = 'cluster'
  • Per specificare una determinata chiave di cifratura master gestita dall'utente dal servizio Vault per la cifratura dei dati nei file system, devono esistere criteri IAM appropriati per consentire al plugin del volume CSI di accedere a tale chiave di cifratura master. Vedere Create Policy to Access User-Managed Encryption Keys for Encrypting Boot Volumes, Block Volumes, and/or File Systems.

Per eseguire il provisioning dinamico di un PVC su un nuovo file system creato dinamicamente dal plugin volume CSI nel servizio di storage di file:

  1. (Opzionale) Creare una destinazione di accesso nel servizio di storage di file. Vedere Creating a Mount Target.

    Il plugin del volume CSI richiede una destinazione di accesso attiva (ovvero una destinazione di accesso con un indirizzo IP assegnato) per creare un nuovo file system. Se non si crea una destinazione di accesso in anticipo, specificare la subnet in cui il plugin del volume CSI deve creare una nuova destinazione di accesso quando si definisce la classe di storage.

  2. Definire una nuova classe di storage che utilizzi il provisioninger fss.csi.oraclecloud.com:
    1. Creare un file manifesto (ad esempio, in un file denominato fss-dyn-st-class.yaml), specificare un nome per la nuova classe di memorizzazione e specificare i valori per i parametri obbligatori e facoltativi:
      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: <storage-class-name>
      provisioner: fss.csi.oraclecloud.com
      parameters:
        availabilityDomain: <ad-name>
        mountTargetOcid: <mt-ocid> | mountTargetSubnetOcid: <mt-subnet-ocid>
        compartmentOcid: <compartment-ocid>
        kmsKeyOcid: <key-ocid>
        exportPath: <path>
        exportOptions: "[{<options-in-json-format>}]"
        encryptInTransit: "true"|"false"
        oci.oraclecloud.com/initial-defined-tags-override: '{"<tag-namespace>": {"<tag-key>": "<tag-value>"}}'
        oci.oraclecloud.com/initial-freeform-tags-override: '{"<tag-key>": "<tag-value>"}'

      Dove:

      • name: <storage-class-name>: obbligatorio. Nome scelto per la classe di memorizzazione.
      • availabilityDomain: <ad-name>: obbligatorio. Il nome del dominio di disponibilità in cui creare il nuovo file system (e in cui creare la nuova destinazione di accesso, se non viene specificato un OCID di destinazione di accesso esistente). Ad esempio, US-ASHBURN-AD-1. Per determinare il nome del dominio di disponibilità da utilizzare, eseguire il comando CLI oci iam availability-domain list oppure utilizzare l'operazione ListAvailabilityDomains. Per ulteriori informazioni, vedere Nomi dei domini di disponibilità della tenancy.
      • mountTargetOcid: <mt-ocid> | mountTargetSubnetOcid: <mt-subnet-ocid>: obbligatorio. L'OCID di una destinazione di accesso attiva esistente (mountTargetOcid: <mt-ocid>) o l'OCID di una subnet in cui creare una nuova destinazione di accesso (mountTargetSubnetOcid: <mt-subnet-ocid>). Specificare mountTargetOcid o mountTargetSubnetOcid. Se si specifica sia mountTargetOcid che mountTargetSubnetOcid nella definizione della classe di memorizzazione, viene utilizzata la destinazione di accesso esistente specificata da mountTargetOcid e mountTargetSubnetOcid viene ignorato. Ad esempio:
        • mountTargetSubnetOcid: ocid1.subnet.oc1.iad.aaaaaaaa2xpk______zva
        • mountTargetOcid: ocid1.mounttarget.oc1.iad.aaaaaaaa4np______fuy
      • compartmentOcid: <compartment-ocid>: facoltativo. L'OCID del compartimento a cui deve appartenere il nuovo file system (e la nuova destinazione di accesso, se non viene specificato un OCID di destinazione di accesso esistente). Se non viene specificato, per impostazione predefinita viene utilizzato lo stesso compartimento del cluster. Ad esempio, compartmentOcid: ocid1.compartment.oc1..aaaaaaaay______t6q
      • kmsKeyOcid: <key-ocid>: facoltativo. OCID di una chiave di cifratura master gestita dall'utente, con la quale cifrare i dati in archivio. Se non viene specificato, i dati vengono cifrati in archivio utilizzando le chiavi di cifratura gestite da Oracle. Vedere Cifratura dei dati in archivio in un nuovo file system. Ad esempio, kmsKeyOcid: ocid1.key.oc1.iad.anntl______usjh
      • exportPath: <path>: facoltativo. Il percorso di un'esportazione che identifica in modo univoco il file system all'interno della destinazione di accesso. Il percorso di esportazione deve iniziare con una barra (/) seguita da una sequenza di zero o più elementi separati da barre. Ad esempio, /FileSystem1. Per ulteriori informazioni, vedere Percorsi nei file system.

        Se si include exportPath: <path> in una definizione di classe di memorizzazione, non specificare un percorso (come percorso o come sottopercorso di un percorso esistente) già esistente. Se si specifica un percorso già esistente, viene restituito un errore perché più file system con la stessa destinazione di accesso non possono avere lo stesso percorso di esportazione. Pertanto, se si include exportPath: <path> nella definizione della classe di memorizzazione, utilizzare questa definizione della classe di memorizzazione solo per creare un file system.

        Se non si include exportPath: <path> nella definizione della classe di memorizzazione, per impostazione predefinita il percorso viene impostato sul nome visualizzato del file system creato dal plugin del volume CSI (a partire da /csi-fss-).

      • exportOptions: "[{<options-in-json-format>}]" Facoltativo. Set di parametri (in formato JSON valido) all'interno dell'esportazione che specifica il livello di accesso concesso ai client NFS quando si connettono a una destinazione di accesso. Una voce delle opzioni di esportazione NFS all'interno di un'esportazione definisce l'accesso per un singolo indirizzo IP o intervallo di blocchi CIDR. Per ulteriori informazioni, vedere Utilizzo delle opzioni di esportazione e di esportazione NFS. Se non viene specificato, viene utilizzato il seguente valore predefinito:
        exportOptions: "[{\"source\":\"0.0.0.0/0\",\"requirePrivilegedSourcePort\":false,\"access\":\"READ_WRITE\",\"identitySquash\":\"NONE\"}]"
      • encryptInTransit: "true"|"false": facoltativo. Indica se cifrare i dati in transito. Se si specifica "true", assicurarsi di completare i passi di impostazione descritti nella sezione Cifratura dei dati in transito in un nuovo file system. Se non specificato, per impostazione predefinita viene utilizzato "false". Ad esempio, encryptInTransit: "true".
      • oci.oraclecloud.com/initial-defined-tags-override: '{"<tag-namespace>": {"<tag-key>": "<tag-value>"}}' Facoltativo. Specifica un tag definito per il nuovo file system. Ad esempio, oci.oraclecloud.com/initial-defined-tags-override: '{"Operations": {"CostCenter": "42"}}'

        Tenere presente che per applicare le tag definite da uno spazio di nomi tag appartenente a un compartimento a una risorsa del file system appartenente a un compartimento diverso, è necessario includere un'istruzione dei criteri per consentire al cluster di utilizzare lo spazio di nomi tag. Vedere Criterio IAM aggiuntivo quando un cluster e uno spazio di nomi tag si trovano in compartimenti diversi.

      • oci.oraclecloud.com/initial-freeform-tags-override: '{"<tag-key>": "<tag-value>"}' Facoltativo. Specifica un tag in formato libero per il nuovo file system. Ad esempio, oci.oraclecloud.com/initial-freeform-tags-override: '{"Department": "Finance"}'

      Ad esempio:

      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: fss-dyn-storage
      provisioner: fss.csi.oraclecloud.com
      parameters:
        availabilityDomain: US-ASHBURN-AD-1
        mountTargetSubnetOcid: ocid1.subnet.oc1.iad.aaaaaaaa2xpk______zva
        compartmentOcid: ocid1.compartment.oc1..aaaaaaaay______t6q
        kmsKeyOcid: ocid1.key.oc1.iad.anntl______usjh
        exportPath: /FileSystem1
        exportOptions: "[{\"source\":\"0.0.0.0/0\",\"requirePrivilegedSourcePort\":false,\"access\":\"READ_WRITE\",\"identitySquash\":\"NONE\"}]"
        encryptInTransit: "true"
    2. Creare la classe di memorizzazione dal file manifest immettendo:
      kubectl create -f <filename>
      Ad esempio:
      kubectl create -f fss-dyn-st-class.yaml
  3. Creare regole di sicurezza in un gruppo di sicurezza di rete (consigliato) o in una lista di sicurezza sia per la destinazione di accesso a cui viene fatto riferimento nella definizione della classe di storage (o da cui viene creata) sia per i nodi di lavoro del cluster.

    Le regole di sicurezza da creare dipendono dalle posizioni di rete relative della destinazione di accesso e dei nodi di lavoro, in base agli scenari riportati di seguito.

    Questi scenari, le regole di sicurezza da creare e la posizione in cui crearli, sono descritti completamente nella documentazione del servizio di storage di file (vedere Configurazione delle regole di sicurezza VCN per lo storage di file).

  4. Creare un PVC di cui eseguire il provisioning dal nuovo file system nel servizio di storage di file, come indicato di seguito.
    1. Creare un file manifest per definire il PVC:
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: <pvc-name>
      spec:
        accessModes:
          - ReadWriteMany
        storageClassName: "<storage-class-name>"
        resources:
          requests:
            storage: 50Gi

      Dove:

      • name: <pvc-name>: richiesto. Ad esempio, fss-dynamic-claim
      • storageClassName: "<storage-class-name>": obbligatorio. Il nome della classe di memorizzazione definita in precedenza. Ad esempio, fss-dyn-storage.
      • accessModes: - ReadWriteMany: obbligatorio. Si noti che accessModes: deve specificare ReadWriteMany.
      • storage: 50Gi: obbligatorio. Si noti che Kubernetes richiede di specificare un valore per storage: nel file manifesto in PVC. Tuttavia, il servizio di storage di file non supporta la specifica di una dimensione di file system e crea un nuovo file system con una dimensione predefinita, indipendentemente dal valore specificato per storage:.

      Ad esempio, il seguente file manifesto (denominato fss-dyn-claim.yaml) definisce un PVC denominato fss-dynamic-claim di cui viene eseguito il provisioning dal file system definito nella classe di memorizzazione fss-dyn-storage:

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: fss-dynamic-claim
      spec:
        accessModes:
          - ReadWriteMany
        storageClassName: "fss-dyn-storage"
        resources:
          requests:
            storage: 50Gi
    2. Creare il PVC dal file manifesto inserendo:
      kubectl create -f <filename>
      Ad esempio:
      kubectl create -f fss-dyn-claim.yaml

    Viene creato un nuovo PVC. Il plugin del volume CSI crea un nuovo volume persistente (PV) e un nuovo file system nel servizio di storage di file (insieme a una nuova destinazione di accesso se non è stata specificata una destinazione di accesso esistente).

    Il nuovo PVC è legato al nuovo PV. I dati vengono cifrati in archivio, utilizzando le chiavi di cifratura gestite da Oracle o dall'utente.

  5. Verificare che il PVC sia stato legato al nuovo volume persistente inserendo:
    kubectl get pvc

    L'output del comando precedente conferma che il PVC è stato associato con successo:

    			
    NAME                STATUS    VOLUME                 CAPACITY   ACCESSMODES   STORAGECLASS      AGE
    fss-dynamic-claim   Bound     csi-fss-<unique_ID>    50Gi       RWX           fss-dyn-storage   4m
  6. Utilizzare il nuovo PVC quando si creano altri oggetti, come i baccelli. Ad esempio, è possibile creare un nuovo pod dalla seguente definizione pod:
    apiVersion: v1
    kind: Pod
    metadata:
      name: fss-dynamic-app
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - name: http
              containerPort: 80
          volumeMounts:
            - name: persistent-storage
              mountPath: /usr/share/nginx/html
      volumes:
      - name: persistent-storage
        persistentVolumeClaim:
          claimName: fss-dynamic-claim
  7. Dopo aver creato un nuovo pod come descritto nell'esempio nel passaggio precedente, è possibile verificare che il pod stia utilizzando il nuovo PVC inserendo:

    kubectl describe pod nginx
Suggerimento

Se prevedi un requisito frequente per creare dinamicamente nuovi PV e nuovi file system quando crei i PVC, puoi specificare che la nuova classe di storage che hai creato deve essere utilizzata come classe di storage predefinita per il provisioning di nuovi PVC. Per ulteriori dettagli, consulta la documentazione di Kubernetes.

Cifratura dei dati in archivio in un nuovo file system

Il servizio di storage di file cifra sempre i dati in archivio, utilizzando le chiavi di cifratura gestite da Oracle per impostazione predefinita. Tuttavia, hai la possibilità di cifrare i dati in archivio utilizzando le tue chiavi di cifratura master che gestisci tu stesso nel servizio Vault.

A seconda di come si desidera cifrare i dati in archivio, attenersi alle istruzioni appropriate riportate di seguito.

  • Per utilizzare il plugin volume CSI per creare in modo dinamico un nuovo file system che utilizza chiavi di cifratura gestite da Oracle per cifrare i dati in archivio, attenersi alla procedura descritta in Provisioning di un PVC su un nuovo file system mediante il plugin volume CSI e non includere il parametro kmsKeyOcid: <key-ocid> nella definizione della classe di storage. I dati vengono cifrati in archivio utilizzando le chiavi di cifratura gestite da Oracle.
  • Per utilizzare il plugin del volume CSI per creare in modo dinamico un nuovo file system che utilizza chiavi di cifratura master che consentono di cifrare i dati in archivio, attenersi alla procedura descritta in Provisioning di un file system PVC su un nuovo file system mediante il plugin del volume CSI, includere il parametro kmsKeyOcid: <key-ocid> nella definizione della classe di storage e specificare l'OCID della chiave di cifratura master nel servizio Vault. I dati vengono cifrati in archivio, utilizzando la chiave di cifratura specificata.

Cifratura dei dati in transito in un nuovo file system

La cifratura in transito protegge i dati trasferiti tra le istanze e i file system di cui è stato eseguito il MOUNT utilizzando la cifratura TLS 1.2 (Transport Layer Security). Per ulteriori informazioni sulla cifratura in transito e sul servizio di storage di file, vedere Using In-transit TLS Encryption.

È possibile specificare la cifratura in transito indipendentemente dalla cifratura in archivio. I dati in transito vengono cifrati utilizzando un certificato TLS sempre gestito da Oracle, indipendentemente dal fatto che i dati in archivio siano cifrati utilizzando chiavi gestite da Oracle o utilizzando chiavi gestite dall'utente.

Tenere presente che quando si utilizza il servizio di storage di file per eseguire il provisioning dei PVC, la cifratura in transito è supportata solo quando le istanze di computazione che ospitano nodi di lavoro eseguono Oracle Linux 7 e Oracle Linux 8.

Per utilizzare il plugin del volume CSI per creare dinamicamente un nuovo file system con cifratura in transito:

  1. Seguire le istruzioni in Impostazione della cifratura in transito per Linux per impostare la cifratura in transito nel file system. Più specificamente:
    1. Completare i prerequisiti impostando le regole di sicurezza riportate di seguito in un gruppo di sicurezza di rete (consigliato) o in una lista di sicurezza per la destinazione di accesso che esporta il file system.
      • Regola ingress con conservazione dello stato che consente il traffico TCP fino a un intervallo di porte di destinazione del 2051, da tutte le porte di un indirizzo IP di origine o di un blocco CIDR di propria scelta o da tutte le origini.
      • Regola di uscita con conservazione dello stato che consente il traffico TCP da un intervallo di porte di origine del 2051 a tutte le porte di un indirizzo IP di destinazione o di un blocco CIDR di propria scelta o a tutte le destinazioni.

      Per ulteriori informazioni, vedere Scenario C: La destinazione di accesso e l'istanza utilizzano la cifratura in transito TLS.

    2. Scaricare il package oci-fss-utils su ogni nodo di lavoro. Si noti che è necessario accettare il Contratto di licenza. Vedere Task 1: scaricare il package OCI-FSS-UTILS.
    3. Installare il pacchetto oci-fss-utils su ciascun nodo di lavoro. Vedere Task 2: installare il pacchetto OCI-FSS-UTILS su Oracle Linux o CentOS.
  2. Seguire le istruzioni in Provisioning di un PVC su un nuovo file system mediante il plugin volume CSI e includere il parametro encryptInTransit: "true" nella definizione della classe di memorizzazione. I dati vengono cifrati in transito mediante una chiave di cifratura gestita da Oracle.

Provisioning di un PVC su un file system esistente

Per creare un PVC su un file system esistente nel servizio di storage di file (utilizzando chiavi di cifratura gestite da Oracle per cifrare i dati in archivio):

  1. Creare un file system con una destinazione di accesso nel servizio di storage di file, selezionando l'opzione di cifratura Cifra mediante chiavi gestite da Oracle. Vedere Creazione di un file system.
  2. Creare regole di sicurezza in un gruppo di sicurezza di rete (consigliato) o in una lista di sicurezza sia per la destinazione di accesso che esporta il file system sia per i nodi di lavoro del cluster.
    Le regole di sicurezza da creare dipendono dalle posizioni di rete relative della destinazione di accesso e dei nodi di lavoro, in base agli scenari riportati di seguito.

    Questi scenari, le regole di sicurezza da creare e la posizione in cui crearli, sono descritti completamente nella documentazione del servizio di storage di file (vedere Configurazione delle regole di sicurezza VCN per lo storage di file).

  3. Creare un PV supportato dal file system nel servizio di storage di file come indicato di seguito.
    1. Creare un file manifesto per definire un PV e, nella sezione csi:, impostare:

      • Da driver a fss.csi.oraclecloud.com
      • Da volumeHandle a <FileSystemOCID>:<MountTargetIP>:<path>
        Dove:
        • <FileSystemOCID> è l'OCID del file system definito nel servizio di storage di file.
        • <MountTargetIP> è l'indirizzo IP assegnato alla destinazione di accesso.
        • <path> è il percorso di accesso al file system relativo all'indirizzo IP della destinazione di accesso, a partire da una barra.
        Ad esempio: ocid1.filesystem.oc1.iad.aaaa______j2xw:10.0.0.6:/FileSystem1

      Ad esempio, il seguente file manifesto (denominato fss-pv.yaml) definisce un PV denominato fss-pv supportato da un file system nel servizio di storage di file:

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: fss-pv
      spec:
        capacity:
          storage: 50Gi
        volumeMode: Filesystem
        accessModes:
          - ReadWriteMany
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: fss.csi.oraclecloud.com
          volumeHandle: ocid1.filesystem.oc1.iad.aaaa______j2xw:10.0.0.6:/FileSystem1
    2. Creare il PV dal file manifesto immettendo:
      kubectl create -f <filename>

      Ad esempio:

      kubectl create -f fss-pv.yaml
  4. Creare un PVC fornito dal PV creato, come segue:
    1. Creare un file manifesto per definire il PVC e impostare:
      • Da storageClassName a "". Si noti che è necessario specificare un valore vuoto per storageClassName, anche se la classe di memorizzazione non è applicabile in caso di provisioning statico dello storage persistente. Se non si specifica un valore vuoto per storageClassName, viene utilizzata la classe di memorizzazione predefinita (oci-bv), che causa un errore.
      • volumeName al nome del PV creato (ad esempio, fss-pv)

      Ad esempio, il seguente file manifesto (denominato fss-pvc.yaml) definisce un PVC denominato fss-pvc di cui viene eseguito il provisioning da un PV denominato fss-pv:

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: fss-pvc
      spec:
        accessModes:
          - ReadWriteMany
        storageClassName: ""
        resources:
          requests:
            storage: 50Gi
        volumeName: fss-pv

      Si noti che l'elemento requests: storage: deve essere presente nel file manifesto del PVC e che il relativo valore deve corrispondere al valore specificato per l'elemento capacity: storage: nel file manifesto del PV. A parte questo, il valore dell'elemento requests: storage: viene ignorato.

    2. Creare il PVC dal file manifesto inserendo:
      kubectl create -f <filename>
      Ad esempio:
      kubectl create -f fss-pvc.yaml

Il PVC è associato al PV supportato dal file system del servizio di storage di file. I dati vengono cifrati in archivio utilizzando le chiavi di cifratura gestite da Oracle.

Cifratura dei dati in archivio su un file system esistente

Il servizio di storage di file cifra sempre i dati in archivio, utilizzando le chiavi di cifratura gestite da Oracle per impostazione predefinita. Tuttavia, hai la possibilità di cifrare i file system utilizzando le tue chiavi di cifratura master che gestisci tu stesso nel servizio Vault.

A seconda di come si desidera cifrare i dati in archivio, attenersi alle istruzioni appropriate riportate di seguito.

  • Per creare un PVC in un file system utilizzando chiavi di cifratura gestite da Oracle per cifrare i dati in archivio, attenersi alla procedura descritta in Provisioning di un PVC in un file system esistente e selezionare l'opzione di cifratura Encrypt using Oracle-managed keys come descritto. I dati vengono cifrati in archivio utilizzando le chiavi di cifratura gestite da Oracle.
  • Per creare un PVC su un file system utilizzando chiavi di cifratura master che consentono di cifrare i dati in archivio, attenersi alla procedura descritta in Provisioning di un PVC su un file system esistente, ma selezionare l'opzione di cifratura Encrypt using customer-managed keys e specificare la chiave di cifratura master nel servizio Vault. I dati vengono cifrati in archivio, utilizzando la chiave di cifratura specificata.

Cifratura dei dati in transito su un file system esistente

La cifratura in transito protegge i dati trasferiti tra le istanze e i file system di cui è stato eseguito il MOUNT utilizzando la cifratura TLS v. 1.2 (Transport Layer Security). Per ulteriori informazioni sulla cifratura in transito e sul servizio di storage di file, vedere Using In-transit TLS Encryption.

È possibile specificare la cifratura in transito indipendentemente dalla cifratura in archivio. I dati in transito vengono cifrati utilizzando un certificato TLS sempre gestito da Oracle, indipendentemente dal fatto che i dati in archivio siano cifrati utilizzando chiavi gestite da Oracle o utilizzando chiavi gestite dall'utente.

Tenere presente che quando si utilizza il servizio di storage di file per eseguire il provisioning dei PVC, la cifratura in transito è supportata solo quando le istanze di computazione che ospitano nodi di lavoro eseguono Oracle Linux 7 e Oracle Linux 8.

Per creare un PVC in un file system in cui i dati sono cifrati in transito:

  1. Seguire le istruzioni in Impostazione della cifratura in transito per Linux per impostare la cifratura in transito nel file system. Più specificamente:
    1. Completare i prerequisiti impostando le regole di sicurezza riportate di seguito in un gruppo di sicurezza di rete (consigliato) o in una lista di sicurezza per la destinazione di accesso che esporta il file system.
      • Regola ingress con conservazione dello stato che consente il traffico TCP fino a un intervallo di porte di destinazione del 2051, da tutte le porte di un indirizzo IP di origine o di un blocco CIDR di propria scelta o da tutte le origini.
      • Regola di uscita con conservazione dello stato che consente il traffico TCP da un intervallo di porte di origine del 2051 a tutte le porte di un indirizzo IP di destinazione o di un blocco CIDR di propria scelta o a tutte le destinazioni.

      Per ulteriori informazioni, vedere Scenario C: La destinazione di accesso e l'istanza utilizzano TLS nella cifratura in transito.

    2. Scaricare il package oci-fss-utils su ogni nodo di lavoro. Si noti che è necessario accettare il Contratto di licenza. Vedere Task 1: scaricare il package OCI-FSS-UTILS.
    3. Installare il pacchetto oci-fss-utils su ciascun nodo di lavoro. Vedere Task 2: installare il pacchetto OCI-FSS-UTILS su Oracle Linux o CentOS.
  2. Seguire le istruzioni in Provisioning di un PVC su un file system esistente, selezionando l'opzione Encrypt using Oracle-managed keys o l'opzione Encrypt using customer-managed keys come richiesto per la cifratura dei dati in archivio. Tuttavia, quando si crea il file manifesto per definire un PV, impostare encryptInTransit su "true" nella sezione csi del file. Ad esempio:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: fss-encrypted-it-pv
    spec:
      capacity:
        storage: 50Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: fss.csi.oraclecloud.com
        volumeHandle: ocid1.filesystem.oc1.iad.aaaa______j2xw:10.0.0.6:/FileSystem1
        volumeAttributes:
          encryptInTransit: "true"

Risoluzione dei problemi relativi al provisioning del servizio di storage di file dei PVC

Il pod non può accedere al file system a causa di autorizzazioni insufficienti

descrizione;

Quando un pod tenta di accedere a un volume persistente (PV) supportato da un file system nel servizio di storage di file, il tentativo potrebbe non riuscire con un messaggio "Autorizzazione negata".

Causa

Quando si definisce un PV supportato da un file system nel servizio di storage di file, è necessario impostare l'attributo accessModes di PV su ReadWriteMany e non è necessario specificare un valore per l'attributo fsType di PV.

Il plugin volume CSI viene implementato come oggetto CSIDriver. Utilizzare l'attributo fsGroupPolicy dell'oggetto CSIDriver per controllare se CSIDriver modifica la proprietà e le autorizzazioni di un volume in modo che corrispondano all'attributo fsGroup specificato nella securityContext di un pod che monta il volume. La modifica della proprietà e delle autorizzazioni del volume consente al pod di accedere al volume dopo averlo montato.

Per impostazione predefinita, l'attributo fsGroupPolicy dell'oggetto CSIDriver è impostato su ReadWriteOnceWithFSType, a indicare che CSIDriver deve esaminare la definizione PV per determinare se modificare la proprietà del volume e le autorizzazioni in modo che corrispondano all'attributo fsGroup del pod come indicato di seguito.

  • Se l'attributo fsType di PV è impostato, CSIDriver modifica la proprietà e le autorizzazioni del volume in modo che corrispondano all'attributo fsGroup specificato nel securityContext del pod. Di conseguenza, il volume è accessibile al pod.
  • Se l'attributo fsType del PV non è impostato, CSIDriver non modifica la proprietà e le autorizzazioni del volume. Il volume è accessibile solo ai processi in esecuzione come root. Di conseguenza, un pod non in esecuzione come root riceve il messaggio "Autorizzazione negata" quando si tenta di accedere a una directory o a un file nel volume attivato.

Di seguito viene descritto come verificare che il motivo per cui un pod riceve il messaggio "Autorizzazione negata" sia perché l'attributo fsGroupPolicy dell'oggetto CSIDriver è impostato su ReadWriteOnceWithFSType e l'attributo fsType del PV non è impostato. Eseguire un comando sul pod per scrivere un file in una directory sul volume attivato e quindi esaminare le proprietà del file per verificare se il proprietario del gruppo corrisponde all'attributo fsGroup specificato nel securityContext del pod. Si supponga, ad esempio, che un pod abbia il seguente file manifesto:

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    fsGroup: 2000
  containers:
  - name: sec-ctx-demo
    image: busybox:1.28
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
  1. Eseguire un comando sul pod per scrivere un file in una directory sul volume attivato. Ad esempio, immettendo:
    kubectl exec -it security-context-demo -- sh -c "cd /data/demo && echo hello > testfile"
  2. Esaminare le proprietà del file appena creato per confermare i diritti di accesso. Ad esempio, immettendo:
    kubectl exec -it security-context-demo -- sh -c "ls -l /data/demo/testfile"

    Idealmente, l'output mostra che il proprietario del gruppo del file è uguale a quello specificato dall'attributo fsGroup del pod, dando al pod l'accesso al file. Ad esempio:

    -rw-r--r-- 1 root 2000 6 Jun  6 20:08 testfile

    Tuttavia, se l'attributo fsGroupPolicy dell'oggetto CSIDriver è impostato su ReadWriteOnceWithFSType e l'attributo fsType di PV non è impostato, l'output mostra il proprietario del gruppo del file come root e il pod non ha accesso al file. Ad esempio:

    -rw-r--r-- 1 root root 6 Jun  6 20:08 testfile

Per ulteriori informazioni, vedere Criterio volume CSI fsGroup nella documentazione di Kubernetes.

Azione

Se si conosce l'ID gruppo del proprietario del volume dei file a cui accede il pod e l'ID gruppo del proprietario del volume non è root (0), si consiglia di specificare un gruppo supplementare nel file securityContext nella specifica pod. Ad esempio, se l'ID utente del proprietario del volume è 0 (radice) e l'ID gruppo del proprietario del volume è 1000, specificare 1000 come gruppo supplementare nel securityContext del pod come indicato di seguito.


spec:
  securityContext:
    supplementalGroups: [1000]

Se non è possibile assegnare l'ID gruppo del proprietario del volume come gruppo supplementare nel securityContext del pod, suggeriamo due soluzioni alternative:

  • Soluzione alternativa 1: abilitare l'oggetto CSIDriver per modificare la proprietà del volume e le autorizzazioni in modo che corrispondano all'attributo fsGroup specificato nel securityContext del pod.
  • Soluzione alternativa 2: utilizzare le opzioni di esportazione Squash del file system per consentire ai pod di accedere ai file e alle directory nel volume senza modificare la proprietà del volume.

Prima di scegliere una soluzione, considera i vantaggi e gli svantaggi descritti per ogni soluzione.

Soluzione alternativa 1: abilitare l'oggetto CSIDriver per modificare la proprietà del volume e le autorizzazioni in modo che corrispondano all'attributo fsGroup specificato nel securityContext del pod

Per consentire all'oggetto CSIDriver di modificare la proprietà del volume e le autorizzazioni in modo che corrispondano all'attributo fsGroup specificato nel securityContext del pod, impostare l'attributo fsGroupPolicy dell'oggetto CSIDriver su File come indicato di seguito.

  1. Per ottenere il file di configurazione CSIDriver, immettere:
    kubectl get csiDriver fss.csi.oraclecloud.com -oyaml > fss_csi_driver.yaml
  2. In un editor di testo, modificare il file fss_csi_driver.yaml e modificare l'attributo fsGroupPolicy dell'oggetto CSIDriver da ReadWriteOnceWithFSType a File.

    Ad esempio modificare:

    apiVersion: storage.k8s.io/v1
    kind: CSIDriver
    metadata:
      creationTimestamp: "<timestamp>"
      name: fss.csi.oraclecloud.com
      resourceVersion: "<version>"
      uid: <identifier>
    spec:
      attachRequired: false
      fsGroupPolicy: ReadWriteOnceWithFSType
      podInfoOnMount: false
      requiresRepublish: false
      storageCapacity: false
      volumeLifecycleModes:
      - Persistent 

    in:

    apiVersion: storage.k8s.io/v1
    kind: CSIDriver
    metadata:
      creationTimestamp: "<timestamp>"
      name: fss.csi.oraclecloud.com
      resourceVersion: "<version>"
      uid: <identifier>
    spec:
      attachRequired: false
      fsGroupPolicy: File
      podInfoOnMount: false
      requiresRepublish: false
      storageCapacity: false
      volumeLifecycleModes:
      - Persistent 

    Modificare solo il valore di fsGroupPolicy. Non modificare nessun altro valore.

  3. Salvare e chiudere il file fss_csi_driver.yaml.
  4. Eliminare l'oggetto CSIDriver esistente immettendo:
    kubectl delete csiDriver fss.csi.oraclecloud.com
  5. Creare il nuovo oggetto CSIDriver immettendo:
    kubectl apply -f fss_csi_driver.yaml 
  6. Riavviare il pod che ha rilevato il messaggio "Autorizzazione negata".

Cose da considerare prima di scegliere questa soluzione:

  • Quando si monta un volume di grandi dimensioni con molti file e directory nidificati, è possibile che l'attivazione del volume richieda molto tempo. Questa latenza di MOUNT del volume è dovuta al fatto che, quando fsGroupPolicy è impostato su File, Kubernetes modifica in modo ricorsivo la proprietà del volume di tutti i file e le directory nidificati chiamando chown() e chmod(). Per ridurre la latenza di accesso al volume, provare a impostare l'attributo fsGroupChangePolicy su "OnRootMismatch" nel pod securityContext, come indicato di seguito.
    securityContext:
      fsGroup: <sample-fsGroup>
      fsGroupChangePolicy: "OnRootMismatch"

    L'impostazione di fsGroupChangePolicy su "OnRootMismatch" riduce la latenza di MOUNT del volume perché Kubernetes modifica la proprietà del volume solo nei casi in cui le autorizzazioni del file di livello root non corrispondono all'impostazione fsGroup del pod.

  • Gli ID gruppo specificati come valori di fsGroup per tutti i pod che accedono a un volume vengono aggiunti come proprietari di gruppo supplementari del volume. Di conseguenza, l'accesso a tale volume è limitato agli ID dei gruppi specificati come valori fsGroup.

    Ad esempio, se si creano due pod con valori fsGroup diversi che montano entrambi lo stesso volume, l'ID gruppo specificato per il fsGroup del secondo pod è il gruppo del proprietario del volume e il primo pod ha ancora accesso al volume.

  • Se Kubernetes rileva una mancata corrispondenza di proprietà tra il proprietario del volume e fsGroup definito nella specifica pod, Kubernetes modifica la proprietà del volume di tutti i file. Se il volume contiene molti file e directory nidificati, è possibile che l'attivazione del volume richieda molto tempo.

Soluzione alternativa 2: utilizzare le opzioni di esportazione Squash del file system per consentire ai pod di accedere a file e directory in un volume senza modificare la proprietà del volume.

Attenzione

Questa soluzione richiede l'impostazione dell'opzione di esportazione Squash del file system su Tutti. L'impostazione di Squash su All concede l'accesso illimitato al file system a tutti i processi in esecuzione sul nodo in cui viene eseguito il MOUNT del volume, incluso ad altri pod. Pertanto, prima di scegliere questa soluzione, verificare la conformità ai requisiti di sicurezza.

È possibile consentire ai pod di accedere ai file e alle directory di un volume senza modificare la proprietà del volume impostando le opzioni di esportazione Squash del file system. Le opzioni di esportazione Squash determinano se per i client di origine che accedono al file system viene eseguito il mapping del relativo ID utente (UID) e ID gruppo (GID) in UID Squash e GID Squash. Per maggiori informazioni, vedere NFS Export Options.

Se si decide di utilizzare questa soluzione, non modificare l'attributo fsGroupPolicy dell'oggetto CSIDriver in File.

Per impostare le opzioni di esportazione Squash durante il provisioning di un PVC su un file system esistente, procedere come segue.

  1. Aprire il menu di navigazione e selezionare Memorizzazione. In Storage di file, selezionare File system.
  2. Nella sezione Ambito elenco, in Compartimento selezionare un compartimento. Vengono visualizzati tutti i file system nel compartimento selezionato.
  3. Fare clic sul nome del file system per il quale si desidera impostare le opzioni di esportazione.
  4. Nella pagina dei dettagli del file system, in Risorse, fare clic su Esportazioni.
  5. Nell'elenco Esportazioni fare clic sul nome dell'esportazione per la quale si desidera impostare le opzioni.
  6. Nella pagina dei dettagli dell'esportazione, in Opzioni di esportazione del client NFS, fare clic su Modifica opzioni.
  7. Nel pannello Modifica opzioni, aggiornare le opzioni di esportazione Squash come indicato di seguito.

    • Squash: passare a Tutti.
    • UID squash: passare all'UID del proprietario del volume o all'UID radice (0).
    • GUID squash: passare al GID del proprietario del volume o al GID root (0).

    Per maggiori informazioni, vedere NFS Export Options.

  8. Fare clic su Aggiorna.

Per impostare le opzioni di esportazione Squash durante il provisioning di un PVC in un nuovo file system, procedere come segue.

  1. Seguire le istruzioni in Provisioning di un PVC su un nuovo file system mediante il plugin volume CSI, ma quando si crea il file manifesto per la classe di memorizzazione che utilizza il provisioninger fss.csi.oraclecloud.com, impostare il parametro exportOptions per specificare i valori per le opzioni di esportazione Squash come indicato di seguito.
    exportOptions: "[\"identitySquash\":\"ALL\",\"anonymous-uid\":\"0\",\"anonymous-gid\":\"0\"]"

    Ad esempio:

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: fss-dyn-storage
    provisioner: fss.csi.oraclecloud.com
    parameters:
      availabilityDomain: US-ASHBURN-AD-1
      mountTargetSubnetOcid: ocid1.subnet.oc1.iad.aaaaaaaa2xpk______zva
      compartmentOcid: ocid1.compartment.oc1..aaaaaaaay______t6q
      kmsKeyOcid: ocid1.key.oc1.iad.anntl______usjh
      exportPath: /FileSystem1
      exportOptions: "[\"identitySquash\":\"ALL\",\"anonymous-uid\":\"0\",\"anonymous-gid\":\"0\"]"
      encryptInTransit: "true"
  2. Creare la classe di memorizzazione dal file manifest immettendo:
    kubectl create -f <filename>
    Ad esempio:
    kubectl create -f fss-dyn-st-class.yaml
  3. Seguire le istruzioni rimanenti nella sezione Provisioning di un PVC su un nuovo file system mediante il plugin volume CSI per creare regole di sicurezza e per creare il PVC.

    Il plugin del volume CSI crea un nuovo volume persistente (PV) e un nuovo file system nel servizio di storage di file. Il nuovo file system dispone delle opzioni di esportazione Squash specificate nella classe di memorizzazione.

Cose da considerare prima di scegliere questa soluzione:

  • L'impostazione di Squash su All concede l'accesso illimitato al file system a tutti i processi in esecuzione sul nodo in cui viene eseguito il MOUNT del volume, incluso ad altri pod. Pertanto, prima di scegliere questa soluzione, verificare la conformità ai requisiti di sicurezza.
  • A differenza di Soluzione alternativa 1, la proprietà di un volume non cambia ogni volta che il volume viene installato da un nuovo pod con l'attributo fsGroup impostato su un gruppo diverso.
  • A differenza della Soluzione alternativa 1, non esiste una latenza di MOUNT del volume quando si monta un volume di grandi dimensioni con molti file e directory nidificati, poiché Kubernetes non modifica in modo ricorsivo la proprietà del volume dei file e delle directory nidificati.
  • A differenza di Soluzione alternativa 1, non è possibile modificare il file fss_csi_driver.yaml e modificare l'attributo fsGroupPolicy dell'oggetto CSIDriver in File. Al contrario, il valore di attributo predefinito fsGroupPolicy: ReadWriteOnceWithFSType garantisce che l'oggetto CSIDriver utilizzi le funzioni fornite dal servizio di storage di file.