Trident에서 파이버 채널 지원 소개

NetApp Tech Blog에 갔다가 Trident 관련해서 흥미로운 주제의 글이 보여서 AI 번역(+약간 수정)의 힘을 빌려 읽어보았습니다.
출처: https://community.netapp.com/t5/Tech-ONTAP-Blogs/Introducing-Fibre-Channel-support-in-Trident/ba-p/457427

NetApp ®  Trident  스토리지 프로비 저너 25.02 릴리스를 통해 ontap-san 드라이버(sanType: fcp)에서 파이버 채널 프로토콜(FCP)을 공식 지원합니다. 이 지원을 통해 고객은 Kubernetes/OpenShift 가상화에서 컨테이너 또는 가상 머신을 실행하는 것과 같은 최신 워크로드에 기존 파이버 채널 프로토콜(FC) 인프라 투자를 활용할 수 있습니다. FC는 고객이 테스트할 수 있도록 Trident 버전 24.10의 기술 미리보기 기능이었지만, 이제 고객이 프로덕션 환경에서도 새로운 기능을 사용할 수 있도록 지원합니다.

이 블로그에서는 FC 백엔드로 Trident를 구성하는 방법을 간략히 보여드리고 볼륨 스냅샷과 크기 조정 작업을 시연합니다.

필수 조건

이 블로그 게시물은 다음을 가정합니다.

  • 최신 Trident가 설치된 Kubernetes 클러스터와 관련 kubeconfig 가 있습니다 .
  • 조닝은 ONTAP 설명서 에 따라 NetApp ONTAP ® 소프트웨어를 실행하는 FC 스위치와 시스템에서 수행됩니다 .
  • Trident는 Kubernetes 클러스터에 설치되었으며, 클러스터 노드는 Trident 설명서 에 따라 준비되었습니다 .
  • kubeconfig를 사용하도록 kubectl이 구성된 워크스테이션에 액세스할 수 있으며 , tridentctl CLI가 설치되어 있습니다 .

트라이던트 구성

먼저 JSON 형식의 백엔드 구성을 사용하여 SAN 드라이버로 ONTAP 백엔드를 구성합니다. 액세스 정보와 스토리지 드라이버 이름 (iSCSI, NVMe, FCP에서 공통) 인 ontap-san을 제공하고, sanType을 fcp 로 설정합니다 .

$ cat 1_fcp_backend.json
{
  "version": 1,
  "storageDriverName": "ontap-san",
  "managementLIF": "172.16.100.98",
  "svm": "svm1",
  "username": "admin",
  "password": "Ab0xB@wks!",
  "sanType": "fcp",
  "useREST": false,
  "backendName": "LXRRRxxbfr"
}

이 tridentctl 명령은 백엔드 LXRRRxxbfr을 생성합니다 .

$ tridentctl create backend -f 1_fcp_backend.json -n trident
+------------+----------------+--------------------------------------+--------+------------+---------+
|    NAME    | STORAGE DRIVER |                UUID                  | STATE  | USER-STATE | VOLUMES |
+------------+----------------+--------------------------------------+--------+------------+---------+
| LXRRRxxbfr | ontap-san      | dd2110ac-d412-4c93-9a24-85a86b0c80f5 | online | normal.    |       0 |
+------------+----------------+--------------------------------------+--------+------------+---------+  

백엔드가 구축되고 온라인 상태가 되면 나중에 영구 볼륨을 동적으로 프로비저닝하기 위해 해당 스토리지 클래스인 basic-fcp를 생성합니다.

$ cat 2_storage-class-basic.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: basic-fcp
provisioner: csi.trident.netapp.io
allowVolumeExpansion: true
parameters:
  backendType: "ontap-san"
  fsType: "ext4"

$ kubectl create -f ./2_storage-class-basic.yaml
storageclass.storage.k8s.io/basic-fcp created

또한 나중에 스냅샷을 생성하는 데 사용할 스냅샷 클래스 csi-snapclass를 생성합니다.

$ cat 2a_snapshot-class-basic.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: csi-snapclass
driver: csi.trident.netapp.io
deletionPolicy: Delete

