Skip to main content
이 제품의 최신 릴리즈를 사용할 수 있습니다.
본 한국어 번역은 사용자 편의를 위해 제공되는 기계 번역입니다. 영어 버전과 한국어 버전이 서로 어긋나는 경우에는 언제나 영어 버전이 우선합니다.

CSI 토폴로지 사용

Trident은 "CSI 토폴로지 기능"을 사용하여 Kubernetes 클러스터에 있는 노드에 선택적으로 볼륨을 생성하고 연결할 수 있습니다.

개요

CSI 토폴로지 기능을 사용하면 리전 및 가용 영역을 기반으로 볼륨 액세스를 노드 하위 집합으로 제한할 수 있습니다. 오늘날 클라우드 제공업체는 Kubernetes 관리자가 영역 기반 노드를 생성할 수 있도록 지원합니다. 노드는 리전 내의 서로 다른 가용 영역에 위치하거나 여러 리전에 걸쳐 위치할 수 있습니다. 다중 영역 아키텍처에서 워크로드에 대한 볼륨 프로비저닝을 용이하게 하기 위해 Trident는 CSI 토폴로지를 사용합니다.

팁 CSI 토폴로지 기능에 대해 자세히 알아보십시오 "여기".

Kubernetes는 두 가지 고유한 볼륨 바인딩 모드를 제공합니다.

  • `VolumeBindingMode`을 `Immediate`로 설정하면 Trident는 토폴로지를 고려하지 않고 볼륨을 생성합니다. 볼륨 바인딩 및 동적 프로비저닝은 PVC 생성 시 처리됩니다. 이는 기본 `VolumeBindingMode`이며 토폴로지 제약 조건을 적용하지 않는 클러스터에 적합합니다. 영구 볼륨은 요청하는 Pod의 스케줄링 요구 사항에 관계없이 생성됩니다.

  • `VolumeBindingMode`을 `WaitForFirstConsumer`로 설정하면 PVC에 대한 영구 볼륨의 생성 및 바인딩이 해당 PVC를 사용하는 파드가 스케줄링되고 생성될 때까지 지연됩니다. 이렇게 하면 토폴로지 요구 사항에 따라 적용되는 스케줄링 제약 조건을 충족하도록 볼륨이 생성됩니다.

참고 WaitForFirstConsumer 바인딩 모드는 토폴로지 레이블을 필요로 하지 않습니다. CSI 토폴로지 기능과 별개로 사용할 수 있습니다.
필요한 것

