Nesta página, você verá um exemplo de como usar o driver CSI do SMB para o Kubernetes de código aberto para acessar um volume de SMB do NetApp Cloud Volumes Service em um cluster do Google Kubernetes Engine (GKE) com nós do Windows Server.
Visão geral
O Protocolo do bloqueio de mensagem do servidor (SMB, na sigla em inglês) é um protocolo de compartilhamento de arquivos por rede usado para o Microsoft Windows. Para usar o SMB com clusters do GKE usando pools de nós do Windows Server, use o driver CSI de SMB para o Kubernetes de código aberto.
Tarefas
Nas seções a seguir, explicamos um exemplo de como acessar um volume de SMB do NetApp Cloud Volumes Service em um cluster do GKE com nós do Windows Server. Nele, é usado o driver CSI de SMB para o Kubernetes de código aberto.
Implantar o Active Directory
Esta tarefa cria um Active Directory. Se você já tiver um Active Directory para usar, pule esta tarefa.
Para implantar um Active Directory autogerenciado, as instruções a seguir usam uma solução do Google Cloud Marketplace para criar um novo domínio do Active Directory, com dois controladores de domínio do Active Directory.
- No console do Google Cloud, acesse a página do Cloud Marketplace do Microsoft Active Directory.
- Clique em Iniciar.
- Conclua a configuração da implantação. Verifique se o servidor DNS está na mesma região que o volume SMB do NetApp Cloud Volumes Service. Verifique a disponibilidade da região.
- Selecione Implantar.
Se você quiser usar o Serviço gerenciado para o Microsoft Active Directory (Microsoft AD gerenciado), conclua as seguintes etapas:
- Crie um domínio do Managed Microsoft AD.
- Configure o peering de domínio entre o domínio e a rede do NetApp Cloud Volumes Service.
- Para executar as tarefas relacionadas ao Active Directory, conecte-se ao domínio.
Criar uma zona de encaminhamento de DNS particular
Crie uma zona de encaminhamento de DNS particular que encaminha consultas DNS para os controladores de domínio do Active Directory.
Atualizar a regra de firewall
Para permitir que as consultas do Cloud DNS alcancem sua conexão do AD, adicione 35.199.192.0/19
como um intervalo de IP de origem ao
Filtro de origem
na regra de firewall do AD.
Para mais informações, consulte Considerações de segurança para acesso do SMB do Cloud Volumes Service.
Criar uma conexão do Active Directory com o Cloud Volumes Service
Para instruções, consulte Como criar uma conexão do AD.
Criar um volume SMB no Cloud Volumes Service
Para mais instruções, consulte Como criar um volume SMB.
Use o destino de ativação do novo volume SMB como o valor source
no
PersistentVolume ou StorageClass,
especificado no seguinte formato:
"//SMB_SERVER_NAME/SHARE_NAME"
Os destinos e instruções de ativação estão disponíveis na página de listagem do Cloud Volumes Service e nas páginas de detalhes de volume individuais.
Criar um cluster com nós mesclados ao domínio do AD
Siga as instruções em Configurar os nós do Windows Server para participar automaticamente de um domínio do Active Directory.
Instalar o driver CSI de SMB
- Instale o driver CSI de código aberto SMB para o Kubernetes.
Para acessar um volume SMB de um pod, crie um secret que codifique o nome de usuário e a senha.
kubectl create secret generic SECRET_NAME \ --from-literal username="USERNAME" \ --from-literal password="PASSWORD"
Substitua:
SECRET_NAME
: o nome do secret.USERNAME
: o nome de usuário. O nome de usuário codificado no secret deve incluir um nome de domínio e ter o seguinte formato:domain\$username
. Se o compartilhamento SMB não fizer parte de nenhum domínio, o domínio pode ser qualquer string.PASSWORD
: a senha do usuário.
Acessar o volume SMB
Para acessar o volume SMB, escolha uma das seguintes opções:
Usar um StorageClass para acessar o volume SMB
Para acessar o volume SMB por um StorageClass
, execute as seguintes tarefas:
Crie um
StorageClass
. Veja um exemplo de arquivo de manifesto chamadosc-smb.yaml
:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: smb provisioner: smb.csi.k8s.io parameters: source: "//SMB_SERVER_NAME/SHARE_NAME" csi.storage.k8s.io/node-stage-secret-name: "SECRET_NAME" csi.storage.k8s.io/node-stage-secret-namespace: "default" createSubDir: "false" # optional: create a sub dir for new volume reclaimPolicy: Retain # only Retain is supported volumeBindingMode: Immediate mountOptions: - dir_mode=0777 - file_mode=0777 - uid=1001 - gid=1001
Neste exemplo, usamos o campo
mountOptions
, que é opcional para o Windows Server, mas faz com queStorageClass
funcione para Linux e Windows Server.Substitua:
SMB_SERVER_NAME
: o nome do host do servidor SMB, incluindo o domínio. Por exemplo, o nome do host para o caminho de ativação//adserver-faab.cvssmb.com/eager-hungry-skossi
éadserver-faab.cvssmb.com
.SHARE_NAME
: o nome do compartilhamento SMB. Por exemplo, o nome do compartilhamento para o caminho de ativação//adserver-faab.cvssmb.com/eager-hungry-skossi
éeager-hungry-skossi
. Só use compartilhamento raiz para compartilhamentos SMB. Para detalhes, consulte o problema conhecido relacionado.SECRET_NAME
: o nome do secret contém a credencial para acessar o volume SMB.
Crie o recurso
StorageClass
com base no arquivo de manifesto:kubectl create -f sc-smb.yaml
Implante um pod que consuma a
StorageClass
. Veja um exemplo de arquivo de manifesto chamadostatefulset-smb.yaml
. O pod implantado para esseStatefulSet
cria um arquivodata.txt
na unidade SMB ativada:apiVersion: v1 kind: Service metadata: name: busybox labels: app: busybox spec: ports: - port: 80 name: web clusterIP: None selector: app: busybox --- apiVersion: apps/v1 kind: StatefulSet metadata: name: statefulset-smb labels: app: busybox spec: serviceName: statefulset-smb replicas: 1 template: metadata: labels: app: busybox spec: nodeSelector: "kubernetes.io/os": windows containers: - name: statefulset-smb image: e2eteam/busybox:1.29 command: - "powershell.exe" - "-Command" - "while (1) { Add-Content -Encoding Ascii C:\\sc\\smb\\data.txt $(Get-Date -Format u); sleep 1 }" volumeMounts: - name: smb mountPath: "/sc/smb" tolerations: - key: "node.kubernetes.io/os" operator: "Exists" effect: "NoSchedule" updateStrategy: type: RollingUpdate selector: matchLabels: app: busybox volumeClaimTemplates: - metadata: name: smb annotations: volume.beta.kubernetes.io/storage-class: smb spec: accessModes: ["ReadWriteMany"] resources: requests: storage: 10Gi
Crie o recurso
StatefulSet
com base no arquivo de manifesto:kubectl create -f statefulset-smb.yaml
Usar um PersistentVolume e PersistentVolumeClaim para acessar o volume
Para acessar o volume SMB por um PersistentVolume
e
PersistentVolumeClaim
, execute as seguintes tarefas:
Crie um
PersistentVolume
. Veja um exemplo de arquivo de manifesto chamadopv-smb.yaml
:apiVersion: v1 kind: PersistentVolume metadata: name: pv-smb spec: capacity: storage: 100Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain mountOptions: - dir_mode=0777 - file_mode=0777 - vers=3.0 csi: driver: smb.csi.k8s.io readOnly: false volumeHandle: VOLUME_ID volumeAttributes: source: "//SMB_SERVER_NAME/SHARE_NAME" nodeStageSecretRef: name: SECRET_NAME namespace: default
Neste exemplo, usamos o campo
mountOptions
, que é opcional para o Windows Server, mas faz com quePersistentVolume
funcione para Linux e Windows Server.Substitua:
VOLUME_ID
: um ID exclusivo para o volume.SMB_SERVER_NAME
: o nome do host do servidor SMB, incluindo o domínio.SHARE_NAME
: o nome do compartilhamento SMB.SECRET_NAME
: o nome do secret que contém a credencial para acessar o volume SMB.
Crie um recurso
PersistentVolume
com base no arquivo de manifesto:kubectl create -f pv-smb.yaml
Crie um
PersistentVolumeClaim
. Veja um exemplo de arquivo de manifesto chamadopvc-smb.yaml
:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-smb spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi volumeName: pv-smb storageClassName: ""
Crie um recurso
PersistentVolumeClaim
com base no arquivo de manifesto:kubectl create -f pvc-smb.yaml
Implante um pod que consuma a
PersistentVolumeClaim
. Veja um exemplo de arquivo de manifesto chamadobusybox-smb.yaml
para uma implantação de pod que consomepvc-smb
. Esta implantação cria um arquivodata.txt
na unidade SMB ativada:apiVersion: apps/v1 kind: Deployment metadata: name: busybox-smb labels: app: busybox spec: replicas: 1 template: metadata: name: busybox labels: app: busybox spec: nodeSelector: "kubernetes.io/os": windows containers: - name: busybox image: e2eteam/busybox:1.29 command: - "powershell.exe" - "-Command" - "while (1) { Add-Content -Encoding Ascii C:\\pv\\pv-smb\\data.txt $(Get-Date -Format u); sleep 1 }" volumeMounts: - name: smb mountPath: "/pv/pv-smb" tolerations: - key: "node.kubernetes.io/os" operator: "Exists" effect: "NoSchedule" volumes: - name: smb persistentVolumeClaim: claimName: pvc-smb selector: matchLabels: app: busybox
Crie uma
Deployment
a partir do arquivo de manifesto:kubectl apply -f busybox-smb.yaml
Testar o acesso ao volume SMB
Para verificar se é possível acessar o arquivo data.txt
no volume SMB, execute uma
das seguintes tarefas:
Inicie uma sessão do PowerShell no contêiner e liste o arquivo
data.txt
:kubectl exec POD_NAME -- powershell.exe -c "ls PATH_TO_THE_FILE"
Abra a unidade SMB em outra VM para confirmar se o arquivo
data.txt
foi criado com sucesso no compartilhamento remoto.
Problemas conhecidos
Erro de montagem no Windows após a reinicialização
Problema: por exemplo, se \\smb-server\share\test1
já estiver ativado, talvez
você receba um erro ao ativar o volume \\smb-server\share\test2
após a
reinicialização do nó do Windows.
Motivo: o campo source
para StorageClass
e PersistentVolume
só deve usar o compartilhamento raiz de um servidor SMB em um cluster. Além disso, use
a propriedade volumeMounts.subPath
na implantação.
Solução alternativa: use apenas \\smb-server\share
como source
.
Para problemas mais conhecidos, consulte a página Problemas conhecidos do driver CSI de código aberto SMB para Kubernetes.
A seguir
- Saiba como implantar um aplicativo do Windows.
- Saiba mais sobre o NetApp Cloud Volumes Service.