Como usar o driver CSI de SMB para acessar o volume de SMB nos nós do Windows Server


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.

  1. No console do Google Cloud, acesse a página do Cloud Marketplace do Microsoft Active Directory.
  2. Clique em Iniciar.
  3. 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.
  4. Selecione Implantar.

Se você quiser usar o Serviço gerenciado para o Microsoft Active Directory (Microsoft AD gerenciado), conclua as seguintes etapas:

  1. Crie um domínio do Managed Microsoft AD.
  2. Configure o peering de domínio entre o domínio e a rede do NetApp Cloud Volumes Service.
  3. 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

  1. Instale o driver CSI de código aberto SMB para o Kubernetes.
  2. 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:

  1. Crie um StorageClass. Veja um exemplo de arquivo de manifesto chamado sc-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 que StorageClass 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.
  2. Crie o recurso StorageClass com base no arquivo de manifesto:

    kubectl create -f sc-smb.yaml
    
  3. Implante um pod que consuma a StorageClass. Veja um exemplo de arquivo de manifesto chamado statefulset-smb.yaml. O pod implantado para esse StatefulSet cria um arquivo data.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
    
  4. 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:

  1. Crie um PersistentVolume. Veja um exemplo de arquivo de manifesto chamado pv-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 que PersistentVolume 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.
  2. Crie um recurso PersistentVolume com base no arquivo de manifesto:

    kubectl create -f pv-smb.yaml
    
  3. Crie um PersistentVolumeClaim. Veja um exemplo de arquivo de manifesto chamado pvc-smb.yaml:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-smb
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      volumeName: pv-smb
      storageClassName: ""
    
  4. Crie um recurso PersistentVolumeClaim com base no arquivo de manifesto:

    kubectl create -f pvc-smb.yaml
    
  5. Implante um pod que consuma a PersistentVolumeClaim. Veja um exemplo de arquivo de manifesto chamado busybox-smb.yaml para uma implantação de pod que consome pvc-smb. Esta implantação cria um arquivo data.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
    
  6. 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