说说 KubeVirt 中的数据存储方案

作者: 王炳明 分类: Kubernetes 发布时间: 2021-06-09 18:32 热度:3,639

spec.volumes 下可以指定多种类型的卷:

  • cloudInitConfigDrive:在KubeVirt中使用 Cloud-init 中已经有详细介绍
  • cloudInitNoCloud:在KubeVirt中使用 Cloud-init 中已经有详细介绍
  • containerDisk:指定一个包含 qcow2 或 raw 格式的 docker 镜像,重启 vm 数据会丢失
  • dataVolume:动态创建一个 PVC,并用指定的磁盘映像填充该 PVC,重启 vm 数据不会丢失
  • downwardAPI:不清楚用途。。
  • emptyDisk:从宿主机上分配固定容量的空间,映射到vm中的一块磁盘,与 emptyDir 一样,emptyDisk 的生命周期与 vm 等同,重启 mv 数据会丢失
  • ephemeral:在虚机启动时创建一个临时卷,虚机关闭后自动销毁,临时卷在不需要磁盘持久性的任何情况下都很有用。
  • hostDisk:在宿主机上创建一个 img 镜像文件,挂给虚拟机使用。重启 vm 数据不会丢失。
  • persistentVolumeClaim:指定一个 PVC 创建一个块设备。重启 vm 数据不会丢失。
  • secret:使用 K8S 的 secret 来存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。并把这些信息注入给虚拟机,如果是可以动态更新到 Pod,但是不能修改 Pod 中生成的 iso 文件,更不能更新到 vm。要想更新,只有重启 vm。
  • configMap:能类似为 secret,把 configMap 里的信息写入到 iso 磁盘中,挂给虚拟机。
  • serviceAccount:功能类似为 secret,把 serviceAccount 里的信息写入到 iso 磁盘中,挂给虚拟机。
  • sysprep:以 secret 或 configMap的形式,往虚机写入 sysprep

emptyDisk

在 yaml 中指定如下相关内容

...more
      domain:
          disks:
          - name: bootdisk
            disk:
              bus: virtio
          - name: emptydisk
            disk:
              bus: virtio
...more
      volumes:
      - name: bootdisk
        containerDisk:
          image: 192.168.56.200:5000/centos72:v3
      - name: emptydisk
        emptyDisk:
          capacity: 2Gi
...more

创建完虚拟机后,就可以在虚机看到这块 2G 的磁盘

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0   40G  0 disk 
└─vda1 253:1    0   40G  0 part /
vdb    253:16   0  368K  0 disk 
vdc    253:32   0    2G  0 disk 

对它进行格式化,然后挂载到 /mnt 下,并创建一个文本文件

$ mkfs.ext4 /dev/vdc
$ mount /dev/vdc /mnt
$ echo "k8s" >hello.txt

重启虚拟机,再次挂载,查看文件是否存在?结果是挂载不了,没有格式化,说明数据被清空了

$ kubectl virt  stop test-vm
$  kubectl virt  start test-vm
$  kubectl virt  console test-vm
$ mount /dev/vdc /mnt
[  349.509706] SGI XFS with ACLs, security attributes, no debug enabled
mount: /dev/vdc is write-protected, mounting read-only
mount: unknown filesystem type '(null)'

HostDisk

在 yaml 中指定如下内容

...more
      domain:
          disks:
          - name: bootdisk
            disk:
              bus: virtio
          - name: hostdisk
            disk:
              bus: virtio
...more
      volumes:
      - name: bootdisk
        containerDisk:
          image: 192.168.56.200:5000/centos72:v3
      - name: hostdisk
        hostDisk:
          capacity: 50Gi
          path: /data/disk.img
          type: DiskOrCreate
...more

由于指定的 type 是 DiskOrCreate,因此即使 worker 上没有 /data/disk.img 文件,也会自动为人创建 50Gi 的 img 文件。

persistentVolumeClaim

先创建 PV 和 PVC 先在 worker 上创建一个分区 /dev/sda2

$ fdisk /dev/sda
Command (m for help): n
Partition number (2-14,16-128, default 2): 
First sector (34-2047): 34
Last sector, +sectors or +size{K,M,G,T,P} (34-2047, default 2047): +20 
Created partition 2
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda       8:0    0   10G  0 disk 
├─sda1    8:1    0   10G  0 part 
├─sda2    8:2    0 1007K  0 part 
└─sda15   8:15   0    8M  0 part 
vda     253:0    0   40G  0 disk 
└─vda1  253:1    0   40G  0 part /
loop0     7:0    0   10G  0 loop 

然后指定这个分区,创建 pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Block
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /dev/sda2
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - worker02

然后创建 pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pvc
  namespace: default
spec:
  accessModes: ["ReadWriteOnce"]
  storageClassName: local-storage
  volumeMode: Block
  resources:
    requests:
      storage: 1Gi

然后指定这个 PVC 去创建

...more
      domain:
        devices:
          disks:
          - name: pvc-disk
            disk:
              bus: virtio
...more
      volumes:
      - name: pvc-disk
        persistentVolumeClaim: 
          claimName: local-pvc
...more

创建后就可以在虚拟机里 lsblk 看到这块盘。

Secret/configMap/serviceAccount

创建一个 secret

# 将信息写入userdata文件中
cat << END>userdata
#cloud-config
vhost_queues: 2
admin_pass: "6nWR5NgAU/F/mcDwJeiQk6Um0vEq26tZ8MYVTMWa39M5FCQzlHJU5fM7lkxfN1Dfj/3Zxfw4DfiwLzUDZAmWLkl.YNdmfqvwQZz."
END

# 创建 secret
$ kubectl create secret generic vmi-userdata-secret --from-file=userdata=userdata

指定这个 secret 创建虚拟机

...more
      domain:
        devices:
          disks:{}
          - name: app-secret-disk
            # set serial
            serial: D23YZ9W6WA5DJ487
...more
      volumes:
      - name: app-secret-disk
        secret:
          secretName: vmi-userdata-secret
...more

创建出来 的虚拟机会出多个 /dev/sda 设备,查看他的序列号,刚好和我们指定的一致

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  372K  0 disk 
vda    253:0    0   40G  0 disk 
└─vda1 253:1    0   40G  0 part /
vdb    253:16   0  368K  0 disk 
vdc    253:32   0 1007K  0 disk 

$ lsblk --nodeps -no name,serial | grep D23YZ9W6WA5DJ487
sda  D23YZ9W6WA5DJ487

$ mount /dev/sda /mnt
$ cd /mnt/ &&  ls -l
total 1
-rw-r--r-- 1 root root 85 Jun  9 05:25 networkdata
$ cat networkdata 
#cloud-config
vhost_queues: 2
admin_pass: "/F/mc/3Zxfw4DfiwLzUDZAmWLkl.YNdmfqvwQZz."

containerDisk

指定一个 image 做为系统盘创建虚拟机,系统盘的数据不能持久化,每一次重启都是一个全新的虚拟机。

apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
  name: testvm
spec:
  running: true
  template:
    metadata:
      labels:
        kubevirt.io/size: small
        kubevirt.io/domain: testvm
    spec:
      domain:
        devices:
          disks:
            - name: containerdisk
              disk:
                bus: virtio
          interfaces:
          - name: default
            bridge: {}
      networks:
      - name: default
        pod: {}
      volumes:
        - name: containerdisk
          containerDisk:
            image: quay.io/kubevirt/cirros-container-disk-demo

文章有帮助,请作者喝杯咖啡?

发表评论