跳转至

2.制作一个包含vm镜像的容器镜像

制作一个包含vm镜像的容器镜像

在 kubevirt中,可以直接使用containerDisk作为vm启动盘(VirtualMachine.spec.template.spec.volumes.containerDisk) 制作一个包含vm镜像的容器镜像步骤:

  1. 制作镜像,编写Dockerfile
    #FROM kubevirt/container-disk-v1alpha
    FROM registry.demo.com/kubevirt/container-disk-v1alpha:latest
    ADD ubuntu-22.04-server-cloudimg-amd64.img /disk
    
    注意事项:基础镜像使用kubevirt/container-disk-v1alpha;另外需要事先准备好vm镜像,此处以 ubuntu-22.04-server-cloudimg-amd64.img 为例 使用buildah命令制作镜像,可参考image-from-registry
    # buildah安装,直接使用 yum安装,openEuler的源是没有buildah的
    ### buildah 制作镜像操作步骤 ###
    # mkdir /tmp/buildah
    # cp ubuntu_20.04-1.qcow2 /tmp/buildah
    # cd /tmp/buildah
    # cat << END > Dockerfile
    FROM kubevirt/container-disk-v1alpha
    ADD ubuntu-22.04-server-cloudimg-amd64.img /disk
    END
    
    # buildah bud -t vmidisk/ubuntu22.04:latest /tmp/buildah
    # 如果使用的是docker,可使用如下命令,将镜像推送到docker本地使用,然后用docker命令导出,也可以直接推送到 harbor仓库
    # buildah push localhost/vmidisk/ubuntu22.04  docker-daemon:docker.io/vmidisk/ubuntu22.04:latest
    # 如果使用的是containerd,则先导出,再用ctr命令导入
    # docker save -o ubuntu.tar vmidisk/ubuntu22.04:latest
    # 使用 ctr 导入时,要指定名称空间为k8s.io,默认为default名称空间
    # ctr -n k8s.io images import ubuntu.tar
    
    ### docker 制作镜像操作步骤 ###
    # cd /tmp/buildah
    # docker build -t registry.demo.com/kubevirt/vmidisk:ubuntu22.04 .
    
  2. kubevirt使用 containerDisk启动
    ---
    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: vmtest
      namespace: default
    spec:
      running: true
      template:
        metadata:
          labels:
            kubevirt.io/size: small
            kubevirt.io/domain: vmutest
        spec:
          # 使用docker或buildah制作的镜像在master本地,所以这指定了节点
          nodeSelector:
            kubernetes.io/hostname: k8s04
          domain:
            devices:
              disks:
                - name: root-disk
                  disk:
                    bus: virtio
              interfaces:
                # 使用默认的伪装模式网络,兼容性较好,但性能较差,不如bridge、macvtap模式,但bridge和macvtap目前还不支持热迁移
                - name: default
                  masquerade: {}
              rng: {}
            resources:
              requests:
                memory: 1024M
          networks:
            - name: default
              pod: {}
          terminationGracePeriodSeconds: 0
          volumes:
            - name: root-disk
              containerDisk:
                image: registry.demo.com/kubevirt/vmidisk:ubuntu22.04
                imagePullPolicy: IfNotPresent
            - name: cloudinitdisk
              cloudInitNoCloud:
                userData: |-
                  #cloud-config
                  hostname: test5.com
                  ssh_pwauth: True
                  timezone: Asia/Shanghai
                  disable_root: false
                  chpasswd: {"list":"root:123456",expire: False}