GKE용 Filestore Multishares로 스토리지 최적화


이 가이드에서는 Google Kubernetes Engine용 Filestore Multishares를 GKE Filestore CSI 드라이버와 함께 사용하는 방법을 보여줍니다.

시작하기 전에

  1. 시작하기 전에 Filestore를 사용하는 데 필요한 설정 단계를 완료하세요.

  2. GKE Filestore CSI 드라이버 버전 1.23 이상을 사용 설정합니다.

    • 드라이버 버전 1.23~1.26은 인스턴스당 최대 10개의 공유를 지원합니다.

    • 드라이버 버전 1.27 이상은 인스턴스당 최대 80개의 공유를 지원합니다.

    최신 GKE Filestore CSI 드라이버 요구사항은 Filestore CSI 드라이버로 Filestore 인스턴스에 액세스를 참조하세요.

여러 애플리케이션에서 Filestore Multishares 사용

이 섹션에서는 각각 Filestore Multishares StorageClass를 사용하여 2개의 애플리케이션(DeploymentStatefulset)을 배포하는 방법을 보여줍니다. 또한 GKE가 동일한 기본 Filestore 엔터프라이즈 인스턴스의 모든 볼륨을 빈 패킹(애플리케이션을 GKE 노드에 효율적으로 패키징하는 프로세스)하는 방법도 보여줍니다.

  1. GKE에서 제공하는 StorageClass인 enterprise-multishare-rwx를 사용하여 최대 10개의 공유를 지원하는 인스턴스를 만듭니다.

    • 최대 80개의 공유를 지원하는 인스턴스를 만들려면 커스텀 StorageClass를 만들어야 합니다. 이 가이드에서는 인스턴스당 공유 한도가 10개인 StorageClass를 사용합니다.

    GKE Filestore CSI 드라이버가 사용 설정되면 사용자는 다음 구성으로 GKE 제공 Multishares StorageClass enterprise-multishare-rwx에 액세스할 수 있습니다. 이 StorageClass를 참조하여, GKE 워크로드 수요에는 다음이 필요하므로 GKE Filestore CSI 드라이버는 동적 볼륨 프로비저닝을 사용하여 새 영구 볼륨 클레임(PVC)에 영구 볼륨(PV)을 자동으로 만듭니다.

    kubectl describe sc enterprise-multishare-rwx
    Name:                  enterprise-multishare-rwx
    IsDefaultClass:        No
    Annotations:           components.gke.io/component-name=filestorecsi,components.gke.io/component-version=0.7.2,components.gke.io/layer=addon
    Provisioner:           filestore.csi.storage.gke.io
    Parameters:            instance-storageclass-label=enterprise-multishare-rwx,multishare=true,tier=enterprise
    AllowVolumeExpansion:  True
    MountOptions:          <none>
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                <none>
    

커스텀 StorageClass 만들기

Filestore 인스턴스당 최신 용량 한도를 최대 80개 공유까지 활용하려면 다음 템플릿을 기반으로 커스텀 StorageClass를 만듭니다.

  apiVersion: storage.k8s.io/v1
  kind: StorageClass
  metadata:
    name: csi-filestore-multishare-128
  provisioner: filestore.csi.storage.gke.io
  parameters:
    tier: enterprise
    multishare: "true"
    max-volume-size: "128Gi"
    network: default
  allowVolumeExpansion: true

