Kubernetes 블록 스토리지를 위한 NetApp ASA r2 시스템의 잠재력 활용

NetApp Tech Blog에 갔다가 Trident 관련해서 흥미로운 주제의 글이 보여서 AI 번역(+약간 수정)의 힘을 빌려 읽어보았습니다.
출처: https://community.netapp.com/t5/Tech-ONTAP-Blogs/Unlocking-the-power-of-NetApp-ASA-r2-systems-for-Kubernetes-block-storage/ba-p/460113

조직들이 대규모로 쿠버네티스를 도입함에 따라 단순성은 핵심 설계 원칙 중 하나가 되었습니다. 사용자는 제한된 시간과 리소스로 더 많은 작업을 수행하고자 합니다. NetApp® ASA r2 시스템은 쿠버네티스 애플리케이션의 스토리지 공간을 간소화하여 사용자를 지원합니다. 이 글에서는 ASA r2 시스템의 최첨단 기능을 살펴보고 쿠버네티스 워크로드와 원활하게 통합하는 방법을 보여드리겠습니다. 자, 그럼 자세히 살펴보겠습니다.

ASA r2 시스템 소개

NetApp ASA A1K, ASA A90, ASA A70, ASA A50, ASA A30, ASA A20 모델을 포함하는 NetApp ASA r2 시스템은 SAN 전용 고객의 특정 요구에 맞춰 설계된 통합 하드웨어 및 소프트웨어 솔루션을 제공합니다. 새로운 NetApp ONTAP® 디자인 센터 아키텍처를 기반으로 구축된  시스템은 혁신적인 스토리지 프로비저닝 방식을 도입하여 최신 쿠버네티스 워크로드에 이상적인 선택입니다.

분산된 시스템 설계

ASA r2 시스템의 주요 차별화 요소 중 하나는 분산 아키텍처입니다. 기존 시스템과 달리, ASA r2 시스템은 사용자에게 애그리게이트 개념을 제공하지 않습니다. 대신, 이 시스템은 LUN(논리 단위 번호)을 최우선으로 처리하여 볼륨 내부에 LUN을 래핑할 필요가 없습니다. 이러한 혁신적인 설계는 블록 스토리지 관리 경험을 간소화하고 간소화합니다.

NetApp Trident와 CSI 통합

ASA r2 시스템과의 통합을 지원하기 위해, Container Storage Interface (CSI) 호환 스토리지 오케스트레이터인 NetApp Trident  소프트웨어는 25.02 릴리스부터 iSCSI 프로토콜을 사용한 블록 스토리지 프로비저닝을 지원합니다. 가장 큰 장점은 기존 Trident 고객이라면 최소한의 변경만으로 ASA r2 시스템으로 원활하게 전환할 수 있다는 것입니다. Trident 백엔드에서 올바른 자격 증명만 제공하면 나머지는 자동으로 결정됩니다.

간소화된 프로비저닝 프로세스

Trident를 처음 사용하시든 기존 사용자든, Trident를 통한 스토리지 프로비저닝 과정은 간단합니다. 간단한 단계는 다음과 같습니다.

  • 1단계: Trident 백엔드 생성. 먼저 ontap-san 스토리지 드라이버를 사용하여 Trident 백엔드를 생성합니다 . Kubernetes 네이티브 방식을 사용하여 TridentBackendConfig(TBC) 사용자 지정 리소스 정의를 구성하거나, Trident 관리용 명령줄 유틸리티인 tridentctl을 사용하여 사용자 지정 JSON 파일을 사용하여 이 작업을 수행할 수 있습니다 . 구성은 다른 ontap-san 백엔드와 유사하며, 사용자 이름과 비밀번호만 변경됩니다. 관리자 자격 증명을 사용하여 클러스터 관리 IP를 사용하거나, 관리 IP 및 자격 증명을 사용하여 특정 스토리지 가상 머신(SVM)을 지정할 수 있습니다.
# Kubernetes secret required for creating Trident backend from TBC
[root@scs000571921-1 demo]# cat secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: asar2-backend-secret
type: Opaque
stringData:
  username: <username>
  password: <password>

[root@scs000571921-1 demo]# kubectl create -f secret.yaml -n trident
secret/asar2-backend-secret created

[root@scs000571921-1 demo]# kubectl get secret asar2-backend-secret -n trident
NAME                   TYPE     DATA   AGE
asar2-backend-secret   Opaque   2      89s

