이 가이드에서는 동적 프로비저닝을 사용하여 GKE에서 관리형 Lustre CSI 드라이버가 지원하는 새 Kubernetes 볼륨을 만드는 방법을 설명합니다. Managed Lustre CSI 드라이버를 사용하면 Managed Lustre 인스턴스에서 지원하는 스토리지를 주문형으로 만들고 스테이트풀(Stateful) 워크로드의 볼륨으로 액세스할 수 있습니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Cloud Managed Lustre API 및 Google Kubernetes Engine API를 사용 설정합니다. API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
- 제한사항 및 요구사항은 CSI 드라이버 개요를 참고하세요.
- 관리형 Lustre CSI 드라이버를 사용 설정해야 합니다. Standard 및 Autopilot 클러스터에서는 기본적으로 사용 중지되어 있습니다.
환경 변수 설정
다음 환경 변수를 설정합니다.
export CLUSTER_NAME=CLUSTER_NAME
export PROJECT_ID=PROJECT_ID
export NETWORK_NAME=LUSTRE_NETWORK
export IP_RANGE_NAME=LUSTRE_IP_RANGE
export FIREWALL_RULE_NAME=LUSTRE_FIREWALL_RULE
export LOCATION=ZONE
export CLUSTER_VERSION=CLUSTER_VERSION
다음을 바꿉니다.
CLUSTER_NAME
: 클러스터의 이름입니다.PROJECT_ID
: Google Cloud 프로젝트 IDLUSTRE_NETWORK
: GKE 클러스터와 관리형 Lustre 인스턴스가 모두 상주하는 공유 가상 프라이빗 클라우드 (VPC) 네트워크입니다.LUSTRE_IP_RANGE
: 관리형 Lustre와의 VPC 네트워크 피어링을 위해 생성된 IP 주소 범위의 이름입니다.LUSTRE_FIREWALL_RULE
: IP 주소 범위의 TCP 트래픽을 허용하는 방화벽 규칙의 이름입니다.ZONE
: GKE 클러스터의 지리적 영역입니다(예:us-central1-a
).CLUSTER_VERSION
: GKE 클러스터 버전입니다.
VPC 네트워크 설정
관리형 Lustre 인스턴스와 GKE 클러스터를 만들 때 동일한 VPC 네트워크를 지정해야 합니다. 피어링된 VPC 네트워크를 사용하는 경우 Network Connectivity Center를 통해 연결해야 합니다.
서비스 네트워킹을 사용 설정하려면 다음 명령어를 실행합니다.
gcloud services enable servicenetworking.googleapis.com \ --project=${PROJECT_ID}
VPC 네트워크 만들기
--mtu
플래그를8896
로 설정하면 성능이 10% 향상됩니다.gcloud compute networks create ${NETWORK_NAME} \ --subnet-mode=auto --project=${PROJECT_ID} \ --mtu=8896
IP 주소 범위를 만듭니다.
gcloud compute addresses create ${IP_RANGE_NAME} \ --global \ --purpose=VPC_PEERING \ --prefix-length=20 \ --description="Managed Lustre VPC Peering" \ --network=${NETWORK_NAME} \ --project=${PROJECT_ID}
이전 단계에서 만든 범위와 연결된 CIDR 범위를 가져옵니다.
CIDR_RANGE=$( gcloud compute addresses describe ${IP_RANGE_NAME} \ --global \ --format="value[separator=/](address, prefixLength)" \ --project=${PROJECT_ID} )
만든 IP 주소 범위의 TCP 트래픽을 허용하는 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \ --allow=tcp:988,tcp:6988 \ --network=${NETWORK_NAME} \ --source-ranges=${CIDR_RANGE} \ --project=${PROJECT_ID}
프로젝트의 네트워크 피어링을 설정하려면 필요한 IAM 권한(특히
compute.networkAdmin
또는servicenetworking.networksAdmin
역할)이 있는지 확인하세요.- Google Cloud 콘솔 > IAM 및 관리자로 이동한 다음 프로젝트 소유자 주 구성원을 검색합니다.
- 연필 아이콘을 클릭한 다음 + 다른 역할 추가를 클릭합니다.
- Compute 네트워크 관리자 또는 서비스 네트워킹 관리자를 선택합니다.
- 저장을 클릭합니다.
피어링을 연결합니다.
gcloud services vpc-peerings connect \ --network=${NETWORK_NAME} \ --project=${PROJECT_ID} \ --ranges=${IP_RANGE_NAME} \ --service=servicenetworking.googleapis.com
관리형 Lustre CSI 드라이버 구성
이 섹션에서는 필요한 경우 관리 Lustre CSI 드라이버를 사용 설정하고 중지하는 방법을 설명합니다.
Lustre 통신 포트
GKE Managed Lustre CSI 드라이버는 GKE 클러스터 버전과 기존 Managed Lustre 구성에 따라 Managed Lustre 인스턴스와의 통신에 다른 포트를 사용합니다.
기본 포트 (권장): 버전
1.33.2-gke.4780000
이상을 실행하는 새 GKE 클러스터의 경우 드라이버는 기본적으로 Lustre 통신에 포트988
을 사용합니다.기존 포트: 다음 시나리오에서
gcloud
명령어에--enable-legacy-lustre-port
플래그를 추가하여 포트6988
를 사용합니다.- 이전 GKE 버전: GKE 클러스터에서
1.33.2-gke.4780000
이전 버전을 실행하는 경우--enable-legacy-lustre-port
플래그는 GKE 노드에서gke-metadata-server
와의 포트 충돌을 해결합니다. - 기존 Lustre 인스턴스:
gke-support-enabled
플래그로 생성된 기존 Managed Lustre 인스턴스에 연결하는 경우 클러스터 버전과 관계없이gcloud
명령어에--enable-legacy-lustre-port
를 포함해야 합니다. 이 플래그가 없으면 GKE 클러스터가 기존 Lustre 인스턴스를 마운트하지 못합니다.gke-support-enabled
플래그에 대한 자세한 내용은 인스턴스 만들기의 선택적 플래그 설명을 참고하세요.
- 이전 GKE 버전: GKE 클러스터에서
기본 포트 988
또는 기존 포트 6988
를 사용하도록 새 클러스터와 기존 클러스터를 구성할 수 있습니다.
새 GKE 클러스터에서 관리형 Lustre CSI 드라이버 사용 설정
다음 섹션에서는 새 GKE 클러스터에서 관리형 Lustre CSI 드라이버를 사용 설정하는 방법을 설명합니다.
기본 포트 988
사용
버전 1.33.2-gke.4780000
이상을 실행하는 새 GKE 클러스터를 만들 때 관리형 Lustre CSI 드라이버를 사용 설정하려면 다음 명령어를 실행합니다.
Autopilot
gcloud container clusters create-auto "${CLUSTER_NAME}" \
--location=${LOCATION} \
--network="${NETWORK_NAME}" \
--cluster-version=${CLUSTER_VERSION} \
--enable-lustre-csi-driver
표준
gcloud container clusters create "${CLUSTER_NAME}" \
--location=${LOCATION} \
--network="${NETWORK_NAME}" \
--cluster-version=${CLUSTER_VERSION} \
--addons=LustreCsiDriver
기존 포트 6988
사용
1.33.2-gke.4780000
이전 버전을 실행하는 새 GKE 클러스터를 만들 때 관리형 Lustre CSI 드라이버를 사용 설정하려면 다음 명령어를 실행합니다.
Autopilot
gcloud container clusters create-auto "${CLUSTER_NAME}" \
--location=${LOCATION} \
--network="${NETWORK_NAME}" \
--cluster-version=${CLUSTER_VERSION} \
--enable-lustre-csi-driver \
--enable-legacy-lustre-port
표준
gcloud container clusters create "${CLUSTER_NAME}" \
--location=${LOCATION} \
--network="${NETWORK_NAME}" \
--cluster-version=${CLUSTER_VERSION} \
--addons=LustreCsiDriver \
--enable-legacy-lustre-port
기존 GKE 클러스터에서 관리형 Lustre CSI 드라이버 사용 설정
다음 섹션에서는 기존 GKE 클러스터에서 관리 Lustre CSI 드라이버를 사용 설정하는 방법을 설명합니다.
기본 포트 988
사용
버전 1.33.2-gke.4780000
이상을 실행하는 기존 GKE 클러스터에서 관리형 Lustre CSI 드라이버를 사용 설정하려면 다음 명령어를 실행합니다.
gcloud container clusters update ${CLUSTER_NAME} \
--location=${LOCATION} \
--update-addons=LustreCsiDriver=ENABLED
기존 포트 6988
사용
기존 GKE 클러스터에서 관리형 Lustre CSI 드라이버를 사용 설정하려면 --enable-legacy-lustre-port
플래그를 추가하여 기존 포트 6988
를 사용해야 할 수 있습니다. 이 플래그는 다음 시나리오에서 필요합니다.
- GKE 클러스터가
1.33.2-gke.4780000
이전 버전에서 실행되는 경우 이 클러스터를
gke-support-enabled
플래그로 만든 기존 Managed Lustre 인스턴스에 연결하려는 경우gcloud container clusters update ${CLUSTER_NAME} \ --location=${LOCATION} \ --enable-legacy-lustre-port
기존 클러스터에서 노드 업그레이드 필요
기존 클러스터에서 관리 Lustre CSI 드라이버를 사용 설정하면 관리 Lustre 클라이언트에 필요한 커널 모듈을 업데이트하기 위해 노드 재생성이 트리거될 수 있습니다. 즉시 사용하려면 노드 풀을 수동으로 업그레이드하는 것이 좋습니다.
출시 채널의 GKE 클러스터는 예약된 출시 일정에 따라 업그레이드되며, 유지보수 기간에 따라 몇 주가 걸릴 수 있습니다. 정적 GKE 버전을 사용하는 경우 노드 풀을 수동으로 업그레이드해야 합니다.
노드 풀 업그레이드 후 CPU 노드가Google Cloud 콘솔 또는 CLI 출력에서 GPU 이미지를 사용하는 것으로 표시될 수 있습니다. 예를 들면 다음과 같습니다.
config:
imageType: COS_CONTAINERD
nodeImageConfig:
image: gke-1330-gke1552000-cos-121-18867-90-4-c-nvda
이는 예상되는 동작입니다. 관리형 Lustre 커널 모듈을 안전하게 설치하기 위해 CPU 노드에서 GPU 이미지가 재사용됩니다. GPU 사용량에 대한 요금이 청구되지 않습니다.
관리형 Lustre CSI 드라이버 사용 중지
Google Cloud CLI를 사용하여 기존 GKEcluster에서 관리형 Lustre CSI 드라이버를 사용 중지할 수 있습니다.
gcloud container clusters update ${CLUSTER_NAME} \
--location=${LOCATION} \
--update-addons=LustreCsiDriver=DISABLED
CSI 드라이버가 사용 중지되면 GKE는 노드를 자동으로 다시 만들고 관리형 Lustre 커널 모듈을 제거합니다.
관리형 Lustre CSI 드라이버를 사용하여 새 볼륨 만들기
다음 섹션에서는 GKE에서 관리형 Lustre 인스턴스가 지원하는 Kubernetes 볼륨을 만드는 일반적인 프로세스를 설명합니다.
StorageClass 만들기
관리형 Lustre CSI 드라이버가 사용 설정되면 GKE는 관리형 Lustre 인스턴스를 프로비저닝할 수 있도록 StorageClass를 자동으로 만듭니다. StorageClass는 관리형 Lustre 성능 등급에 따라 달라지며 다음 중 하나입니다.
lustre-rwx-125mbps-per-tib
lustre-rwx-250mbps-per-tib
lustre-rwx-500mbps-per-tib
lustre-rwx-1000mbps-per-tib
GKE는 지원되는 각 관리 Lustre 성능 등급에 기본 StorageClass를 제공합니다. 이렇게 하면 자체 StorageClass를 정의하지 않고도 기본 제공 StorageClass를 사용할 수 있으므로 관리 Lustre 인스턴스의 동적 프로비저닝이 간소화됩니다.
영역 클러스터의 경우 CSI 드라이버는 클러스터와 동일한 영역에 관리형 Lustre 인스턴스를 프로비저닝합니다. 리전 클러스터의 경우 리전 내 영역 중 하나에 인스턴스를 프로비저닝합니다.
다음 예시에서는 특정 토폴로지 요구사항이 있는 맞춤 StorageClass를 만드는 방법을 보여줍니다.
lustre-class.yaml
이라는 파일에 다음 매니페스트를 저장합니다.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: lustre-class provisioner: lustre.csi.storage.gke.io volumeBindingMode: Immediate reclaimPolicy: Delete parameters: perUnitStorageThroughput: "1000" network: LUSTRE_NETWORK allowedTopologies: - matchLabelExpressions: - key: topology.gke.io/zone values: - us-central1-a
StorageClass에서 지원되는 필드의 전체 목록은 관리형 Lustre CSI 드라이버 참조 문서를 참고하세요.
다음 명령어를 실행하여 StorageClass를 만듭니다.
kubectl apply -f lustre-class.yaml
PersistentVolumeClaim을 사용하여 볼륨에 액세스
이 섹션에서는 관리형 Lustre CSI 드라이버의 StorageClass를 참조하는 PersistentVolumeClaim 리소스를 만드는 방법을 보여줍니다.
lustre-pvc.yaml
이라는 파일에 다음 매니페스트를 저장합니다.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: lustre-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 9000Gi storageClassName: lustre-class
PersistentVolumeClaim에서 지원되는 필드의 전체 목록은 관리형 Lustre CSI 드라이버 참조 문서를 참고하세요.
다음 명령어를 실행하여 PersistentVolumeClaim을 만듭니다.
kubectl apply -f lustre-pvc.yaml
볼륨을 사용하는 워크로드 만들기
이 섹션에서는 앞에서 만든 PersistentVolumeClaim 리소스를 사용하는 포드를 만드는 방법에 대한 예시를 보여줍니다.
포드 여러 개에서 같은 PersistentVolumeClaim 리소스를 공유할 수 있습니다.
my-pod.yaml
파일에 다음 매니페스트를 저장합니다.apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: nginx image: nginx volumeMounts: - name: lustre-volume mountPath: /data volumes: - name: lustre-volume persistentVolumeClaim: claimName: lustre-pvc
클러스터에 매니페스트를 적용합니다.
kubectl apply -f my-pod.yaml
Pod가 실행 중인지 확인합니다. 포드는 PersistentVolumeClaim이 프로비저닝된 후에 실행됩니다. 이 작업을 완료하려면 몇 분 정도 걸릴 수 있습니다.
kubectl get pods
출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE my-pod 1/1 Running 0 11s
Managed Lustre 볼륨에서 fsGroup 사용
마운트된 파일 시스템의 루트 수준 디렉터리의 그룹 소유권을 변경하여 포드의 SecurityContext에 지정된 사용자 요청 fsGroup과 일치시킬 수 있습니다. fsGroup은 마운트된 전체 관리 Lustre 파일 시스템의 소유권을 재귀적으로 변경하지 않습니다. 마운트 지점의 루트 디렉터리만 영향을 받습니다.
문제 해결
문제 해결 안내는 Managed Lustre 문서의 문제 해결 페이지를 참고하세요.
삭제
Google Cloud 계정에 비용이 청구되지 않게 하려면 이 가이드에서 만든 스토리지 리소스를 삭제합니다.
포드와 PersistentVolumeClaim을 삭제합니다.
kubectl delete pod my-pod kubectl delete pvc lustre-pvc
PersistentVolume 상태를 확인합니다.
kubectl get pv
출력은 다음과 비슷합니다.
No resources found
기본 관리 Lustre 인스턴스가 완전히 삭제되는 데 몇 분 정도 걸릴 수 있습니다.