Kubernetes

Kubevirt

chaenii 2022. 1. 12. 15:21

Kubervirt는 Kubernetes의 CRD를 통해 VM 및 VM 집합에 대한 리소스 유형을 추가해 Kubernetes를 확장한다.

Kubervirt를 사용하면 kubernetes platform을 사용해 애플리케이션 container와 vm을 나란히 실행하고 관리할 수 있다. 

 

kubervirt의 가장 큰 이점은 기본적은 Kubernetes 기능이 vm에도 적용된다는 점이다.

 

기본적인 kubernetes 기능

  • scheduling
  • storage
  • networking
  • monitoring
  • Orchestration

 

KubeVirt 구성 요소

 

Custom Resource Definitions

 

VM에 대한 CRD는 Virtual Machine Instanche에 대한 사양을 포함한다. VM은 Running/not running 상태 및 기타 레이블을 전달할 수 있는 VM Instance에 대한 추상화 계층 역할을 한다.

Virtual Machine Instance (VMI) 또한 custom object인데 실행중인 단일 가상 머신 인스턴스를 나타내는 개체이며 두 부분으로 구성된다.

  1. 스케줄링 결정을 내리는 정보
  2. 가상 머신 애플리케니션 바이너리 인터페이스에 대한 정보

vmi preset에 대한 요소

  • Memory
  • CPU
  • Storage
  • Networking

virt-controller

Kubernetes API Server에 새로운 VM 개체 생성 요청이 오면, VM이 실행될 Pod를 생성한다.

 

virt-handler (DaemonSet)

VM 개체의 변경 사항을 감시하고, 필요한 모든 상태를 충족하도록 VM을 변경하는 작업을 수행한다.

VM 사양을 참조해 VM의 Pod에서 libvirtd와 통신해 해당 Domain 생성을 알린다.

VM 개체가 삭제되면 삭제를 감지하고 도메인을 끈다.

 

virt-launcher

VM Process가 사용할 cgroup과 namespace를 제공하는 역할을 한다.

virt-handler가 VM의 CRD 개체를 virt-launcher에 전달하여 VM을 시작하도록 virt-launcher에 신호를 보낸다.

virt-launcher는 컨테이너 내의 local libvirtd instance를 사용하여 VM을 시작한다.

virt-launcher는 VM 프로세스를 모니터링하고 VM이 종료되면 종료된다.

 

libvirtd

libvirtd 인스턴스는 모든 VM Pod에 있으며, virt-launcher는 libvirtd를 사용해 VM Process의 lifecycle를 관리한다.

 

Kubevirt - CDI (Containerized Data importer)

내 Kubevirt VM에 호환되는 이미지는 어떻게 로드할까?

CDI는 Kubevirt와 함께 사용할 VM images를 가져오고 업로드하고 복제하도록 설계된 유틸리티이다.

외부 VM image를 가져와 Cluster Storage에 저장한다.

 

일반 사용자는 사용할 수 없는 Golden namespace가 있다. 이는 권한이 없는 사용자가 vm image를 import를 트리거하는 것을 방지하기 위한 것이다.

storage provisioner를 정의하기 위한 쿠버네티스 storage class이다. 'golden' pvc는 동적 프로비저닝이 활성화될 것으로 예상한다. 

 

 

1. 관리자는 대상 namespace에 CDI Deployment를 배포해서 CDI Controller를 초기화한다. Deployment
    namespace내에서 Controller를 시작하고 Controller의 한 인스턴스만 항상 실행되도록 한다. Controller는 소스      파일의 endpoint URL과 secret name(endpoint에 접근하기위해 인증정보가 필요한 경우에만)을 정의하고 있는        annotation을 포함하는 PVC를 감시하고 있다.

 

2. 만약에 소스코드 리포지토리에서 endpoint에 접근하기 위해서 인증 Credential가 필요하다면, 관리자는 golden         namespace에 한개 이상의 secret을 만들 수 있다.

 

3. 관리자는 golden namespace에 golden PVC를 만든다. PVC는 Dynamic Provisioning이 필요하며 원하는                 storageclass를 지정하거나 field를 생략해야한다. 이 PVC는 정의된 annotation을 가지고, controller에게                   ephemeral importer pod을 시작하라는 신호를 준다.

 