# Kubernetes CR TridentBackendConfig (TBC)
[root@scs000571921-1 demo]# cat trident-backend-config.yaml 
apiVersion: trident.netapp.io/v1
kind: TridentBackendConfig
metadata:
  name: asar2-san-backend-tbc
spec:
  version: 1
  backendName: asar2-san-backend
  storageDriverName: ontap-san
  managementLIF: 1.1.1.1
  svm: svm0
  credentials:
    name: asar2-backend-secret

# Or, Trident backend json
[root@scs000571921-1 demo]# cat backend.json 
{
   "version": 1,
   "storageDriverName": "ontap-san",
   "backendName": "asar2-san-backend",
   "managementLIF": "1.1.1.1",
   "svm": "svm0",
   "username": "<username>",
   "password": "<password>"
}
  • 2단계: 백엔드 추가 . 백엔드가 구성되면 kubectl 또는 tridentctl을 사용하여 Trident에 추가할 수 있습니다 . 이러한 도구를 사용하면 새로 구성된 백엔드를 Trident에 편리하게 추가하고 사용할 수 있습니다.
# Create Trident Backend via kubectl
[root@scs000571921-1 demo]# kubectl create -f trident-backend-config.yaml -n trident
tridentbackendconfig.trident.netapp.io/asar2-san-backend-tbc created

[root@scs000571921-1 demo]# kubectl get tbc -n trident
NAME                    BACKEND NAME        BACKEND UUID                           PHASE   STATUS
asar2-san-backend-tbc   asar2-san-backend   44ab00c8-e24f-4a02-977a-566c08f13654   Bound   Success

[root@scs000571921-1 demo]# tridentctl -n trident get b
+-------------------+----------------+--------------------------------------+--------+------------+---------+
|       NAME        | STORAGE DRIVER |                 UUID                 | STATE  | USER-STATE | VOLUMES |
+-------------------+----------------+--------------------------------------+--------+------------+---------+
| asar2-san-backend | ontap-san      | 44ab00c8-e24f-4a02-977a-566c08f13654 | online | normal     |       0 |
+-------------------+----------------+--------------------------------------+--------+------------+---------+

# Or, create Trident Backend via tridentctl

[root@scs000571921-1 demo]# tridentctl create backend -f backend.json -n trident
+-------------------+----------------+--------------------------------------+--------+------------+---------+
|       NAME        | STORAGE DRIVER |                 UUID                 | STATE  | USER-STATE | VOLUMES |
+-------------------+----------------+--------------------------------------+--------+------------+---------+
| asar2-san-backend | ontap-san      | 462d2965-68e2-492b-83d6-ee65ba79af96 | online | normal     |       0 |
+-------------------+----------------+--------------------------------------+--------+------------+---------+

  • 3단계: 스토리지 클래스를 정의합니다. 필요한 스토리지 드라이버 유형에 맞는 스토리지 클래스를 생성합니다. 이 단계에서는 동적으로 프로비저닝하려는 스토리지의 특성을 정의할 수 있습니다.
[root@scs000571921-1 demo]# cat sc.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: asar2-san-sc
parameters:
  backendType: ontap-san
  storagePools: "asar2-san-backend:.*"
provisioner: csi.trident.netapp.io

[root@scs000571921-1 demo]# kubectl create -f sc.yaml 
storageclass.storage.k8s.io/asar2-san-sc created

[root@scs000571921-1 demo]# kubectl get sc
NAME           PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
asar2-san-sc   csi.trident.netapp.io   Delete          Immediate           false                  2m

이제 ASA r2 시스템에서 스토리지를 동적으로 프로비저닝할 준비가 모두 끝났습니다. 이를 사용하는 방법의 예를 살펴보겠습니다.

  • 4단계: PVC를 생성합니다. 필요한 스토리지 용량을 지정하고 적절한 스토리지 클래스를 참조하는 PersistentVolumeClaim(PVC)을 정의합니다. 이 단계를 통해 쿠버네티스 애플리케이션이 필요한 블록 스토리지에 액세스할 수 있습니다.
[root@scs000571921-1 demo]# cat pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: asar2-san-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: asar2-san-sc