StorageClass 이름을 변경할 때는 다음 요구사항을 고려하세요.

  • StorageClass 이름은 유효한 DNS 하위 도메인 이름이어야 합니다.

  • Multishares StorageClass 이름은 인스턴스 라벨로도 사용되며 라벨 이름 지정 가이드라인을 따라야 합니다.

  • 애플리케이션에 즉각적인 볼륨 프로비저닝이 필요한 경우 Immediate 볼륨 바인딩 모드를 포함합니다.

    volumeBindingMode: Immediate

    예를 들어 볼륨 프로비저닝이 GKE 클러스터에서 포드 생성에 따라 종속되도록 하지 않으려면 이 사양을 사용합니다.

  • 드라이버 버전 1.27부터 인스턴스당 10개가 넘는 공유를 할당하려는 경우 max-volume-size 매개변수를 포함하고 첫 번째 열에서 허용되는 값 중 하나를 할당합니다.

    최대 볼륨 크기(공유 크기) 인스턴스당 최대 공유 수
    128GiB 80
    256GiB 40
    512GiB 20
    1024GiB 10

    예를 들어 키 값 쌍 max-volume-size: "128Gi"를 추가하면 StorageClass가 최대 80개 공유(각각 10GiB~128GiB 크기)를 10TiB 엔터프라이즈 등급 인스턴스에 매핑합니다.

    • 이 기능은 GKE Filestore CSI 드라이버 버전 1.23부터 1.26까지로 생성된 Filestore 인스턴스와 하위 호환성을 갖습니다.

    • 기존 인스턴스는 확장 가능한 최소 공유 크기가 10GiB인 새 PVC 또는 공유를 만들 수 있습니다.

    • GKE Filestore CSI 드라이버 버전 1.27 이상은 기존 엔터프라이즈 인스턴스를 인식하고 1024GiB(1TiB)의 기본 최대 공유 크기를 할당합니다. 따라서 기존 인스턴스는 인스턴스당 10개 공유라는 최대 공유 수로 제한됩니다.

    자세한 내용은 GKE용 Filestore 다중 공유를 참조하세요.

  1. 단일 PVC를 사용하여 여러 개의 포드 복제본이 있는 Deployment를 만듭니다.

    다음과 비슷한 YAML 구성 파일을 만드세요.

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: test-pvc-fs
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: enterprise-multishare-rwx
      resources:
        requests:
          storage: 100Gi
    
    EOF
    
  2. 포드 복제본을 확인합니다.

    a. 명령줄에서 다음 명령어를 실행하여 PVC 상태를 확인합니다.

    kubectl get pvc
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs   Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx  35m
    

    b. 명령줄에서 다음 명령어를 실행하여 포드 상태를 확인합니다.

    kubectl get pod
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-csdbd   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-rgx82   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-zjl27   1/1     Running   0          35m
    
  3. 복제본을 확장합니다.

    a. 명령줄에서 다음 명령어를 실행하여 Deployment를 수정합니다.

    kubectl edit deployment web-server-multishare
    

    b. 파일이 명령줄에서 열립니다. spec.replicas 필드를 찾고 값을 10로 업데이트합니다.

    c. 명령줄에서 다음 명령어를 실행하여 적용된 변경사항을 확인하세요.

    kubectl get pod
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-5ctkf   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-8dwmw   1/1     Running   0          2s
    web-server-multishare-76c9ffb4b5-csdbd   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-lndcq   1/1     Running   0          2s
    web-server-multishare-76c9ffb4b5-rgx82   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-vtd6p   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-xm49s   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-zjl27   1/1     Running   0          36m
    

    10개의 포드가 실행됩니다.

    d. 명령줄에서 다음 명령어를 실행합니다.

    kubectl get deployment
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    web-server-multishare   10/10   10           10          36m
    

    e. 명령줄에서 다음 명령어를 실행하여 PVC 바인딩 상태를 확인합니다.

    kubectl get pvc
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs   Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx  37m
    

    f. 명령줄에서 다음 명령어를 실행하여 Deployment를 수정합니다.

    kubectl edit deployment web-server-multishare
    

    g. 파일이 명령줄에서 열립니다. spec.replicas 필드를 찾고 값을 2로 업데이트합니다.

    h. 명령줄에서 다음 명령어를 실행하여 적용된 변경사항을 확인하세요.

    kubectl get pod
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          38m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          38m
    
  4. Statefulset를 배포합니다.

    기본 Filestore 인스턴스를 공유하는 두 번째 애플리케이션을 배포합니다.

    200GiB의 공간을 프로비저닝하고 첫 번째 애플리케이션과 동일한 기본 Filestore 인스턴스를 사용하는지 확인하면 됩니다.

    그런 다음 총 900GiB의 복제본 9개(100GiB를 사용하는 복제본 9개)로 애플리케이션을 확장하고 GKE가 인스턴스를 공유하여 동일한 Filestore 인스턴스를 사용하는지 확인합니다.

    다음과 비슷한 YAML 구성 파일을 만드세요.

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      serviceName: "nginx"
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: registry.k8s.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: test-pvc-multishare
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: test-pvc-multishare
        spec:
          accessModes: [ "ReadWriteMany" ]
          storageClassName: enterprise-multishare-rwx
          resources:
            requests:
              storage: 100Gi
    
    EOF
    
    
  5. Statefulset 복제본 및 볼륨을 확인합니다.

    명령줄에서 다음 명령어를 실행합니다.

    kubectl get pod
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-0                                    1/1     Running   0          4m48s
    web-1                                    1/1     Running   0          3m32s
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          57m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          57m
    

    처음 두 포드는 Statefulset와 연결되어 있습니다. 마지막 두 포드는 Deployment와 연결됩니다.

    명령줄에서 다음 명령어를 실행합니다.

    kubectl get statefulset
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME   READY   AGE
    web    2/2     2m8s
    

    명령줄에서 다음 명령어를 실행합니다.

    kubectl get pvc
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs                 Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx   54m
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   100Gi      RWX            enterprise-multishare-rwx   114s
    test-pvc-multishare-web-1   Bound    pvc-8b37cd6e-d764-4d38-80d7-d74228536cfe   100Gi      RWX            enterprise-multishare-rwx   38s
    

    PVC test-pvc-fs는 Deployment web-server-multishare와 연결됩니다.

    PVC test-pvc-multishare-web-0test-pvc-multishare-web-1은 Statefulset와 연결됩니다.

  6. Statefulset 복제본을 확장합니다.

    복제본 수를 9개로 늘립니다. 개수가 증가함에 따라 해당하는 PVC가 생성됩니다.

    a. 명령줄에서 다음 명령어를 실행합니다.

    kubectl  edit statefulset web
    

    b. 파일이 명령줄에서 열립니다. spec.replicas 필드를 찾고 값을 9로 업데이트합니다.

    c. 명령줄에서 다음 명령어를 실행하여 적용된 변경사항을 확인하세요.

    kubectl get statefulset
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME   READY   AGE
    web    9/9     13m
    

    d. 명령줄에서 다음 명령어를 실행합니다.

    kubectl get deployment
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    web-server-multishare   2/2     2            2           65m
    

    e. 명령줄에서 다음 명령어를 실행합니다.

    kubectl get pvc
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs                 Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx   65m
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   100Gi      RWX            enterprise-multishare-rwx   13m
    test-pvc-multishare-web-1   Bound    pvc-8b37cd6e-d764-4d38-80d7-d74228536cfe   100Gi      RWX            enterprise-multishare-rwx   12m
    test-pvc-multishare-web-2   Bound    pvc-3fcbd132-939f-4364-807a-7c8ac6a3e64e   100Gi      RWX            enterprise-multishare-rwx   5m12s
    test-pvc-multishare-web-3   Bound    pvc-5894afa5-2502-4ee7-9d5c-b7378cb85479   100Gi      RWX            enterprise-multishare-rwx   4m57s
    test-pvc-multishare-web-4   Bound    pvc-ebbe452b-bc8f-4624-a830-a2094cce0d67   100Gi      RWX            enterprise-multishare-rwx   4m36s
    test-pvc-multishare-web-5   Bound    pvc-5a73a698-d174-44cb-a3a1-e767966c3417   100Gi      RWX            enterprise-multishare-rwx   4m20s
    test-pvc-multishare-web-6   Bound    pvc-102da6a9-2ca6-4f9e-9896-8fe14709db7a   100Gi      RWX            enterprise-multishare-rwx   3m55s
    test-pvc-multishare-web-7   Bound    pvc-160e81cd-c5bf-4ae6-966e-518e8249e02d   100Gi      RWX            enterprise-multishare-rwx   3m38s
    test-pvc-multishare-web-8   Bound    pvc-9b52d773-2e9a-40de-881c-dc06945ba3d7   100Gi      RWX            enterprise-multishare-rwx   118s
    
  7. Filestore 인스턴스 상태를 확인합니다.

    이제 2개의 복제본 포드가 있는 Deployment와 9개의 복제본 포드가 있는 Statefulset, 각각 100GiB의 총 10개의 PVC가 준비되었습니다. 모든 볼륨은 단일 Filestore Multishares 인스턴스로 패키징됩니다.

    a. 명령줄에서 다음 instances list 명령어를 실행합니다.

    gcloud beta filestore instances list --project=YOUR_PROJECT_ID --region=REGION
    

    각 항목의 의미는 다음과 같습니다.

    • YOUR_PROJECT_ID는 사용 중인 프로젝트의 이름입니다. 예를 들면 my-project입니다.

    • REGION은 사용 중인 리전의 이름입니다. 예를 들면 us-central1입니다.

    다음과 비슷한 응답이 표시될 것입니다.

    INSTANCE_NAME                            LOCATION     TIER        CAPACITY_GB  FILE_SHARE_NAME  IP_ADDRESS   STATE  CREATE_TIME
    fs-a767cef8-738e-4c8e-b70b-09cbb872d016  us-central1  ENTERPRISE  1024         N/A              10.192.53.2  READY  2022-06-21T21:15:30
    

    b. 명령줄에서 다음 instances describe 명령어를 실행합니다.

    gcloud filestore instances describe fs-a767cef8-738e-4c8e-b70b-09cbb872d016 --project=YOUR_PROJECT_ID --region=REGION
    capacityGb: '1024'
    capacityStepSizeGb: '256'
    createTime: '2022-06-21T21:15:30.464237089Z'
    labels:
      storage_gke_io_created-by: filestore_csi_storage_gke_io
      storage_gke_io_storage-class-id: enterprise-multishare-rwx
    maxCapacityGb: '10240'
    maxShareCount: '10'
    multiShareEnabled: true
    name: projects/YOUR_PROJECT_ID/locations/REGION/instances/fs-a767cef8-738e-4c8e-b70b-09cbb872d016
    networks:
    - connectMode: DIRECT_PEERING
      ipAddresses:
      - 10.192.53.2
      modes:
      - MODE_IPV4
      network: csi-filestore-test-network
      reservedIpRange: 10.192.53.0/26
    state: READY
    tier: ENTERPRISE
    
    

    각 항목의 의미는 다음과 같습니다.

    • YOUR_PROJECT_ID는 사용 중인 프로젝트의 이름입니다. 예를 들면 my-project입니다.

    • REGION은 사용 중인 리전의 이름입니다. 예를 들면 us-central1입니다.

