SMB CSI 드라이버를 사용하여 Windows Server 노드에서 SMB 볼륨에 액세스


이 페이지에서는 오픈소스 Kubernetes용 SMB CSI 드라이버를 사용하여 Windows 서버 노드가 포함된 Google Kubernetes Engine (GKE) 클러스터의 NetApp Cloud Volumes Service SMB 볼륨에 액세스하는 방법의 예시를 제공합니다.

개요

SMB(서버 메시지 차단) 프로토콜은 Microsoft Windows에 사용되는 네트워크 파일 공유 프로토콜입니다. Windows Server 노드 풀을 사용하는 GKE 클러스터에서 SMB를 사용하려면 오픈소스 Kubernetes용 SMB CSI 드라이버를 사용하면 됩니다.

Tasks

다음 섹션에서는 Windows Server 노드가 있는 GKE 클러스터에서 NetApp Cloud Volumes Service SMB 볼륨에 액세스하는 방법 예시를 살펴봅니다. 이 예시에서는 Kubernetes에 대해 오픈소스 SMB CSI 드라이버를 사용합니다.

Active Directory 배포

태스크를 수행하면 Active Directory가 생성됩니다. 사용할 Active Directory가 이미 있는 경우 이 태스크를 건너뛸 수 있습니다.

자체 관리형 Active Directory를 배포하려면 다음 안내를 따라 Google Cloud Marketplace 솔루션을 사용하여 두 개의 Active Directory 도메인 컨트롤러로 새로운 Active Directory 도메인을 만듭니다.

  1. Google Cloud Console에서 Microsoft Active Directory Cloud Marketplace 페이지로 이동합니다.
  2. 실행을 클릭합니다.
  3. 배포 구성을 완료합니다. DNS 서버가 NetApp Cloud Volumes Service SMB 볼륨과 동일한 리전에 있는지 확인합니다. 리전 가용성을 확인합니다.
  4. 배포를 클릭합니다.

대신 Microsoft Active Directory용 관리형 서비스(관리형 Microsoft AD)를 사용하려면 다음 단계를 완료하세요.

  1. 관리형 Microsoft AD 도메인 만들기.
  2. 도메인과 NetApp Cloud Volumes Service 네트워크 간에 도메인 피어링을 구성합니다.
  3. Active Directory 관련 태스크를 수행하려면 도메인에 연결합니다.

비공개 DNS 전달 영역 만들기

DNS 쿼리를 Active Directory 도메인 컨트롤러로 전달하는 비공개 DNS 전달 영역을 만듭니다.

방화벽 규칙 업데이트

Cloud DNS의 쿼리가 AD 연결에 도달하도록 허용하려면 AD의 방화벽 규칙에서 35.199.192.0/19를 소스 IP 범위로 소스 필터에 추가합니다.

자세한 내용은 Cloud Volumes Service의 SMB 액세스 관련 보안 고려사항을 참조하세요.

Cloud Volumes Service에 대한 Active Directory 연결 만들기

자세한 내용은 AD 연결 만들기를 참조하세요.

Cloud Volumes Service에서 SMB 볼륨 만들기

자세한 내용은 SMB 볼륨 만들기를 참조하세요.

새 SMB 볼륨의 마운트 대상을 다음 형식으로 지정된 PersistentVolume 또는 StorageClasssource 값으로 사용합니다.

"//SMB_SERVER_NAME/SHARE_NAME"

마운트 대상 및 안내는 Cloud Volumes Service 볼륨 목록 및 개별 볼륨 세부정보 페이지를 참조하세요.

노드가 AD 도메인에 조인된 클러스터 만들기

Active Directory 도메인에 자동으로 조인하도록 Windows Server 노드 구성의 안내를 따릅니다.

SMB CSI 드라이버 설치

  1. Kubernetes용 오픈소스 SMB CSI 드라이버를 설치합니다.
  2. 포드에서 SMB 볼륨에 액세스하려면 사용자 이름 및 비밀번호를 인코딩하는 보안 비밀을 만듭니다.

    kubectl create secret generic SECRET_NAME \
        --from-literal username="USERNAME" \
        --from-literal password="PASSWORD"
    

    다음을 바꿉니다.

    • SECRET_NAME: 보안 비밀의 이름입니다.
    • USERNAME: 사용자 이름입니다. 보안 비밀에 인코딩된 사용자 이름은 도메인 이름을 포함하며 domain\$username 형식을 갖습니다. SMB 공유가 도메인에 포함되지 않으면 도메인은 임의의 문자열일 수 있습니다.
    • PASSWORD: 사용자의 비밀번호입니다.

SMB 볼륨에 액세스

SMB 볼륨에 액세스하려면 다음 중 하나를 사용하도록 선택할 수 있습니다.

StorageClass를 사용하여 SMB 볼륨에 액세스

