kubevirt 存储 网络 监控
一、kubevirt 存儲
kubevirt 提供很多種存儲方式,存儲就決定了你使用虛擬機鏡像到底什么內核、什么版本,以下主要講述我看到三種比較常用的形式
虛擬機鏡像(磁盤)是啟動虛擬機必不可少的部分,目前 KubeVirt 中提供多種方式的虛擬機磁盤。
- cloudInitNoCloud/cloudInitConfigDrive:用于提供 cloud-init 初始化所需要的 user-data,使用 configmap 作為數據源,此時VMI 內部將出現第二塊大約為356KB的第二塊硬盤
dataVolume:虛擬機啟動流程中自動將虛擬機磁盤導入 pvc 的功能,在不使用 DataVolume 的情況下,用戶必須先準備帶有磁盤映像的 PVC,然后再將其分配給 VM 或 VMI。dataVolume 拉取鏡像的來源可以是HTTP、PVC。
PersistentVolumeClaim: PVC 做為后端存儲,適用于數據持久化,即在虛擬機重啟或關機后數據依然存在。PV 類型可以是 block 和 filesystem,為 filesystem 時,將使用 PVC 上的 disk.img,格式為 RAW 格式的文件作為硬盤。block 模式時,使用 block volume 直接作為原始塊設備提供給虛擬機。缺點在于僅支持RAW格式鏡像,若鏡像較大CDI 導入鏡像會比較慢(如果是QCW2 CDI 內部機制qemu.go 會將其進行格式轉換為RAW并導入PVC中),因此降低快速創建 VMI 體驗感
ephemeral、containerDisk: 數據是無法持久化,故在存儲選型上,我們采用 CEPH 作為后端存儲,通過調用Ceph CSI 插件創建 PVC 卷方式管理虛機磁盤設備。Ceph CSI 插件實現了容器存儲編排與Ceph集群交互的接口,它可以為容器應用分配 存儲集群中的存儲空間,同時在選擇 Ceph-CSI 版本需要考慮到當前 K8S 版本、及 CEPH 版本號
- registryDisk
定義image來創建虛擬機的root disk。 virt-controller會在pod定義中創建registryVolume的container,container中的entry服務負責 將spec.volumes.registryDisk.image轉化為qcow2格式,路徑為pod根目錄。
kubevirt 提供了registryDIsk的基礎鏡像: registry-disk-v1alpha, 根據Dockerfile形式去創建虛擬機鏡像,以下是window鏡像demo Dockerfile
FROM kubevirt/registry-disk-v1alpha COPY Windows---server-2012-datacenter-64bit-cn-syspreped---2018-01-15.qcow2 /disk/windows2012dc.img這個最終我們構建成鏡像名:windows2012dc:latest , 最終在CRD表現形式是這樣的
kind: VirtualMachineInstance ... spec:domain:devices:disks:- disk:bus: virtioname: registrydiskvolumeName: registryvolume ... - name: registryvolumeregistryDisk:image: windows2012dc:latest- PVC
PVC是持久化存儲鏡像的形式,它會被掛在到pod中,且格式必須滿足/disk/*.img,這樣kubevirt才能夠實現虛擬機存儲
- CDI
CDI是kubevirt自己提供的一種形式, 把registryDisk 轉換為PVC,這個需要消耗時間去講鏡像轉換為PVC持久化存儲下
二、網絡
虛擬機網絡就是pod網絡,virt-launcher pod網絡的網卡不再掛有pod ip,而是作為虛擬機的虛擬網卡的與外部網絡通信的交接物理網卡,virt-launcher實現了簡單的單ip dhcp server,就是需要虛擬機中啟動dhclient,virt-launcher 服務會分配給虛擬機。
kubernetes是Kubevirt 底座,提供了管理容器和虛擬機的混合部署的方式,存儲和網絡也是通過集成到kubernetes中, VMI 使用了POD進行通信。為了實現該目標,KubeVirt 的對網絡做了特殊實現。虛擬機具體的網絡如圖所示, virt-launcher Pod 網絡的網卡不再掛有 Pod IP,而是作為虛擬機的虛擬網卡的與外部網絡通信的交接物理網卡
在當前的場景我們使用經典的大二層網絡模型,用戶在一個地址空間下,VM 使用固定IP,在OpenStack社區,虛擬網絡方案成熟,OVS 基本已經成為網絡虛擬化的標準。所以我門選擇目前靈雀云(alauda) 開源的網絡方案:Kube-OVN,它是基于OVN的Kubernetes網絡組件,提供了大量目前Kubernetes不具備的網絡功能,并在原有基礎上進行增強。通過將OpenStack領域成熟的網絡功能平移到Kubernetes,來應對更加復雜的基礎環境和應用合規性要求
網絡 VLAN underlay
在網絡平面,管理網和 VMI 虛擬機流量分開,其中使用Vlan 模式的 underlay 網絡,容器網絡可以直接通過 vlan 接入物理交換機
虛擬機固定IP
k8s的資源是在運行時才分配ip的,但是筆者希望能夠對虛擬機的ip進行綁定從而實現固定ip的目的。為此,我們首先正常創建虛擬機,在虛擬機運行時k8s會為之分配ip,當檢測到虛擬機的ip后,我們通過替換vmi的配置文件的方式將ip綁定改虛擬機中。但是在實際操作時會報出如下錯誤:
Invalid value: 0x0: must be specified for an update實際上 Kubernetes API Server是支持樂觀鎖(Optimistic concurrency control)的機制來防止并發寫造成的覆蓋寫問題,因此在修改的body中需要加入metadata.resourceVersion,筆者的做法是首選調用 read_namespaced_virtual_machine方法獲取metadata.resourceVersion,其次再修改body。具體方案可參考:
https://www.codeleading.com/article/27252474726/三、監控
Kube-handler會去調用當前節點下所有虛擬機的libvirt API,獲取虛擬機的監控指標,并提供metrics 接口,最后通過kubevirt-prometheus-metrics聚合所有節點的kube-handler的指標數據,提供給prometheus使用
?
總結
以上是生活随笔為你收集整理的kubevirt 存储 网络 监控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: <Linux>计算机体系结构和操作系统
- 下一篇: CentOS7下利用qBittorren