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 여정이 순조롭고 성공적으로 이어지기를 바랍니다.