CSI 토폴로지를 사용하려면 다음이 필요합니다.

  • "지원되는 Kubernetes 버전"를 실행하는 Kubernetes 클러스터

    kubectl version
    Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:50:19Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}
    Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:41:49Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}
  • 클러스터의 노드에는 토폴로지 인식을 도입하는 레이블이 있어야 합니다(topology.kubernetes.io/regiontopology.kubernetes.io/zone). 이러한 레이블은 Trident가 토폴로지를 인식하도록 하려면 Trident를 설치하기 전에 클러스터의 노드에 있어야 합니다.

    kubectl get nodes -o=jsonpath='{range .items[*]}[{.metadata.name}, {.metadata.labels}]{"\n"}{end}' | grep --color "topology.kubernetes.io"
    [node1, {"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"node1","kubernetes.io/os":"linux","node-role.kubernetes.io/master":"","topology.kubernetes.io/region":"us-east1","topology.kubernetes.io/zone":"us-east1-a"}]
    [node2, {"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"node2","kubernetes.io/os":"linux","node-role.kubernetes.io/worker":"","topology.kubernetes.io/region":"us-east1","topology.kubernetes.io/zone":"us-east1-b"}]
    [node3, {"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"node3","kubernetes.io/os":"linux","node-role.kubernetes.io/worker":"","topology.kubernetes.io/region":"us-east1","topology.kubernetes.io/zone":"us-east1-c"}]

1단계: 토폴로지 인식 백엔드 생성

Trident 스토리지 백엔드는 가용성 영역을 기반으로 볼륨을 선택적으로 프로비저닝하도록 설계할 수 있습니다. 각 백엔드는 지원되는 영역 및 리전 목록을 나타내는 선택적 supportedTopologies 블록을 포함할 수 있습니다. 이러한 백엔드를 사용하는 StorageClasses의 경우, 지원되는 리전/영역에 스케줄링된 애플리케이션에서 요청한 경우에만 볼륨이 생성됩니다.

다음은 백엔드 정의의 예입니다.

YAML
---
version: 1
storageDriverName: ontap-san
backendName: san-backend-us-east1
managementLIF: 192.168.27.5
svm: iscsi_svm
username: admin
password: password
supportedTopologies:
  - topology.kubernetes.io/region: us-east1
    topology.kubernetes.io/zone: us-east1-a
  - topology.kubernetes.io/region: us-east1
    topology.kubernetes.io/zone: us-east1-b
JSON
{
  "version": 1,
  "storageDriverName": "ontap-san",
  "backendName": "san-backend-us-east1",
  "managementLIF": "192.168.27.5",
  "svm": "iscsi_svm",
  "username": "admin",
  "password": "password",
  "supportedTopologies": [
    {
      "topology.kubernetes.io/region": "us-east1",
      "topology.kubernetes.io/zone": "us-east1-a"
    },
    {
      "topology.kubernetes.io/region": "us-east1",
      "topology.kubernetes.io/zone": "us-east1-b"
    }
  ]
}
참고 `supportedTopologies`은 백엔드별 리전 및 영역 목록을 제공하는 데 사용됩니다. 이러한 리전 및 영역은 StorageClass에 제공할 수 있는 허용 가능한 값 목록을 나타냅니다. 백엔드에 제공된 리전 및 영역의 하위 집합을 포함하는 StorageClasses의 경우 Trident는 해당 백엔드에 볼륨을 생성합니다.
`supportedTopologies`를 스토리지 풀별로 정의할 수도 있습니다. 다음 예를 참조하십시오.
---
version: 1
storageDriverName: ontap-nas
backendName: nas-backend-us-central1
managementLIF: 172.16.238.5
svm: nfs_svm
username: admin
password: password
supportedTopologies:
  - topology.kubernetes.io/region: us-central1
    topology.kubernetes.io/zone: us-central1-a
  - topology.kubernetes.io/region: us-central1
    topology.kubernetes.io/zone: us-central1-b
storage:
  - labels:
      workload: production
    supportedTopologies:
      - topology.kubernetes.io/region: us-central1
        topology.kubernetes.io/zone: us-central1-a
  - labels:
      workload: dev
    supportedTopologies:
      - topology.kubernetes.io/region: us-central1
        topology.kubernetes.io/zone: us-central1-b

이 예에서 regionzone 레이블은 스토리지 풀의 위치를 나타냅니다. topology.kubernetes.io/region 및 `topology.kubernetes.io/zone`는 스토리지 풀을 사용할 수 있는 위치를 지정합니다.

2단계: 토폴로지를 인식하는 StorageClasses를 정의합니다

클러스터의 노드에 제공되는 토폴로지 레이블을 기반으로, StorageClasses를 정의하여 토폴로지 정보를 포함할 수 있습니다. 이를 통해 PVC 요청에 대한 후보로 사용되는 스토리지 풀과 Trident에서 프로비저닝한 볼륨을 사용할 수 있는 노드의 하위 집합이 결정됩니다.

다음 예를 참조하십시오.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: netapp-san-us-east1
provisioner: csi.trident.netapp.io
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
  - matchLabelExpressions:
    - key: topology.kubernetes.io/zone
      values:
        - us-east1-a
        - us-east1-b
    - key: topology.kubernetes.io/region
      values:
        - us-east1
parameters:
  fsType: ext4

위에 제공된 StorageClass 정의에서 volumeBindingMode`는 `WaitForFirstConsumer`로 설정되어 있습니다. 이 StorageClass로 요청된 PVC는 Pod에서 참조될 때까지 처리되지 않습니다. 그리고 `allowedTopologies`는 사용할 영역과 지역을 제공합니다. `netapp-san-us-east1 StorageClass는 위에 정의된 san-backend-us-east1 백엔드에 PVC를 생성합니다.

3단계: PVC 생성 및 사용

StorageClass를 생성하고 백엔드에 매핑했으면 이제 PVC를 생성할 수 있습니다.

아래 예시를 참조하세요 spec:

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata: null
name: pvc-san
spec: null
accessModes:
  - ReadWriteOnce
resources:
  requests:
    storage: 300Mi
storageClassName: netapp-san-us-east1

이 매니페스트를 사용하여 PVC를 생성하면 다음과 같은 결과가 나타납니다.

kubectl create -f pvc.yaml
persistentvolumeclaim/pvc-san created
kubectl get pvc
NAME      STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS          AGE
pvc-san   Pending                                      netapp-san-us-east1   2s
kubectl describe pvc
Name:          pvc-san
Namespace:     default
StorageClass:  netapp-san-us-east1
Status:        Pending
Volume:
Labels:        <none>
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode:    Filesystem
Mounted By:    <none>
Events:
  Type    Reason                Age   From                         Message
  ----    ------                ----  ----                         -------
  Normal  WaitForFirstConsumer  6s    persistentvolume-controller  waiting for first consumer to be created before binding

Trident가 볼륨을 생성하고 PVC에 바인딩하려면 포드에서 PVC를 사용하십시오. 다음 예를 참조하십시오.

apiVersion: v1
kind: Pod
metadata:
  name: app-pod-1
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: topology.kubernetes.io/region
            operator: In
            values:
            - us-east1
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: topology.kubernetes.io/zone
            operator: In
            values:
            - us-east1-a
            - us-east1-b
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  volumes:
  - name: vol1
    persistentVolumeClaim:
      claimName: pvc-san
  containers:
  - name: sec-ctx-demo
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: vol1
      mountPath: /data/demo
    securityContext:
      allowPrivilegeEscalation: false

이 podSpec은 Kubernetes에게 us-east1 지역에 있는 노드에 Pod를 예약하도록 지시하며, us-east1-a 또는 us-east1-b 영역에 있는 모든 노드 중에서 선택합니다.

다음 출력을 참조하십시오.

kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP               NODE              NOMINATED NODE   READINESS GATES
app-pod-1   1/1     Running   0          19s   192.168.25.131   node2             <none>           <none>
kubectl get pvc -o wide
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE   VOLUMEMODE
pvc-san   Bound    pvc-ecb1e1a0-840c-463b-8b65-b3d033e2e62b   300Mi      RWO            netapp-san-us-east1   48s   Filesystem

백엔드를 업데이트하여 다음을 포함하도록 합니다 supportedTopologies

기존 백엔드를 업데이트하여 supportedTopologies`목록을 포함할 수 있습니다 `tridentctl backend update. 이는 이미 프로비저닝된 볼륨에는 영향을 미치지 않으며 이후 PVC에만 사용됩니다.