[root@scs000571921-1 demo]# kubectl create -f pvc.yaml 
persistentvolumeclaim/asar2-san-pvc created
  • 5단계: PVC 바인딩 확인. PVC가 생성된 후 영구 볼륨(PV)에 성공적으로 바인딩되었는지 확인합니다. 이 확인을 통해 애플리케이션에서 블록 스토리지를 사용할 준비가 되었음을 확인할 수 있습니다.
[root@scs000571921-1 demo]# kubectl get pvc
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
asar2-san-pvc   Bound    pvc-23b443f7-3df1-4d15-a106-4f407b8ff4cf   1Gi        RWO            asar2-san-sc   2m5s
  • 6단계: PVC 사용. 축하합니다! 이제 원하는 포드에서 PVC를 사용할 준비가 되었습니다. 포드 사양에 맞게 PVC를 장착하면 애플리케이션에서 ASA r2 시스템이 제공하는 고성능 블록 스토리지에 원활하게 액세스할 수 있습니다.
[root@scs000571921-1 demo]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: asa-r2-san-pod
spec:
  containers:
  - image: nginx:alpine
    name: nginx
    volumeMounts:
    - mountPath: mnt/pvc
      name: local-storage
  nodeSelector:
    kubernetes.io/arch: amd64
    kubernetes.io/os: linux
  volumes:
  - name: local-storage
    persistentVolumeClaim:
      claimName: asar2-san-pvc

[root@scs000571921-1 demo]# kubectl create -f pod.yaml 
pod/asa-r2-san-pod created

[root@scs000571921-1 demo]# kubectl get po
NAME             READY   STATUS    RESTARTS   AGE
asa-r2-san-pod   1/1     Running   0          41s

[root@scs000571921-1 demo]# kubectl exec -it asa-r2-san-pod -- /bin/ash -c "mount | fgrep mnt/pvc" 
/dev/mapper/3600a098078304b2d793f587a79497556 on /mnt/pvc type ext4 (rw,seclabel,relatime,stripe=16)

문제 해결이 쉬워졌습니다

문제가 발생할 경우, 문제 해결을 위한 몇 가지 유용한 명령을 제공합니다. 문제가 있는 리소스에 대해 kubectl describe 명령을 사용하여 자세한 정보를 수집하세요. 시스템 동작에 대한 자세한 정보를 얻으려면 kubectl 또는 tridentctl 명령을 사용하여 Trident 로그를 확인하세요 .

[root@scs000571921-1 demo]# kubectl describe pvc asar2-san-pvc
Name:          asar2-san-pvc
Namespace:     default
StorageClass:  asar2-san-sc
Status:        Bound
Volume:        pvc-23b443f7-3df1-4d15-a106-4f407b8ff4cf
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: csi.trident.netapp.io
               volume.kubernetes.io/storage-provisioner: csi.trident.netapp.io
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       <none>
Events:
  Type    Reason                 Age                    From                                                                                            Message
  ----    ------                 ----                   ----                                                                                            -------
  Normal  Provisioning           7m52s                  csi.trident.netapp.io_trident-controller-7b8bc4df65-q6gzd_a47e7fca-4039-44c1-9a3e-0ce1abf8659b  External provisioner is provisioning volume for claim "default/asar2-san-pvc"
  Normal  ExternalProvisioning   7m51s (x3 over 7m52s)  persistentvolume-controller                                                                     waiting for a volume to be created, either by external provisioner "csi.trident.netapp.io" or manually created by system administrator
  Normal  ProvisioningSuccess    7m37s                  csi.trident.netapp.io                                                                           provisioned a volume
  Normal  ProvisioningSucceeded  7m37s                  csi.trident.netapp.io_trident-controller-7b8bc4df65-q6gzd_a47e7fca-4039-44c1-9a3e-0ce1abf8659b  Successfully provisioned volume pvc-23b443f7-3df1-4d15-a106-4f407b8ff4cf