PVC를 확장하고 Filestore 인스턴스 확인

이 섹션에서는 기존 PVC를 확장하고 Filestore 인스턴스 크기를 확인하는 방법을 보여줍니다.

  1. PVC를 확장합니다.

    Filestore 다중 공유 인스턴스의 공유로 지원되는 PVC는 max-volume-size 매개변수에 지정된 최대 크기로 증가할 수 있습니다. 이를 확인하려면 포드가 Statefulset를 사용하는 동안 Statefulset와 연결된 볼륨 중 하나를 확장하세요.

    명령줄에서 다음 명령어를 실행하여 복제본 0의 현재 PVC 크기를 확인합니다.

    kubectl get pvc test-pvc-multishare-web-0 -o json
    {
        "apiVersion": "v1",
        "kind": "PersistentVolumeClaim",
        "metadata": {
            "annotations": {
                "pv.kubernetes.io/bind-completed": "yes",
                "pv.kubernetes.io/bound-by-controller": "yes",
                "volume.beta.kubernetes.io/storage-provisioner": "filestore.csi.storage.gke.io",
                "volume.kubernetes.io/storage-provisioner": "filestore.csi.storage.gke.io"
            },
            "creationTimestamp": "2022-06-21T22:07:42Z",
            "finalizers": [
                "kubernetes.io/pvc-protection"
            ],
            "labels": {
                "app": "nginx"
            },
            "name": "test-pvc-multishare-web-0",
            "namespace": "default",
            "resourceVersion": "48395",
            "uid": "7aa21b5a-5343-4547-b7d7-414c16af15a7"
        },
        "spec": {
            "accessModes": [
                "ReadWriteMany"
            ],
            "resources": {
                "requests": {
                    "storage": "100Gi"
                }
            },
            "storageClassName": "enterprise-multishare-rwx",
            "volumeMode": "Filesystem",
            "volumeName": "pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7"
        },
        "status": {
            "accessModes": [
                "ReadWriteMany"
            ],
            "capacity": {
                "storage": "100Gi"
            },
            "phase": "Bound"
        }
    }
    
    
  2. 명령줄에서 다음 명령어를 실행하여 크기를 500GiB로 늘립니다.

    kubectl edit pvc test-pvc-multishare-web-0
    
  3. 파일이 명령줄에서 열립니다. spec.resources.requests.storage 필드를 찾고 값을 500Gi로 업데이트합니다.

  4. 명령줄에서 다음 명령어를 실행하여 적용된 변경사항을 확인하세요.

    kubectl get pvc test-pvc-multishare-web-0
    

    다음과 비슷한 응답이 표시될 것입니다.

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   500Gi      RWX            enterprise-multishare-rwx   28m
    

    Filestore CSI 드라이버가 먼저 기본 Filestore 인스턴스를 확장한 다음 PVC를 통해 공유를 확장하여 요청을 수락했습니다.

    특히 Filestore CSI 드라이버는 새 공유 크기 500Gi를 수용할 수 있도록 인스턴스를 1536Gi로 자동 확장했습니다.

  5. 명령줄에서 다음 instances describe 명령어를 실행하여 Filestore 인스턴스 용량을 확인합니다.

    gcloud filestore instances describe fs-a767cef8-738e-4c8e-b70b-09cbb872d016 --project=YOUR_PROJECT_ID --region=REGION
    capacityGb: '1536'
    capacityStepSizeGb: '256'
    createTime: '2022-06-21T21:15:30.464237089Z'
    labels:
      storage_gke_io_created-by: filestore_csi_storage_gke_io
      storage_gke_io_storage-class-id: enterprise-multishare-rwx
    maxCapacityGb: '10240'
    maxShareCount: '10'
    multiShareEnabled: true
    name: projects/YOUR_PROJECT_ID/locations/us-central1/instances/fs-a767cef8-738e-4c8e-b70b-09cbb872d016
    networks:
    - connectMode: DIRECT_PEERING
      ipAddresses:
      - 10.192.53.2
      modes:
      - MODE_IPV4
      network: csi-filestore-test-network
      reservedIpRange: 10.192.53.0/26
    state: READY
    tier: ENTERPRISE
    

    각 항목의 의미는 다음과 같습니다.

    • YOUR_PROJECT_ID는 사용 중인 프로젝트의 이름입니다. 예를 들면 my-project입니다.

    • REGION은 사용 중인 리전의 이름입니다. 예를 들면 us-central1입니다.