StorageClass를 통해 SMB 볼륨에 액세스하려면 다음 태스크를 수행합니다.

  1. StorageClass를 만듭니다. 다음은 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
    

    이 예시에서는 mountOptions 필드(Windows Server에서는 선택사항)를 사용하지만 StorageClass은 Linux 및 Windows Server에서 모두 작동합니다.

    다음을 바꿉니다.

    • SMB_SERVER_NAME: 도메인을 포함하는 SMB 서버의 호스트 이름입니다. 예를 들어 마운트 경로 //adserver-faab.cvssmb.com/eager-hungry-skossi의 호스트 이름은 adserver-faab.cvssmb.com입니다.
    • SHARE_NAME: SMB 공유의 이름입니다. 예를 들어 마운트 경로 //adserver-faab.cvssmb.com/eager-hungry-skossi의 공유 이름은 eager-hungry-skossi입니다. SMB 공유에만 루트 공유를 사용합니다. 자세한 내용은 관련된 알려진 문제를 참조하세요.
    • SECRET_NAME: 보안 비밀의 이름에는 SMB 볼륨에 액세스하기 위한 사용자 인증 정보가 포함되어 있습니다.
  2. 매니페스트 파일을 기반으로 StorageClass 리소스를 만듭니다.

    kubectl create -f sc-smb.yaml
    
  3. StorageClass를 소비하는 포드를 배포합니다. 다음은 statefulset-smb.yaml이라는 샘플 매니페스트 파일입니다. 이 StatefulSet에 배포된 포드는 마운트된 SMB 드라이브에 data.txt 파일을 만듭니다.

    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. 매니페스트 파일을 기반으로 StatefulSet 리소스를 만듭니다.

    kubectl create -f statefulset-smb.yaml
    

PersistentVolume 및 PersistentVolumeClaim을 사용하여 볼륨에 액세스

PersistentVolumePersistentVolumeClaim을 통해 SMB 볼륨에 액세스하려면 다음 태스크를 수행합니다.

  1. PersistentVolume을 만듭니다. 다음은 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
    

    이 예시에서는 mountOptions 필드(Windows Server에서는 선택사항)를 사용하지만 PersistentVolume은 Linux 및 Windows Server에서 모두 작동합니다.

    다음을 바꿉니다.

    • VOLUME_ID: 볼륨의 고유 ID입니다.
    • SMB_SERVER_NAME: 도메인을 포함하는 SMB 서버의 호스트 이름입니다.
    • SHARE_NAME: SMB 공유의 이름입니다.
    • SECRET_NAME: 보안 비밀의 이름에는 SMB 볼륨에 액세스하기 위한 사용자 인증 정보가 포함되어 있습니다.
  2. 매니페스트 파일을 기반으로 PersistentVolume 리소스를 만듭니다.

    kubectl create -f pv-smb.yaml
    
  3. PersistentVolumeClaim을 만듭니다. 다음은 pvc-smb.yaml이라는 샘플 매니페스트 파일입니다.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-smb
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      volumeName: pv-smb
      storageClassName: ""
    
  4. 매니페스트 파일을 기반으로 PersistentVolumeClaim 리소스를 만듭니다.

    kubectl create -f pvc-smb.yaml
    
  5. PersistentVolumeClaim를 소비하는 포드를 배포합니다. 다음은 pvc-smb를 사용하는 포드 배포를 위한 busybox-smb.yaml이라는 샘플 매니페스트 파일입니다. 이 배포는 마운트된 SMB 드라이브에 data.txt 파일을 만듭니다.

    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. 매니페스트 파일에서 Deployment를 만듭니다.

    kubectl apply -f  busybox-smb.yaml
    

SMB 볼륨에 대한 액세스 테스트

SMB 볼륨의 data.txt 파일에 액세스할 수 있는지 확인하려면 다음 태스크 중 하나를 수행합니다.

  • 컨테이너에서 powershell 세션을 시작하고 data.txt 파일을 나열합니다.

    kubectl exec POD_NAME -- powershell.exe -c "ls PATH_TO_THE_FILE"
    
  • 다른 VM에서 SMB 드라이브를 열어 data.txt 파일이 원격 공유에 성공적으로 생성되었는지 확인합니다.

알려진 문제

재부팅 후 Windows의 마운트 오류

문제: 예를 들어 \\smb-server\share\test1이 이미 마운트된 경우 Windows 노드가 재부팅된 후 \\smb-server\share\test2 볼륨을 마운트하려고 할 때 오류가 발생할 수 있습니다.

이유: StorageClassPersistentVolume 모두의 source 필드는 한 클러스터의 한 SMB 서버에 대해서만 루트 공유를 사용해야 합니다. 또한 배포에서 volumeMounts.subPath 속성을 사용해야 합니다.

해결 방법: \\smb-server\sharesource로 사용합니다.

알려진 문제를 보려면 Kubernetes용 오픈소스 SMB CSI 드라이버에 대한 알려진 문제 페이지를 참조하세요.

다음 단계