- 製作KubeVirt映象
- 1. 準備磁碟檔案
- 2. 編寫Dockerfile
- 3. 構建映象
- 4. 上傳映象到倉庫(可選)
- 5. 匯出映象
- 6. 虛擬機器yaml檔案
- 7. 啟動虛擬機器
- 8. 啟動虛擬機器報錯
製作KubeVirt映象
我們現在已經安裝好了Kubevirt並且也執行了第一個虛擬機器,但是這個虛擬機器並不是我們想要的,我們現在想要自定義映象
Kubernetes版本 1.28.2
1. 準備磁碟檔案
openEuler的qcow2檔案下載地址
我這裡構建的是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
找到這一段,將內容改成這樣,然後儲存退出即可解決報錯