공유 VPC의 동적 프로비저닝

GKE용 Filestore CSI 드라이버는 공유 VPC의 서비스 프로젝트에서 볼륨의 동적 프로비저닝을 지원합니다. 다음 섹션에서는 Filestore CSI 드라이버를 사용하여 공유 VPC 네트워크의 서비스 프로젝트에 있는 Filestore Multishares 인스턴스에서 볼륨을 동적으로 프로비저닝하는 방법을 보여줍니다.

  1. 공유 VPC 네트워크 및 비공개 서비스 액세스를 위한 설정 단계를 완료하세요.

  2. StorageClass를 만들어 공유 VPC의 Filestore Multishares 인스턴스에서 지원하는 볼륨을 동적으로 프로비저닝합니다.

    다음 명령어를 실행하여 StorageClass 리소스를 배포합니다.

    cat <<EOF | kubectl apply -f -
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-multishare-sharedvpc
    provisioner: filestore.csi.storage.gke.io
    parameters:
      network: "projects/HOST_PROJECT_ID/global/networks/SHARED_VPC_NAME"
      connect-mode: PRIVATE_SERVICE_ACCESS
      tier: enterprise
      multishare: "true"
    allowVolumeExpansion: true
    
    EOF
    

    각 항목의 의미는 다음과 같습니다.

    • HOST_PROJECT_ID는 공유 VPC 네트워크 호스트 프로젝트의 ID 또는 이름입니다. 예를 들면 my-host-project입니다.

    • SHARED_VPC_NAME공유 VPC 네트워크 이름입니다. 예를 들면 my-shared-vpc입니다.

    예약된 IP 주소 범위 내에서 리소스를 배포하려면 명령어에 사용된 매개변수에 다음 줄을 추가합니다.

    reserved-ip-range: RESERVED_NAME
    

    여기서 RESERVED_NAME은 Filestore 인스턴스를 프로비저닝할 수 있는 예약된 IP 주소 범위의 이름입니다. 예를 들면 filestore-reserved-ip-range입니다. 예약된 IP 범위가 지정된 경우 이 범위는 직접 CIDR 값이 아닌 이름이 지정된 IP 주소 범위여야 합니다.

    자세한 내용은 IP 주소 범위 할당 또는 예약된 IP 주소 범위 구성을 참조하세요. Google Cloud 콘솔을 사용하여 예약된 이름을 만드는 방법의 예시는 IP 할당 만들기를 참조하세요.

  3. 배포를 만듭니다.

    다음 명령어를 실행하여 Deployment 리소스를 만듭니다.

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: test-pvc-fs-sharedvpc
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs-sharedvpc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-multishare-sharedvpc
      resources:
        requests:
          storage: 100Gi
    
    EOF
    

