制作KubeVirt镜像
目录
制作KubeVirt镜像
我们现在已经安装好了Kubevirt并且也运行了第一个虚拟机,但是这个虚拟机并不是我们想要的,我们现在想要自定义镜像
Kubernetes版本 1.28.2
1. 准备磁盘文件
我这里构建的是openeuler虚拟机,qcow2的文件我可以直接在各大镜像站下载到,下载完后是一个压缩文件,我们还需要解压
[root@master ~]# wget https://mirrors.tuna.tsinghua.edu.cn/openeuler/openEuler-22.03-LTS-SP4/virtual_machine_img/x86_64/openEuler-22.03-LTS-SP4-x86_64.qcow2.xz [root@master ~]# xz -d openEuler-22.03-LTS-SP4-x86_64.qcow2.xz
这样一个磁盘文件我们就准备好了,当然也可以通过其他的方式去获取,例如通过KVM创建一个虚拟机然后把磁盘文件拿出来,或者通过openstack来得到qcow2文件
2. 编写Dockerfile
我们需要将这个磁盘文件传到容器镜像内部
[root@master ~]# mkdir -p kubevirt/images [root@master ~]# cd kubevirt/images [root@master images]# cp ~/openEuler-22.03-LTS-SP4-x86_64.qcow2 . [root@master images]# ls openEuler-22.03-LTS-SP4-x86_64.qcow2
文件放在这个地方,然后我们开始编写dockerfile
FROM openeuler/openeuler:22.03 ADD openEuler-22.03-LTS-SP4-x86_64.qcow2 /disk/openEuler-22.03-LTS-SP4-x86_64.qcow2
就只需要写这2行就可以了然后开始构建镜像
3. 构建镜像
[root@master images]# docker build -t openeuler2203-sp4:v1 .
接下来等待构建完成
4. 上传镜像到仓库(可选)
如果你没有私有镜像仓库的话,这一步可以不做,直接将镜像导出然后使用ctr导入(等会会说)
我们现在需要将镜像上传到私有仓库,所以我们得先修改镜像tag
[root@master images]# docker tag openeuler2203-sp4:v1 harbor.test.com/openeuler2203-sp4:v1 [root@master images]# docker push harbor.test.com/openeuler2203-sp4:v1
推送镜像之前得先登录,自行登录就好了,这里镜像就上传好了
5. 导出镜像
如果你没有私有仓库的话,就做这一步
[root@master images]# docker save -o openeuler.tar openeuler2203-sp4:v1 [root@master images]# ctr -n k8s.io image import openeuler.tar
导入完成之后我们就可以使用这个镜像来启动虚拟机了,接下来我们准备一个虚拟机的启动模板
6. 虚拟机yaml文件
[root@master images]# vim oe-vm.yaml apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: openeuler spec: running: false template: metadata: labels: kubevirt.io/domain: openeuler spec: domain: devices: disks: - name: rootfs disk: bus: virtio - name: cloudinit disk: bus: virtio interfaces: - name: default bridge: {} resources: requests: memory: 1Gi limits: memory: 1Gi networks: - name: default pod: {} volumes: - name: rootfs containerDisk: image: openeuler2203-sp4:v1 # 这个地方填写刚刚传进去的磁盘文件名 path: /disk/openEuler-22.03-LTS-SP4-x86_64.qcow2 #- name: cloudinit # cloudInitNoCloud: # userData: |- # #cloud-config # password: openeuler # chpasswd: { expire: False } # ssh_pwauth: True # packages: # - nginx # runcmd: # - systemctl enable nginx # - systemctl start nginx
最后面这一段是cloud-init,但是openeuler默认没有安装这个服务,所以写上也没用,换成其他的系统是完全OK的,这里的cloud-init是让他执行一些个性化的操作,我这里就是写的安装nginx并修改root的密码,在我这里不生效,所以我注释了
7. 启动虚拟机
我们准备好了镜像以及yaml文件,那么我们现在可以开始启动虚拟机了
[root@master images]# kubectl apply -f oe-vm.yaml [root@master kubevirt]# kubectl get vms NAME AGE STATUS READY openeuler 41s Stopped False
接下来我们启动这个虚拟机
[root@master kubevirt]# virtctl start openeuler VM openeuler was scheduled to start [root@master kubevirt]# kubectl get vms NAME AGE STATUS READY openeuler 1m17s Running True
现在他已经变成running了,我们就可以连接进去了
[root@master kubevirt]# virtctl console openeuler Successfully connected to openeuler console. The escape sequence is ^] openeuler login: root Password: Authorized users only. All activities may be monitored and reported. Welcome to 5.10.0-216.0.0.115.oe2203sp4.x86_64 System information as of time: Tue Jul 23 09:32:59 AM UTC 2024 System load: 0.38 Memory used: 3.7% Swap used: 0.0% Usage On: 4% IP address: 10.244.219.127 Users online: 1 [root@openeuler ~]#
这个镜像的默认密码是openEuler12#$
或者直接通过ssh连接,他的IP地址是10.244.219.127
[root@master kubevirt]# ssh root@10.244.219.127 Authorized users only. All activities may be monitored and reported. root@10.244.219.127's password:
也是可以连接上的
8. 启动虚拟机报错
[root@master kubevirt]# kubectl apply -f oe-vm.yaml Warning: kubevirt.io/v1alpha3 is now deprecated and will be removed in a future release. The request is invalid: spec.template.spec.volumes[2]: HostDisk feature gate is not enabled
如果你报这个错的话是因为没有开启这个hostDisk特性,我们将他打开就好了
[root@master kubevirt]# kubectl edit -n kubevirt kv kubevirt spec: configuration: developerConfiguration: featureGates: - HostDisk
找到这一段,将内容改成这样,然后保存退出即可解决报错
本文来自博客园,作者:FuShudi,转载请注明原文链接:https://www.cnblogs.com/fsdstudy/p/18319195