$ kubectl create -f ./ 2a_snapshot-class-basic.yaml
Volumesnapshotclass.snapshot.storage.k8s.io/csi-snapclass created

ONTAP 콘솔에서 확인해보니, 작업자 노드( sti-rx2540-266 )의 worldwide port name(WWPN)이 아직 ONTAP initiator groups(igroups)에 등록되지 않은 것으로 나타났습니다. 아직 워크로드 포드를 생성하지 않았기 때문입니다.

$ hostname
sti-rx2540-266.ctl.gdl.englab.netapp.com

stiA300-2911726562639::> igroup show -vserver svml
Vserver   Igroup       Protocol OS Type  Initiators
--------- ------------ -------- -------  --------------------------------------------
svm1      sti-c210-347 fcp      linux    21:00:00:24:ff:27:de:1a
                                         21:00:00:24:ff:27:de:1b
svm1      sti-rx2540-263
                       fcp      linux    10:00:00:10:9b:1d:73:7c
                                         10:00:00:10:9b:1d:73:7d
svm1      sti-rx2540-263.ctl.gdl.englab.netapp.com-fcp-c38dbd10-f2a9-4762-b553-f
871fef4f7a7
                       fcp      linux    10:00:00:10:9b:1d:73:7c
                                         10:00:00:10:9b:1d:73:7d
                                         21:00:00:24:ff:48:fb:14
                                         21:00:00:24:ff:48:fb:15     
svm1      trident      mixed    linux    18:00:00:10:9b:dd:dd:dd
4 entries were displayed

작업자 노드에서 영구 볼륨과 포드를 생성하기 전에 multipath 출력을 확인하여 장치 매퍼(DM) 장치가 하나만 있는지 확인합니다.

$ multipath -ll
3600а098038303048783f4a7148556f2d dm-0 NETAPP, LUN C-Mode
size=40G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alwp=rw
|-+- policy='service-time 0' prio=10 status=enabled
| |- 10:0:0:0 sda 8:0  active ready running
| '- 12:0:0:0 sdc 8:32 active ready running
'-+- policy='service-time 0' prio=50 status=active
  |- 10:0:1:0 sdb 8:16 active ready running
  '- 12:0:1:0 sdd 8:48 active ready running

볼륨 생성 및 스냅샷 작업 테스트

이제 이 매니페스트를 적용하여 워크로드 포드와 PersistentVolumeClaim(PVC)을 만들어 보겠습니다.

$ cat 3_sts_with_pvc.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-statefulset
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
          volumeMounts:
            - name: basic-fcp-pvc
              mountPath: /mnt/basic-san
  volumeClaimTemplates:
    - metadata:
        name: basic-fcp-pvc
      spec:
        accessModes: [ "ReadWriteOnce" ]
        storageClassName: "basic-fcp"
        resources:
          requests:
            storage: 20Mi

$ kubectl create -f ./ 3_sts_with_pvc.yaml
Statefulset.apps/my-statefulset created

PVC가 생성되었음을 확인합니다.

$ kubectl get pvc -A
NAMESPACE	NAME						STATUS	VOLUME						CAPACITY	ACCESS MODES	STORAGECLASS	AGE
Default	basic-fcp-pvc-my-statefulset-0	Bound		pvc-fed5f2fa-9841-4313-a619-1548e9457bce	20Mi		RWO				basic-fop		4s

몇 초 후에 포드가 작동하기 시작합니다.

$ kubectl get po -A | grep statefulset
NAMESPACE	NAME			READY	STATUS	RESTARTS	AGE
Default	my-statefulset-0	1/1	Running	0		16s

포드가 올라간 후, 작업자 노드에 추가 DM 장치 dm-5가 있는 것을 볼 수 있습니다.

$ multipath -ll
3600а098038313768583f58394343506a dm-5 NETAPP, LUN C-Mode 
size=20M features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 al ua' wp=rw
'-+- policy='service-time 0' prio=50 status=active
  |- 11:0:0:0 sde 8:64 active ready running
  '- 13:0:0:0 sdf 8:80 active ready running