CMEK가 사용 설정된 Filestore 인스턴스

CMEK가 사용 설정된 Filestore Multishares 인스턴스에서 호스팅되는 GKE 볼륨을 만들 수 있습니다. 이 섹션에서는 Filestore 인스턴스용 고객 관리 암호화 키(CMEK)를 설정하는 방법을 설명합니다.

고객 관리 키 세부정보는 StorageClass에서 제공될 수 있습니다. 이 StorageClass를 참조하는 Filestore CSI 드라이버로 동적으로 생성된 모든 인스턴스에는 CMEK가 사용 설정됩니다.

  1. CMEK가 사용 설정된 StorageClass를 만드세요.

    a. 다음 명령어를 실행합니다.

    cat <<EOF | kubectl apply -f -
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-multishare-cmek
    provisioner: filestore.csi.storage.gke.io
    parameters:
      tier: enterprise
      multishare: "true"
      instance-encryption-kms-key: projects/KEY_PROJECT_ID/locations/REGION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    
    allowVolumeExpansion: true
    
    EOF
    

    각 항목의 의미는 다음과 같습니다.

    • KEY_PROJECT_ID는 키가 있는 프로젝트의 이름입니다. 예를 들면 my-key-project입니다.

    • REGION은 사용 중인 리전의 이름입니다. 예를 들면 us-central1입니다.

    • RING_NAME은 키링 이름입니다. 예를 들면 my-key-ring-name입니다.

    • KEY_NAME은 키 이름입니다. 예를 들면 my-key-name입니다.

  2. 배포를 만듭니다.

    b. 다음 명령어를 실행하여 Deployment 리소스를 만듭니다.

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: test-pvc-fs-cmek
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs-cmek
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-multishare-cmek
      resources:
        requests:
          storage: 100Gi
    
    EOF
    