[root@scs000571921-1 demo]# kubectl get pvc
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
asar2-san-pvc   Bound    pvc-23b443f7-3df1-4d15-a106-4f407b8ff4cf   1Gi        RWO            asar2-san-sc   7m58s
[root@scs000571921-1 demo]# kubectl describe pvc asar2-san-pvc
Name:          asar2-san-pvc
Namespace:     default
StorageClass:  asar2-san-sc
Status:        Bound
Volume:        pvc-23b443f7-3df1-4d15-a106-4f407b8ff4cf
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: csi.trident.netapp.io
               volume.kubernetes.io/storage-provisioner: csi.trident.netapp.io
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       <none>
Events:
  Type    Reason                 Age                  From                                                                                            Message
  ----    ------                 ----                 ----                                                                                            -------
  Normal  Provisioning           8m4s                 csi.trident.netapp.io_trident-controller-7b8bc4df65-q6gzd_a47e7fca-4039-44c1-9a3e-0ce1abf8659b  External provisioner is provisioning volume for claim "default/asar2-san-pvc"
  Normal  ExternalProvisioning   8m3s (x3 over 8m4s)  persistentvolume-controller                                                                     waiting for a volume to be created, either by external provisioner "csi.trident.netapp.io" or manually created by system administrator
  Normal  ProvisioningSuccess    7m49s                csi.trident.netapp.io                                                                           provisioned a volume
  Normal  ProvisioningSucceeded  7m49s                csi.trident.netapp.io_trident-controller-7b8bc4df65-q6gzd_a47e7fca-4039-44c1-9a3e-0ce1abf8659b  Successfully provisioned volume pvc-23b443f7-3df1-4d15-a106-4f407b8ff4cf

[root@scs000571921-1 demo]# kubectl -n trident get po
NAME                                  READY   STATUS    RESTARTS   AGE
trident-controller-7b8bc4df65-q6gzd   6/6     Running   0          37h
trident-node-linux-2hxgp              2/2     Running   0          37h
trident-node-linux-4n8pn              2/2     Running   0          37h

[root@scs000571921-1 demo]# kubectl logs trident-controller-7b8bc4df65-q6gzd -n trident
Defaulted container "trident-main" out of: trident-main, trident-autosupport, csi-provisioner, csi-attacher, csi-resizer, csi-snapshotter
time="2025-03-11T21:19:49Z" level=debug msg="Node updated in cache." logLayer=csi_frontend name=scs000571921-1 requestID=91d2ec94-41c3-432e-b0bf-12663b56bc97 requestSource=Kubernetes workflow="node=update"

[root@scs000571921-1 demo]# tridentctl -n trident logs
trident-controller log:
time="2025-03-11T21:19:49Z" level=debug msg="Node updated in cache." logLayer=csi_frontend name=scs000571921-1 requestID=91d2ec94-41c3-432e-b0bf-12663b56bc97 requestSource=Kubernetes workflow="node=update"
time="2025-03-11T21:19:49Z" level=debug msg="Node updated in cache." logLayer=csi_frontend name=scs000571921-2 requestID=998d09a6-b644-407c-9f41-99e4c136c097 requestSource=Kubernetes workflow="node=update"
time="2025-03-11T21:20:04Z" level=debug msg="Node updated in cache." logLayer=csi_frontend name=scs000571921-1 requestID=912fa020-21f3-4e15-8c43-1c89ed54db80 requestSource=Kubernetes workflow="node=update"

결론

NetApp ASA r2 시스템의 강력한 기능과 NetApp Trident의 통합 기능을 통해 Kubernetes 애플리케이션용 블록 스토리지 프로비저닝이 그 어느 때보다 쉬워졌습니다. 이 글이 ASA r2 시스템에서 Kubernetes 워크로드를 구성하는 데 필요한 지식과 자신감을 제공해 드리기를 바랍니다. 즐거운 구성과 함께 Kubernetes 여정이 순조롭고 성공적으로 이어지기를 바랍니다.

답글 남기기

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

You May Also Like
Read More

B2B – What Happens When a NFS Share is Mounted

NetApp Tech Blog에 갔다가 흥미로운 주제의 글이 보여서 AI 번역(+약간 수정)의 힘을 빌려 읽어보았습니다. 출처: https://community.netapp.com/t5/Tech-ONTAP-Blogs/B2B-What-Happens-When-a-NFS-Share-is-Mounted/ba-p/462010 “Back to…
Read More

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

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

Symmetric active-active Oracle clustering with ONTAP

출처: https://community.netapp.com/t5/Tech-ONTAP-Blogs/Symmetric-active-active-Oracle-clustering-with-ONTAP/ba-p/451314특별한 기술적 설명 보다는, Oracle RAC 환경에서 Active-Active 모드의 SnapMirror Activ Sync가 잘 동작한다는 예를 보여주는 것…