EKS로 PersistentVolume에 연결되는 EBS의 크기 확장을 제로 다운 타임으로 실시

5314 단어 ekskubernetesAWS

소개



PersistenVolumeClaim(PVC)을 사용하고 있는 Pod에 대해서 스토리지 사이즈 확장에 수반하는 재기동이 필요없는, 즉 제로 다운 타임으로 확장을 실시할 수 있는 방법을 Deployment와 StatefulSet의 2 패턴으로 설명합니다.

환경은 EKS, 외부 스토리지는 EBS를 가정합니다.

절차



kubelet 설정, StorageClass 설정, PVC 확장을 차례로 설명합니다.

kubelet 설정



Cloudformation의 작업자 노드 시작 시 설정에 "BootstrapArguments"항목이 있으므로 거기에 kubelet 설정을 추가합니다.
--kubelet-extra-args "--feature-gates=ExpandInUsePersistentVolumes=true"

워커 노드의 설정은 미리 넣어 두지 않으면 의미가 없다는 것에 주의합시다. 예를 들어 작업자 노드를 만든 후 SSH를 사용하여 설정을 변경해도 자동 복구로 시작된 새 작업자 노드에는 설정이 반영되지 않습니다.

StorageClass 설정



EKS에는 미리 gp2라는 StorageClass가 준비되어 있습니다.
기본적으로 스토리지 확장 매개변수allowVolumeExpansionfalse이므로 변경해야 합니다.
## "allowVolumeExpansion: true"を追記する。
$ kubectl edit storageclass gp2

## 変更内容を確認する。
$ kubectl get storageclass gp2 -o yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"},"name":"gp2"},"parameters":{"fsType":"ext4","type":"g    p2"},"provisioner":"kubernetes.io/aws-ebs"}
    storageclass.kubernetes.io/is-default-class: "true"
  creationTimestamp: 2019-08-13T03:34:59Z
  name: gp2
  resourceVersion: "70681"
  selfLink: /apis/storage.k8s.io/v1/storageclasses/gp2
  uid: 53ddc7e2-bd7b-11e9-a365-0a4781fb1e78
parameters:
  fsType: ext4
  type: gp2
provisioner: kubernetes.io/aws-ebs
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

PVC 확장



Deployment와 StatefulSet의 두 가지 패턴을 설명합니다. 둘 다 동적 프로비저닝에서 PV를 동적으로 생성한다고 가정합니다.

확장을 할 때는 아래의 2점에 주의합시다.
  • AWS에서는 1시간에 한 번만 볼륨을 확장하여 변경할 수 있습니다
  • .
  • 볼륨 크기를 원래 값보다 작을 수 없습니다

  • Deployment의 경우



    절차는 다음과 같습니다.
  • PVC 매니페스트 파일 pvc.yamlspec.resources.requests.storage 값을 변경합니다.
  • $ kubectl apply -f pvc.yaml에서 변경 사항을 반영합니다.

  • 실험으로 PVC를 8Gi에서 9Gi로 변경해 보겠습니다. 이 작업을 수행하면 자동으로 EBS 크기 조정이 시작됩니다. 아래 이미지를 보면 볼륨 상태가 in-use로 표시됩니다.


    이때 PVC를 확인해도 크기는 8Gi로 남아 있습니다.
    $ kubectl get pvc
    NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    sample           Bound     pvc-1a94f083-bdd3-11e9-adc6-0ed3a87e16f4   8Gi        RWO            gp2            20h
    

    잠시 후 상태가 in-use가 되었습니다.


    PVC를 확인해 봅니다. 크기가 9Gi로 바뀌고 있음을 알 수 있습니다.
    $ kubectl get pvc
    NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    sample           Bound     pvc-1a94f083-bdd3-11e9-adc6-0ed3a87e16f4   9Gi        RWO            gp2            20h
    

    StatefulSet의 경우



    PVC 리소스 스펙은 StatefulSet 매니페스트에서 spec.volumeClaimTemplates에 정의되어 있다고 가정합니다.
    이 시점에서 절차는 다음과 같습니다.
  • $ kubectl edit pvc <PVC>에서 spec.resources.requests.storage의 값을 변경합니다.
  • $ kubectl delete statefulset <STATEFULSET> --cascade=false에서 포드를 삭제하지 않고 StatefulSet 만 삭제합니다.
  • 1로 변경한 spec.resources.requests.storage의 값을, StatefulSet의 매니페스트 파일 statefulset.yamlspec.volumeClaimTemplates[].spec.resources.requests.storage에 기술한다.
  • $ kubectl apply -f statefulset.yaml에서 변경 사항을 반영합니다.

  • StatefulSet을 도중에 삭제하고 있습니다. 이는 PVC 매니페스트에 정의된 내용과 StatefulSet 매니페스트에 차이가 없기 때문입니다.

    StatefulSet spec.volumeClaimTemplates[].spec.resources.requests.storage을 직접 변경하고 kubectl apply 직접 다음 오류가 발생합니다.
    $ kubectl apply -f statefulset.yaml
    * spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden
    

    요약



    EKS에 배포한 Deployment, StatefulSet에 첨부된 EBS의 볼륨 확장을 제로 다운 타임으로 실시하는 방법을 설명했습니다.
    StatefulSet은 균등성을 유지하기 위해 무리한 방법을 취하고 있습니다만, 지금의 다른 방법이 없을 것 같습니다.

    좋은 웹페이지 즐겨찾기