Kubernetes 소스 분석의 저장 관련

5920 단어
이 절의 모든 코드는 1.13.4 버전을 바탕으로 한다.
전언
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가 보유하고 있다.
  • 만약volume가 pvc에 귀속되지 않았다면 PV 상태를 Available으로 업데이트합니다.
  • 만약에 pvc 정보가 비어 있다면 pv의 상태는 Released이 아니라 Failed이 아니며 갱신 PV 상태는 Released이고 설정된 회수 정책에 따라 pv의 회수(reclaimVolume 방법을 호출한다).
  • pvc에서 지정한volume의 필드는 현재volume와 일치하며 업데이트 PV 상태는 Bound이다.
  • 이 모두 만족하지 않으면 상태에 따라 회수 정책을 실행하는지 묶음(unbindVolume)을 해제하는지 판단합니다.

  • 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、 pvcWorkerpvc의 흐름 제어를 제어한다.
    7. 상응하는 정보를 등록한다metrics은 Prometheus에서 데이터를 수집하는 데 사용됩니다.
    populateActualStateOfWorld populateActualStateOfWorld 방법은 주로 Node와 Volume 간의 관계를 처리하는데 주요 역할은 Node Volume의 현재 상태를 actualStateOfWorld에 저장하는 것이다.주요 방법은 다음과 같습니다. 주요 단계는 다음과 같습니다.
    1. 모든 노드 정보를 얻기;
    2. 획득한 모든 노드를 일일이 훑어보며 노드에 대한attached의 Volume은 이미attached 상태와in-user 상태, Volume 정보 추가actualStateOfWorld에 Node 추가desiredStateOfWorld 중.actualStateOfWorlddesiredStateOfWorld의 데이터는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의 역할은 끊임없이 actualStateOfWorlddesiredStateOfWorld의 상태를 가져와 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

    좋은 웹페이지 즐겨찾기