PVC를 Filestore 인스턴스에 매핑

이 섹션에서는 PVC를 Filestore 인스턴스에 매핑하는 방법을 설명합니다.

Filestore Multishares 인스턴스를 사용하면 각 PVC가 Filestore CSI 드라이버에 의해 Filestore 인스턴스에서 호스팅됩니다. 볼륨을 호스팅하는 기본 Filestore 인스턴스와 Kubernetes 볼륨을 나타내는 공유의 세부정보는 영구 볼륨 사양의 volumeHandle 필드에 캡처됩니다. 볼륨 처리 형식은 다음과 같습니다.

modeMultishare/<storageclass-prefix>/<project>/<region>/<filestore-instance-name>/<filestore-share-name>

다음 kubectl 명령어를 사용하면 PVC, PV, Filestore 인스턴스, Filestore 공유 사이의 매핑을 빠르게 확인할 수 있습니다.

명령줄에서 다음 명령어를 실행합니다.

kubectl get pv -o jsonpath='{range .items[*]}{"pv="}{.metadata.name}{",pvc="}{.spec.claimRef.name}{",volumeHandle="}{.spec.csi.volumeHandle}{"\n"}{end}'

다음과 비슷한 응답이 표시될 것입니다.

pv=pvc-67ad9abd-f25e-4130-b7ca-64d28bd29525,pvc=test-pvc-multishare,volumeHandle=modeMultishare/csi-filestore-multishare-sharedvpc/YOUR_PROJECT_ID/us-central1/fs-2109f680-3f04-4ada-b4bc-2a1c7fc47b88/pvc_67ad9abd_f25e_4130_b7ca_64d28bd29525

pv=pvc-c80f4de0-9916-4957-b8ae-b21206650ac0,pvc=test-pvc-fs-sharedvpc,volumeHandle=modeMultishare/csi-filestore-multishare-sharedvpc/YOUR_PROJECT_ID/us-central1/fs-2109f680-3f04-4ada-b4bc-2a1c7fc47b88/pvc_c80f4de0_9916_4957_b8ae_b21206650ac0

각 항목의 의미는 다음과 같습니다.

  • YOUR_PROJECT_ID는 사용 중인 프로젝트의 이름입니다. 예를 들면 my-project입니다.

클러스터에서 2개의 영구 볼륨은 단일 Filestore 인스턴스에 호스팅됩니다.

다음 단계