4. PVC가 생성됐을 때, StorageClass에서 참조하는 Dynamic Provisioning 도구가 실제 Storage Volume을 나타        내는 Persistent Volume을 생성한다.

 

5. Dynamic Provisioner는 storage volume을 생성한다. VM 이미지의 경우 단일 이미지에 대한 볼륨의 일대일 매핑      이 있다. 따라서 각 PVC는 단일 이미지를 나타낸다.

 

6. Controller에서 생성한 ephemeral importer pod는 secret을 바인딩하고 PVC를 거쳐 backing storgae                     volume에 마운트한다.

 

7. Importer Pod는 원격 데이터 저장소에서 탑재된 백업 저장소 볼륨으로 파일을 스트리밍하고 아카이브 해제, 압축        해제 및 qcow2-to-raw 변환을 수행한다 copy가 완료되면 importer pod 종료 대상 파일 이름은 항상 disk.img          (kubevirt 요구 사항)이지만 볼륨당 하나의 이미지가 있으므로 이름 충돌은 문제가 되지 않는다.

 

Components

CDI Deployment: Deployment의 namespace내에서 하나의 CDI controller를 관리하는 Kubernetes Deployment.

 

CDI Controller: 수명이 긴 Controller pod. controller는 특정 annotation을 찾아 namespace내의 PVC를 스캔한다.endpoint annotation으로 새 PVC를 감지하면 Controller는 Data Import Pod를 생성한다. Controller는 작업 완료시 Data Import Pod를 정리한다. 

 

Data Import Pod: golden namespace의 단기 Pod이다. Controller에 의해 생성되고, Secret과 PVC에 annotation이 달린 endpoint를 사용한다.  endpoint annotation에서 참조하는 단일 파일을 storage volume으로 스트리밍한다. 대상 파일 이름은 disk.img이다.

 

Dynamic Provisioner: 빈 Cluster Storage Volume을 참조하는 Golden Persistent Volume을 생성하는 기존의 Stoeage Provisioner. 관리자가 Golden PVC를 생성하면서 생성이 자동으로 시작된다.

 

Endpoint Secret: 관리자가 정의하고 생성한 Golden namespace의 Long-lived secret이다. Secret은 Object Store에서 요청하는 데 필요한 access key id와 secret key가 포함되어야한다. Secret은 Data Import pod에 의해 마운트된다.

 

"Golden" Namespace:  Golden PVC 및 endpoint Secrets에 대한 제한된/개인 namespace이다. 또한 CDI Controller 및 CDI Importer pod이 실행되는 namespace이다.

 

Golden PV: Dynamic Provisioner에서 생성하고 Data Import Pod에서 작성하는 Long-lived Persistent Volume. storage내의 Golden Image volume를 참조한다.

 

Golden PVC: "golden" 네임스페이스에서 관리자가 수동으로 생성한 수명이 긴 Persistent Volume Claim. storage class에 대한 참조를 통해 Dynamic Provisioner에 연결되고 동적으로 생성된 Golden PV에 자동으로 바인딩된다. 

  • cdi.kubevirt.io/storage.import.endpoint: Defined by the admin: the full endpoint URI for the source file/image
  • cdi.kubevirt.io/storage.import.secretName: Defined by the admin: the name of the existing Secret containing the credential to access the endpoint.
  • cdi.kubevirt.io/storage.import.status: Added by the controller: the current status of the PVC with respect to the import/copy process. Values include: ”In process”, “Success”, “ Failed”

Object Store: 임의의 URL 기반 storage location.

 

Storage Class: Persistent Volume Claims를 원하는 Dynamic Provisioner(들)에 연결하는 수명이 긴 기본 Storage Class이다. Golden PVC로 참조된다.

 

 

https://github.com/kubevirt/containerized-data-importer/blob/main/doc/design.md#design

 

GitHub - kubevirt/containerized-data-importer: Data Import Service for kubernetes, designed with kubevirt in mind.

Data Import Service for kubernetes, designed with kubevirt in mind. - GitHub - kubevirt/containerized-data-importer: Data Import Service for kubernetes, designed with kubevirt in mind.

github.com

 

 

 

반응형