3600а098038303048783f4a7148556f2d dm-0 NETAPP, LUN C-Mode
size=40G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alwp=rw
|-+- policy='service-time 0' prio=10 status=enabled
| |- 10:0:0:0 sda 8:0  active ready running
| '- 12:0:0:0 sdc 8:32 active ready running
'-+- policy='service-time 0' prio=50 status=active
  |- 10:0:1:0 sdb 8:16 active ready running
  '- 12:0:1:0 sdd 8:48 active ready running

ONTAP 콘솔에서 igroup에 새 항목이 추가된 것을 확인할 수 있습니다. igroup 이름 앞에는 작업자 노드의 호스트 이름과 WWPN이 접두사로 붙습니다. 두 번째 작업자 노드 B에 ReadWriteMany(RWX) 볼륨이 연결된 경우 해당 작업자 노드의 igroup은 달라집니다. 이를 iSCSI 사양에 따라 “per-node igroup”이라고 합니다.

stiA300-2911726562639::> igroup show -vserver svml
Vserver   Igroup       Protocol OS Type  Initiators
--------- ------------ -------- -------  --------------------------------------------
svm1      sti-c210-347 fcp      linux    21:00:00:24:ff:27:de:1a
                                         21:00:00:24:ff:27:de:1b
svm1      sti-rx2540-263
                       fcp      linux    10:00:00:10:9b:1d:73:7c
                                         10:00:00:10:9b:1d:73:7d
svm1      sti-rx2540-263.ctl.gdl.englab.netapp.com-fcp-c38dbd10-f2a9-4762-b553-f
871fef4f7a7
                       fcp      linux    10:00:00:10:9b:1d:73:7c
                                         10:00:00:10:9b:1d:73:7d
                                         21:00:00:24:ff:48:fb:14
                                         21:00:00:24:ff:48:fb:15    
svm1	    sti-rx2540-266.ctl.gdl.englab.netapp.com-fcp-8017638f-8e81-419b-8202-c
c16678b394f
	    		     fcp	  linux    0:00:00:90:fa:cd:fd:c0
                                         0:00:00:90:fa:cd:fd:c1
                                         21:00:00:24:ff:30:2:a2
                                         21:00:00:24:ff:30:2:a3
svm1      trident      mixed    linux    18:00:00:10:9b:dd:dd:dd
‹space> to page down, <return> for next line, or 'g' to quit...

이제 스냅샷을 생성하고 이를 통해 PVC를 복제해 보겠습니다.

이전에 생성한 PVC의 볼륨 스냅샷 ontap-fcp-snapshot을 생성하려면 다음 매니페스트를 사용합니다.

$ cat 4_fcp_ontap-snapshot.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: ontap-fcp-snapshot
spec:
  volumeSnapshotClassName: csi-snapclass
  source:
    persistentVolumeClaimName: basic-fcp-pvc-my-statefulset-0

$ kubectl create -f 4_fcp_ontap-snapshot.yaml
volumesnapshot.snapshot.storage.k8s.io/ontap-fcp-snapshot created

몇 초 후에 스냅샷이 준비됩니다.

$ kubectl get volumesnapshot
NAME				READYTOUSE	SOURCEPVC					SOURCESNAPSHOTCONTENT	RESTORESIZE	SNAPSHOTCLASS	SNAPSHOTCONTENT
                                           CREATIONTIME	AGE
ontap-fcp-snapshot	true		basic-fcp-pvc-my-statefulset-0					20Mi		csi-snapclass	snapcontent-69f30df6-353d-444b-8a8c-fe4fe3693206	4s			4s

이제 이 매니페스트를 사용하여 해당 스냅샷에서 PVC ontap-fcp-pvc-from-snapshot 복제본을 만들 준비가 되었습니다 .

$ cat 5_fcp_ontap-pvc-from-snapshot.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ontap-fcp-pvc-from-snapshot
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: basic-fcp
  resources:
    requests:
      storage: 20Mi
  dataSource:
    name: ontap-fcp-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io

$ kubectl create -f 5_fcp_ontap-pvc-from-snapshot.yaml
persistenvolumeclaim/ontap-fcp-pvc-from-snapshot created

PVC 목록을 확인해보면, 다음 목록의 두 번째 PVC가 스냅샷의 PVC입니다. 따라서 복제된 PVC가 성공적으로 생성되었습니다.

