Kubernetes 소스 분석의 저장 관련
전언
kubernetes에서 저장과 관련된 controller는 주로 세 가지가 있다. 첫째,AttachDetachController, 약칭ADController로 실제 volume와 관련된 조작을 처리한다.2. PersistentVolumeBinder Controller는 사실 PV Controller로 주로 pv와 pvc의 생명주기와 상태의 전환을 책임진다.3. VolumeExpandController는 주로volume의 용량 확장 작업을 책임진다.
PersistentVolumeBinderController
우선 PersistentVolumeBinder Controller 방법을 추적하고 Run 방법에 직접 들어갑니다.직관적이고 세 개의 고루틴에 의존한다.
1、resync;
2、volumeWorker;
3、claimWorker.
resync
resync에 들어가면 코드는 매우 간단하다. 다음과 같다. resync의 주요 역할은 pvc와 pv의 정보를 끊임없이 얻고 해당하는 캐시 대기열에 전송하는 것이다.이 두 대기열은volumeWorker와claimWorker에서 사용하는 데이터 원본의 정보입니다.
volumeWorker
volumeWorker는 for 순환을 통해 resync 버퍼의 대기열 정보를 끊임없이 얻고 pv, 즉volume에 해당하는 업데이트 작업을 합니다.주요 실현 방법
updateVolume
진입updateVolume
방법, 주요 호출syncVolume
방법, 이 방법은 전체volumeWorker의 핵심이다.워크플로우는 다음과 같습니다.1、volume가 사용되지 않으면 PV 상태를 업데이트합니다
Available
; 2、volume는 이미 pvc가 보유하고 있다.
Available
으로 업데이트합니다.Released
이 아니라 Failed
이 아니며 갱신 PV 상태는 Released
이고 설정된 회수 정책에 따라 pv의 회수(reclaimVolume
방법을 호출한다).Bound
이다.claimWorker
claimWorker의 작업 절차는volumeWorker와 유사하며 핵심 호출 방법은
updateClaim-->syncClaim
이다. 주로 pvc 생명주기 중의 각종 상태인 펜딩, Bound, Lost를 처리한다.군말을 많이 하지 않다.총결산
Persistent Volume Binder Controller의 실행 절차는 매우 명확하고 세 개의goroutine의 협업에 의존하여 데이터의 획득, pv의 생명주기 상태 업데이트와 pvc의 생명주기 상태 업데이트를 각각 처리한다.전체 논리에서 구체적인volume에 대한 조작이 없고 업데이트된 것은kubernetes에서 정의한 pv와 pvc자원에 대한 정보일 뿐이다. 말하자면 etcd의 데이터이다.구체적으로 일하는 것은 주로 AD Controller, 즉 AD Controller이다.
AttachDetachController
먼저
Run
메서드로 AD Controller를 시작하는 방법은 다음과 같습니다. 주로 다음과 같은 몇 가지 단계가 시작됩니다.1. 각 자원의 정보를 동기화하는데 Pod, Node, PV, PVC를 포함한다.
2, 호출
populateActualStateOfWorld
메서드에서 Volume 정보를 얻는 방법3. 호출
populateDesiredStateOfWorld
방법으로Pod에 대응하는 Volume 정보를 얻기;4、
reconciler.Run
은 마운트 상태를 검사하고 마운트 또는 마운트가 필요한지 판단한다(진짜 일하는 사람).5、
desiredStateOfWorldPopulator.Run
동시 Pod 및 Volume 마운트 정보, 해당 정보를reconciler.Run
사용;6、
pvcWorker
pvc의 흐름 제어를 제어한다.7. 상응하는 정보를 등록한다
metrics
은 Prometheus에서 데이터를 수집하는 데 사용됩니다.populateActualStateOfWorld
populateActualStateOfWorld
방법은 주로 Node와 Volume 간의 관계를 처리하는데 주요 역할은 Node Volume의 현재 상태를 actualStateOfWorld
에 저장하는 것이다.주요 방법은 다음과 같습니다. 주요 단계는 다음과 같습니다.1. 모든 노드 정보를 얻기;
2. 획득한 모든 노드를 일일이 훑어보며 노드에 대한
attached
의 Volume은 이미attached 상태와in-user
상태, Volume 정보 추가actualStateOfWorld
에 Node 추가desiredStateOfWorld
중.actualStateOfWorld
및desiredStateOfWorld
의 데이터는reconciler.Run
을 사용합니다.populateDesiredStateOfWorld
populateDesiredStateOfWorld
방법은 주로 Pod와 Volume 간의 관계를 처리하는데 주요 역할은 Pod Volume이 기대하는 상태를 desiredStateOfWorld
에 추가하는 것이다.populateActualStateOfWorld
과 유사하게 Volume에 대한 태그 작업을 하고 해당되는 Pod 정보를 desiredStateOfWorld
에 캐시하거나 desiredStateOfWorld
에서 일치하지 않는 Pod 정보를 제거한다.desiredStateOfWorldPopulator.Run
desiredStateOfWorldPopulator.Run
방법은 끊임없는 순환을 통해 findAndAddActivePods
방법을 호출하여 모든Pod를 획득하여 desiredStateOfWorld
에 추가해야 하는지 판단한다.reconciler.Run
앞의 몇 가지 주요 목적은 Node Volume과Pod Volume의 상태를 얻기 위한 것이다.그 중에서 노드의 볼륨은 이미 존재하기 때문에
actualStateOfWorld
이라고 하고 포드볼륨은 최종적으로 효력이 발생하는 자원이기 때문에 desiredStateOfWorld
이라고 한다.reconciler.Run
의 역할은 끊임없이 actualStateOfWorld
과 desiredStateOfWorld
의 상태를 가져와 Pod와 Volume을 상응하는 상태로 두어 디스크의 최종 마운트가 성공하거나 마운트가 해제되는 것을 확보하는 것이다.주요 방법은 다음과 같다. 끊임없이 순환하여 호출한다.reconciliationLoopFunc
방법.먼저 들어간다
reconcile
방법, 이곳은 진정으로 일하는 곳입니다.reconcile
은 세 가지 큰 for 순환을 사용하여 세 가지 이벤트를 처리합니다.1、우선 묶음을 풀어야 하는 Volume을 제거하고, 호출
UnmountVolume
방법은 백엔드 메모리의 해제 인터페이스를 최종적으로 호출한다.2. Attach 또는 Mount가 필요한volumes에서 백엔드 저장 인터페이스를 호출하여Attach 또는 Mount 작업을 수행한다.
3. Detach 또는 Unmount가 필요한 devices에서 백엔드 저장 인터페이스를 호출하여Detach 또는 Unmount 작업을 수행한다.
여기서 Attach 작업은 일반적인 볼륨 레이블과 같이 Volume을 Node에 생성하는 것을 의미합니다.
/dev/xx
등.MountDevice는 MountDevice와 Mount의 두 부분을 포함하는데, 그 중에서 MountDevice는 생성된 볼륨 마크를 Node로 마운트하는 경로입니다./var/lib/kubelet/xx/kubernetes.io/xx
에서 서로 다른 저장소에 의존하여 Mount는 최종적으로 MountDevice가 생성한 경로와 Pod가 사용해야 하는 경로를 Mount로 나눈다. 일반적인 경로는/var/lib/kubelet/pods/xx/volumes/xx
. sync
메서드는 주로 Volume의 후속 작업을 완료합니다.Volume이 성공적으로 바인딩되지 않은 경우 Volume을 재구성하거나 묶음 해제합니다.ExpandController
Kubernetes는 1.8에서 볼륨 확장을 지원하기 시작했고 1.11 기능은 베타 단계에 있습니다.기본 코드는 다음과 같습니다.
pvcPopulator.Run
은 PVC의 변화를 감청한다. PVC의 Request 필드의 Storage 값이 Status의 것보다 크면 PVC 용량에 변화가 생겼고 확장이 필요하다는 뜻이다.이 경우 해당 PV 및 PVC 정보를resizeMap
에 갑니다.다음과 같습니다.syncResize
은 끊임없이 획득resizeMap
의 데이터가 변경되면ExpandVolume
방법은 확장 동작을 생성하고 디스크의 용량 확장과 PV, PVC의 상태 업데이트 작업을 완성한다.코드는 다음과 같습니다.총결산
Kubernetes의 저장소는 주로 Node,Pod,PV 및 PVC 네 가지 자원을 대상으로 한다.Node의 Volume 상태를 가져와 Pod의 Volume과 바인딩하여 볼륨 로드를 완료합니다.최종 귀속이나 해제 등 작업은 백엔드 저장소에 의존한다. 내장된 소스 저장소 플러그인이나 자신이 실현한 플러그인(FlexVolume 또는 CSI)을 포함한다.kubelet에는 노드의 Volume 리소스 정보를 관리하는
VolumeManager
이 함께 존재하며 기본 기능은 AD Controller와 일치합니다.kube-controller-manager의 --disable-attach-detach-reconcile-sync
매개 변수나 kubelet의 --enable-controller-attach-detach
매개 변수를 통해 kube-controller-manager가volume의attach/detach 조작을 실행하든지 kubelet이 해당하는 조작을 실행하든지 제어할 수 있다.전재 대상:https://juejin.im/post/5cf114d55188253cec305973
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.