목록으로

Programming Notes

쿠버네티스 v1.34: 볼륨 확장 실패로부터의 복구 (정식 버전 출시)

쿠버네티스에서 영구 볼륨을 확장하다가 오타를 낸 적이 있으신가요? 2TB를 지정하려다가 20TiB로 잘못 입력한 적은 없으신가요? 이 사소해 보이는 문제는 해결하기가 꽤 어려웠고, 이 프로젝트가 해결하는 데 거의 5년이 걸렸습니다. 스토리지 확장의 자동 복구 기능은 한동안 베타...

쿠버네티스에서 영구 볼륨을 확장하다가 오타를 낸 적이 있으신가요? 2TB를 지정하려다가 20TiB로 잘못 입력한 적은 없으신가요? 이 사소해 보이는 문제는 해결하기가 꽤 어려웠고, 이 프로젝트가 해결하는 데 거의 5년이 걸렸습니다. 스토리지 확장의 자동 복구 기능은 한동안 베타 버전으로 제공되었지만, v1.34 릴리스와 함께 이 기능이 **정식 버전(general availability)**으로 승격되었습니다.

볼륨 확장 실패로부터 수동으로 복구하는 것은 언제나 가능했지만, 일반적으로 클러스터 관리자(cluster-admin) 권한이 필요했고 번거로웠습니다 (자세한 내용은 위 링크를 참조하세요).

실수를 저지르고 즉시 깨달았다면 어떨까요? 쿠버네티스 v1.34에서는 영구 볼륨 클레임(PVC)의 요청 크기를 줄일 수 있으며, 이전에 요청했던 크기로의 확장이 아직 완료되지 않았다면 요청 크기를 수정할 수 있습니다. 쿠버네티스는 자동으로 이를 수정하기 위해 작동할 것입니다. 실패한 확장에 의해 소비된 모든 쿼터(quota)는 사용자에게 반환되며, 관련 영구 볼륨(PersistentVolume)은 사용자가 지정한 최신 크기로 조정될 것입니다.

이 모든 것이 어떻게 작동하는지 예시를 통해 설명해 드리겠습니다.

실패한 확장으로부터 복구하기 위해 PVC 크기 줄이기

데이터베이스 서버 중 하나의 디스크 공간이 부족하다고 가정해 봅시다. 이전에 지정했던 10TB에서 100TB로 PVC를 확장하려는데, 오타를 내서 1000TB로 지정했습니다.

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1000TB # 새로 지정된 크기 - 하지만 잘못되었습니다!

이제 디스크 배열의 디스크 공간이 부족하거나 클라우드 제공업체의 할당된 쿼터가 단순히 소진되었을 수 있습니다. 하지만 1000TB로의 확장은 절대 성공할 수 없다고 가정해 봅시다.

쿠버네티스 v1.34에서는 단순히 실수를 수정하고 새로운 PVC 크기를 요청할 수 있습니다. 단, 이 새로운 크기는 이전에 잘못 지정했던 크기보다는 작지만, 실제 영구 볼륨의 원래 크기보다는 여전히 커야 합니다.

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100TB # 수정된 크기; 10TB보다 커야 합니다.
      # 볼륨을 실제 크기보다 작게 줄일 수는 없습니다.

이 과정은 관리자의 개입을 필요로 하지 않습니다. 더욱 좋은 점은, 임시로 소비했던 쿠버네티스 쿼터가 자동으로 반환된다는 것입니다.

이러한 오류 복구 메커니즘에는 한 가지 주의할 점이 있습니다. PVC에 대해 지정하는 새로운 크기는 .status.capacity에 있는 원래 크기보다 여전히 높아야 합니다. 쿠버네티스는 PV 객체를 축소하는 것을 지원하지 않으므로, PVC 요청에 원래 할당되었던 크기보다 작게 만들 수는 없습니다.

볼륨 확장 시 향상된 오류 처리 및 가시성

겉보기에는 비교적 사소한 변경처럼 보일 수 있지만, 이를 구현하기 위해서는 쿠버네티스 내부에서 볼륨 확장이 작동하는 방식을 거의 전면적으로 재작업해야 했습니다. 이제 PVC 객체에서 볼륨 확장 진행 상황을 모니터링할 수 있는 새로운 API 필드가 제공됩니다.

진행 중인 확장 작업의 가시성 향상

PVC의 .status.allocatedResourceStatus['storage']를 쿼리하여 볼륨 확장 작업의 진행 상황을 모니터링할 수 있습니다. 일반적인 블록 볼륨의 경우, 이 필드는 ControllerResizeInProgress, NodeResizePending, NodeResizeInProgress 상태를 오가다가 볼륨 확장이 완료되면 nil/empty가 됩니다.

어떤 이유로든 요청된 크기로의 볼륨 확장이 불가능할 경우, ControllerResizeInfeasible 또는 NodeResizeInfeasible과 같은 상태가 됩니다.

또한 pvc.status.allocatedResources를 관찰하여 쿠버네티스가 작업 중인 크기를 확인할 수 있습니다.

향상된 오류 처리 및 보고

쿠버네티스는 이제 실패한 볼륨 확장을 더 느린 속도로 재시도할 것이며, 스토리지 시스템과 쿠버네티스 API 서버 모두에 대한 요청 수를 줄일 것입니다. 볼륨 확장 중에 관찰된 오류는 이제 PVC 객체의 조건(condition)으로 보고되며, 이벤트와 달리 지속됩니다. 쿠버네티스는 볼륨 확장이 실패할 때 pvc.status.conditions 필드를 ControllerResizeError 또는 NodeResizeError 오류 키로 채울 것입니다.

크기 조정 워크플로우의 오랜 버그 수정

이 기능은 또한 쿠버네티스 이슈 #115294와 같은 크기 조정 워크플로우의 오랜 버그를 수정할 수 있게 해주었습니다. 만약 어떤 문제가 발견되면, 문제를 재현하는 방법에 대한 세부 정보와 함께 https://github.com/kubernetes/kubernetes/issues로 버그를 보고해 주시기 바랍니다.

이 기능의 전체 라이프사이클에 걸쳐 작업하는 것은 도전적이었고, @msau42, @jsafrane, 그리고 @xing-yang의 피드백 없이는 GA에 도달할 수 없었을 것입니다. 이 작업에 참여한 모든 기여자들은 또한 다양한 쿠버네티스 기여자 서밋에서 @thockin@liggitt이 제공한 의견에 감사드립니다.