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가 준비되어 있습니다.
기본적으로 스토리지 확장 매개변수allowVolumeExpansion
가 false
이므로 변경해야 합니다.
## "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점에 주의합시다.
kubelet 설정, StorageClass 설정, PVC 확장을 차례로 설명합니다.
kubelet 설정
Cloudformation의 작업자 노드 시작 시 설정에 "BootstrapArguments"항목이 있으므로 거기에 kubelet 설정을 추가합니다.
--kubelet-extra-args "--feature-gates=ExpandInUsePersistentVolumes=true"
워커 노드의 설정은 미리 넣어 두지 않으면 의미가 없다는 것에 주의합시다. 예를 들어 작업자 노드를 만든 후 SSH를 사용하여 설정을 변경해도 자동 복구로 시작된 새 작업자 노드에는 설정이 반영되지 않습니다.
StorageClass 설정
EKS에는 미리
gp2
라는 StorageClass가 준비되어 있습니다.기본적으로 스토리지 확장 매개변수
allowVolumeExpansion
가 false
이므로 변경해야 합니다.## "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점에 주의합시다.
Deployment의 경우
절차는 다음과 같습니다.
pvc.yaml
의 spec.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 만 삭제합니다. spec.resources.requests.storage
의 값을, StatefulSet의 매니페스트 파일 statefulset.yaml
의 spec.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은 균등성을 유지하기 위해 무리한 방법을 취하고 있습니다만, 지금의 다른 방법이 없을 것 같습니다.
Reference
이 문제에 관하여(EKS로 PersistentVolume에 연결되는 EBS의 크기 확장을 제로 다운 타임으로 실시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/samskeyti/items/7255fdf91f95e71226e8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(EKS로 PersistentVolume에 연결되는 EBS의 크기 확장을 제로 다운 타임으로 실시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/samskeyti/items/7255fdf91f95e71226e8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)