Uma política de armazenamento vSphere atribuída a um vSphere Namespace produz duas edições de uma classe de armazenamento disponível para uso com volumes permanentes. A edição escolhida depende dos seus requisitos.

Duas edições de uma classe de armazenamento disponíveis para uso

Quando você atribui uma política de armazenamento vSphere a um vSphere Namespace, o sistema cria uma classe de armazenamento Kubernetes correspondente nesse vSphere Namespace. Essa classe de armazenamento é replicada para cada cluster TKG provisionado nesse namespace. A classe de armazenamento fica então disponível para criar volumes de armazenamento persistentes para cargas de trabalho de cluster.

Para cada política de armazenamento vSphere atribuída a um vSphere Namespace, em Supervisor, há uma única classe de armazenamento com modo de associação "Imediato".
kubectl describe storageclass tkg-storage-policy
Name:                  tkg-storage-policy
IsDefaultClass:        No
Annotations:           cns.vmware.com/StoragePoolTypeHint=cns.vmware.com/vsan
Provisioner:           csi.vsphere.vmware.com
Parameters:            storagePolicyID=877b0f4b-b959-492a-b265-b4d460987b23
AllowVolumeExpansion:  True
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>
Para cada cluster TKG implantado nesse vSphere Namespace, há duas classes de armazenamento: uma que é igual à classe de armazenamento correspondente em Supervisor e uma segunda com *-latebinding anexado ao nome e "WaitForFirstConsumer" como a associação modo.
kubectl get sc
NAME                             PROVISIONER              RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
tkg-storage-policy               csi.vsphere.vmware.com   Delete          Immediate              true                   2m43s
tkg-storage-policy-latebinding   csi.vsphere.vmware.com   Delete          WaitForFirstConsumer   true                   2m43s
Use a edição latebinding da classe de armazenamento quando quiser provisionar um volume persistente depois que a computação tiver sido selecionada pelo agendador do Kubernetes. Para obter mais informações, consulte Modo de vinculação de volume na documentação do Kubernetes.
kubectl describe sc tkg-storage-policy
Name:                  tkg-storage-policy
IsDefaultClass:        No
Annotations:           <none>
Provisioner:           csi.vsphere.vmware.com
Parameters:            svStorageClass=tkg-storage-policy
AllowVolumeExpansion:  True
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>

kubectl describe sc tkg-storage-policy-latebinding
Name:                  tkg-storage-policy-latebinding
IsDefaultClass:        No
Annotations:           <none>
Provisioner:           csi.vsphere.vmware.com
Parameters:            svStorageClass=tkg-storage-policy
AllowVolumeExpansion:  True
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     WaitForFirstConsumer
Events:                <none>

Corrigindo uma classe de armazenamento

Para o TKG em Supervisor, você não pode criar uma classe de armazenamento manualmente usando kubectl e YAML. Você só pode criar uma classe de armazenamento usando a estrutura de política de armazenamento vSphere e aplicá-la a um vSphere Namespace. O resultado são duas classes de armazenamento correspondentes em cada cluster TKG provisionado nesse vSphere Namespace.

Embora não seja possível criar uma classe de armazenamento manualmente usando kubectl e YAML, você pode modificar uma classe de armazenamento existente usando kubectl. Isso pode ser necessário se você provisionou um cluster TKG sem especificar uma classe de armazenamento padrão e agora deseja implantar um aplicativo usando o Helm ou um pacote Tanzu que requer uma classe de armazenamento padrão.

Em vez de criar um cluster totalmente novo com armazenamento padrão, você pode corrigir a classe de armazenamento existente e adicionar a anotação default = true conforme descrito na documentação do Kubernetes: Alterar a StorageClass padrão.

Por exemplo, o seguinte comando retorna duas classes de armazenamento que estão disponíveis no cluster TKG:
kubectl describe sc
Name:                  gc-storage-profile
IsDefaultClass:        No
Annotations:           <none>
Provisioner:           csi.vsphere.vmware.com
Parameters:            svStorageClass=gc-storage-profile
AllowVolumeExpansion:  True
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>


Name:                  gc-storage-profile-latebinding
IsDefaultClass:        No
Annotations:           <none>
Provisioner:           csi.vsphere.vmware.com
Parameters:            svStorageClass=gc-storage-profile
AllowVolumeExpansion:  True
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     WaitForFirstConsumer
Events:                <none>
Use o seguinte comando para corrigir uma das classes de armazenamento e adicionar a anotação:
kubectl patch storageclass gc-storage-profile -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/gc-storage-profile patched
Verifique as classes de armazenamento novamente e você verá que uma delas foi corrigida para que agora seja o padrão.
kubectl describe sc
Name:                  gc-storage-profile
IsDefaultClass:        Yes
Annotations:           storageclass.kubernetes.io/is-default-class=true
Provisioner:           csi.vsphere.vmware.com
Parameters:            svStorageClass=gc-storage-profile
AllowVolumeExpansion:  True
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>


Name:                  gc-storage-profile-latebinding
IsDefaultClass:        No
Annotations:           <none>
Provisioner:           csi.vsphere.vmware.com
Parameters:            svStorageClass=gc-storage-profile
AllowVolumeExpansion:  True
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     WaitForFirstConsumer
Events:                <none>