$ kubectl get pvc -A
NAMESPACE	NAME						STATUS	VOLUME						CAPACITY	ACCESS MODES	STORAGE CLASS	AGE
default	basic-fcp-pvc-my-statefulset-0	Bound		pvc-fed5f2fa-9841-4313-a619-1548e9457bce	20Mi		RWO			basic-fcp		73s
default	ontap-fcp-pvc-from-snapshot		Bound		pvc-c3bf4ffc-7b11-4ef7-8334-895b971d61db	20Mi		RWO			basic-fcp		6s

볼륨 크기 조정 작업 테스트

마지막 테스트로, 다음 매니페스트를 사용하여 크기 조절 워크플로를 수행하기 위해 크기가 1GiB인 또 다른 FCP 지원 PVC basic-fcp-pvc를 생성합니다.

$ cat pvc-basic-1.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: basic-fcp-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: basic-fcp

$ kubectl create -f ./ pvc-basic-1.yaml
persistenvolumeclaim/basic-fcp-pvc created

새로 만든 PVC에 포드/배포를 첨부합니다.

$ cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
 name: test-deployment
 labels:
  app: nginx
spec:  
 selector:
  matchLabels:
   app: nginx
 template:
  metadata:
   labels:
    app: nginx
  spec:
   containers:
   - image: nginx:latest
     name: nginx
     volumeMounts:
     - mountPath: /usr/share/nginx/html
       name: nginx-data
   volumes:
     - name: nginx-data
       persistentVolumeClaim:
         claimName: basic-fcp-pvc

$ kubectl create -f ./deployment.yaml
deployment.apps/test-deployment created

그리고 우리는 포드가 올라오기를 기다립니다.

$ kubectl get po -A | grep test
NAMESPACE		NAME							READY	STATUS	RESTARTS	AGE
default		test-deployment-6bc4596cbc-zqv12		1/1	Running	0		14s

이제 PVC basic-fcp-pvc를 초기 1GiB에서 2GiB 크기로 패치해 보겠습니다.

$ kubectl patch pvc basic-fcp-pvc -p ‘{“spec”: {“resources”: {“requests”: {“storage”: :2Gi”}}}}’
persistenvolumeclaim/basic-fcp-pvc patched

크기 조정 작업을 적용하려면 Pod를 다시 시작해야 하므로 삭제하겠습니다.

$ kubectl delete po test-deployment-6bc4596cbc-zqv12
pod “test-deployment-6bc4596cbc-zqv12” deleted

새로운 포드가 나타나면 크기 조정 작업이 수행됩니다.

$ kubectl get po -A | grep test
default		    test-deployment-6bc4596cbc-cps8q		    1/1	Running	0		5s

마지막으로 PVC를 쿼리하여 크기 조정이 성공적으로 이루어졌는지 확인하고 용량이 이제 2GiB임을 확인합니다.

$ kubectl get pvc -A | grep basic-fcp-pvc
default	basic-fcp-pvc				Bound		pvc-20414113-7630-4dcb-b522-e89853ac77f3	2Gi		RWO			basic-fcp		57s
default	basic-fcp-pvc-my-statefulset-0	Bound		pvc-fed5f2fa-9841-4313-a619-1548e9457bce	20Mi		RWO			basic-fcp	2m24ss
default	ontap-fcp-pvc-from-snapshot		Bound		pvc-c3bf4ffc-7b11-4ef7-8334-895b971d61db	20Mi		RWO			basic-fcp		77s

결론

요약하자면, 쿠버네티스 클러스터에서 Trident를 사용하여 FC 백엔드를 구성했습니다. 그런 다음 FC 백엔드에 여러 개의 영구 볼륨을 생성하고 스냅샷 생성, 복제, 크기 조정과 같은 스토리지 작업이 예상대로 작동하는지 확인했습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like
Read More

NetApp solutions for NFS encryption over the wire

NetApp Tech Blog에 갔다가 흥미로운 주제의 글이 보여서 AI 번역(+약간 수정)의 힘을 빌려 읽어보았습니다. 출처: https://community.netapp.com/t5/Tech-ONTAP-Blogs/NetApp-solutions-for-NFS-encryption-over-the-wire/ba-p/458221 개요 NetApp은 세계에서…