워크로드에 StorageClass 사용

GKE on AWS는 클러스터에서 Amazon EBS 볼륨 프로비저닝 및 관리를 위해 Amazon Elastic Block Store(EBS)용 컨테이너 스토리지 인터페이스(CSI) 드라이버를 자동으로 배포합니다.

GKE on AWS EBS CSI 드라이버 버전은 GKE on AWS Kubernetes 버전과 연결되어 있습니다. 일반적으로 드라이버 버전은 GKE 버전 출시 시점에 사용 가능한 최신 버전입니다. 클러스터가 업그레이드되면 드라이버가 자동으로 업데이트됩니다.

기본 StorageClass 사용 방법

spec.storageClassName 필드를 설정하지 않고 PersistentVolumeClaim을 만들면 기본 GKE on AWS EBS CSI 드라이버 StorageClass를 사용하여 gp2 볼륨이 프로비저닝됩니다.

다음 YAML은 크기가 30기비바이트인 mypvc라는 PersistentVolumeClaim(PVC)을 만듭니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

사전 설치된 다른 StorageClass 사용 방법

GKE on AWS EBS CSI 드라이버에는 또한 높은 처리량의 io1 볼륨을 프로비저닝하는 premium-rwo StorageClass가 포함됩니다.

PVC의 spec.storageclassName에 지정하여 사용할 수 있습니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  storageclassName: premium-rwo

커스텀 StorageClass 사용 방법

EBS 볼륨에 대해 추가 StorageClass를 만들거나 컨테이너 스토리지 인터페이스(CSI) 드라이버를 사용할 수 있습니다.

  1. EBS 볼륨 또는 특정 CSI 드라이버를 사용할지 선택합니다.

    EBS 볼륨

    EBS 볼륨 유형, 파일 시스템 유형, 다른 매개변수를 지정하는 고유 커스텀 StorageClass를 만들 수 있습니다. GKE on AWS EBS CSI 드라이버 GitHub 페이지에서 추가 StorageClass 매개변수를 찾을 수 있습니다.

    커스텀 StorageClass를 구성하려면 다음 YAML 매니페스트를 my-custom-class.yaml 파일에 복사합니다.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: ebs.csi.aws.com
    volumeBindingMode: WaitForFirstConsumer
    

    CLASS_NAME을 새 StorageClass 이름으로 바꿉니다.

    예를 들어 다음 YAML은 XFS 파일 시스템으로 포맷된 처리량 최적화 HDD EBS 볼륨을 프로비저닝하는 새 StorageClass를 만듭니다.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-class
    provisioner: ebs.csi.aws.com
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    

    CSI 드라이버

    provisioner 필드에 다른 CSI 드라이버를 지정할 수 있습니다.

    다른 CSI 드라이버를 사용하여 StorageClass를 만들려면 아래 YAML 예시를 사용하면 됩니다.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: CSI_DRIVER_NAME
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      ...
    

    다음을 바꿉니다.

    • CSI_DRIVER_NAME을 CSI 드라이버의 이름으로 바꿉니다(예: csi.example.com).
    • CLASS_NAME을 StorageClass 이름으로 바꿉니다(예: my-custom-class).

    CSI 드라이버에 따라 parameters 아래에서 하위 필드를 구성합니다.

  2. YAML을 클러스터에 적용합니다.

    kubectl apply -f my-custom-class.yaml
    

커스텀 StorageClass로 PersistentVolumeClaim을 만드는 방법

  1. 커스텀 StorageClass가 생성되면 PVC에서 지정할 수 있습니다. 아래 예시에서는 StorageClass my-custom-class를 참조하는 my-pvc라는 이름의 PVC를 만듭니다.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 30Gi
      storageclassName: my-custom-class
    

기본 StorageClass 설정 방법

AWS용 GKE는 gp2 EBS 볼륨을 프로비저닝하는 standard-rwo라는 기본 StorageClass를 사용합니다. 기본값을 다른 StorageClass로 변경할 수 있습니다.

기본 StorageClass를 변경하려면 다음 안내를 따르세요.

  1. standard-rwo StorageClass의 is-default-class 주석을 kubectl patch로 업데이트합니다.

    kubectl patch storageclass standard-rwo -p \
    '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    
  2. storageclass.kubernetes.io/is-default-class: true 주석이 있는 새 StorageClass를 만듭니다.

    다음 StorageClass 예시에서는 ebs.csi.aws.com 드라이버를 사용합니다. 다른 스토리지 드라이버를 설치하려면 CSI 드라이버 설치를 참조하세요.

    다음 YAML을 my-custom-class.yaml이라는 파일에 복사합니다.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
      annotations:
        storageclass.kubernetes.io/is-default-class: true
    provisioner: ebs.csi.aws.com
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: EBS_VOLUME_TYPE
    

    다음을 바꿉니다.

    • EBS_VOLUME_TYPE: StorageClass가 만드는 AWS EBS 볼륨 유형입니다.
    • CLASS_NAME을 새 StorageClass의 이름으로 바꿉니다.

    예를 들어 다음 YAML은 XFS 파일 시스템으로 포맷된 처리량 최적화 HDD EBS 볼륨을 프로비저닝하는 새 기본 StorageClass를 만듭니다.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-default-class
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
    provisioner: ebs.csi.aws.com
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    
  3. 새 커스텀 클래스를 클러스터에 적용합니다.

    kubectl apply -f my-custom-class.yaml
    

이 매니페스트를 적용한 후 GKE on AWS는 새 스토리지 요청에 my-custom-default-class StorageClass를 사용합니다.

StatefulSet에서 StorageClass 참조

새 StorageClass를 사용하려면 StatefulSet의 volumeClaimTemplates에서 이를 참조해야 합니다.

StatefulSet의 volumeClaimTemplates 사양에서 StorageClass를 참조하면 Kubernetes는 PersistentVolume(PV)을 사용하여 안정적인 스토리지를 제공합니다. Kubernetes는 StorageClass에 정의된 프로비저닝 도구를 호출하여 새 스토리지 볼륨을 만듭니다. 볼륨이 프로비저닝되면 Kubernetes가 PV를 자동으로 만듭니다.

다음 StatefulSet는 my-custom-class StorageClass를 참조하고 1기비바이트 볼륨을 프로비저닝합니다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # This is the specification in which you reference the StorageClass
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
      storageClassName: my-custom-class # This field references the existing StorageClass

다음 단계