Esta página explica como instalar um controlador de armazenamento da interface de armazenamento de contentores (CSI) em clusters padrão do Google Kubernetes Engine (GKE). Esta página não se aplica a clusters do GKE Autopilot, que usam automaticamente o controlador CSI de disco persistente do Compute Engine.
Se estiver a usar o controlador CSI de disco persistente do Compute Engine no seu cluster Standard, recomendamos que implemente automaticamente o controlador para reduzir os custos gerais de gestão.
Vista geral
CSI é uma API de norma aberta que permite ao Kubernetes expor sistemas de armazenamento arbitrários a cargas de trabalho contentorizadas. Os volumes do Kubernetes são geridos por controladores de armazenamento específicos do fornecedor, que foram historicamente compilados em ficheiros binários do Kubernetes. Anteriormente, não podia usar um controlador de armazenamento que não estivesse incluído no Kubernetes. A instalação de um controlador CSI adiciona suporte para um sistema de armazenamento que não é suportado nativamente pelo Kubernetes. Além disso, o CSI permite a utilização de funcionalidades de armazenamento modernas, como instantâneos e redimensionamento.
Instalar um controlador CSI de um fornecedor
Outros fornecedores de armazenamento desenvolvem os seus próprios controladores CSI e são responsáveis por fornecer instruções de instalação. Em casos simples, a instalação pode envolver apenas a implementação de manifestos nos seus clusters. Consulte a lista de controladores CSI na documentação CSI.
Validar a instalação de um controlador
Depois de instalar um controlador CSI, pode validar a instalação executando um dos seguintes comandos, consoante a versão do GKE do seu cluster:
1.14+
kubectl get csinodes \ -o jsonpath='{range .items[*]} {.metadata.name}{": "} {range .spec.drivers[*]} {.name}{"\n"} {end}{end}'
1.13.x
kubectl get nodes \ -o jsonpath='{.items[*].metadata.annotations.csi\.volume\.kubernetes\.io\/nodeid}'
Usar um controlador CSI
Para usar um controlador CSI:
Crie um StorageClass do Kubernetes que faça referência ao controlador no respetivo campo
provisioner
, se não for criado um StorageClass para si como parte da instalação do controlador. Alguns controladores CSI implementam uma StorageClass quando os instala.Para aprovisionar armazenamento, pode:
- Faça referência à StorageClass na especificação
volumeClaimTemplates
para um objeto StatefulSet. - Defini-la como a StorageClass predefinida do cluster.
- Faça referência à StorageClass na especificação
Considerações para StorageClasses suportadas por um controlador CSI
Quando cria uma StorageClass, considere o seguinte:
- A documentação do controlador CSI deve incluir os parâmetros específicos do controlador que fornece à sua StorageClass, incluindo o nome do aprovisionador.
- Deve dar o nome StorageClass de acordo com as respetivas propriedades e não de acordo com o nome do controlador ou do dispositivo específico subjacente. A atribuição de nomes à StorageClass com base nas respetivas propriedades permite-lhe criar StorageClasses com o mesmo nome em vários clusters e ambientes, e permite que as suas aplicações obtenham armazenamento com as mesmas propriedades em todos os clusters.
Exemplo: referencie StorageClass num StatefulSet
O exemplo seguinte modela como definir um controlador CSI numa StorageClass e, em seguida, referenciar a StorageClass numa carga de trabalho StatefulSet. O exemplo pressupõe que o controlador já foi instalado no cluster.
Segue-se um StorageClass simples denominado premium-rwo
que usa um controlador CSI fictício, csi.example.com
, como provisionador:
# fast-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: premium-rwo
provisioner: csi.example.com # CSI driver
parameters: # You provide vendor-specific parameters to this specification
type: example-parameter # Be sure to follow the vendor's instructions
datastore: my-datastore
reclaimPolicy: Retain
allowVolumeExpansion: true
Referencia a StorageClass na especificação de um StatefulSet.volumeClaimTemplates
Quando faz referência a uma StorageClass na especificação de um StatefulSet, o Kubernetes fornece armazenamento estável através de PersistentVolumes.volumeClaimTemplates
O Kubernetes chama o aprovisionador definido na StorageClass para criar um novo volume de armazenamento. Neste caso, o Kubernetes chama o fornecedor fictício csi.example.com
que, por sua vez, chama a API do fornecedor para criar um volume. Depois de o volume ser aprovisionado, o Kubernetes cria automaticamente um PersistentVolume para representar o armazenamento.
Segue-se um StatefulSet simples que faz referência à StorageClass:
# statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.k8s.io/nginx-slim:0.8
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates: # This is the specification in which you reference the StorageClass
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
storageClassName: premium-rwo # This field references the existing StorageClass
O que se segue?
- Saiba mais sobre os conceitos de armazenamento do GKE.