集装箱数据导入器(CDI)的应用
你可以在线研究Killercoda
CDI是一个用于导入虚拟机映像以与Kubevirt一起使用的实用程序。
在高级使用,创建一个PersistentVolumeClaim (PVC)。自定义控制器监视特定于导入程序的声明,当发现时,启动一个导入过程以创建一个名为disk的原始映像。img和所需的内容到相关的PVC。
这个“示例”的目标是在一个节点上部署,因为它使用Minikube和它的hostpath存储类,每次只能在一个节点上创建持久化卷(pv)。在生产使用中,应该部署能够ReadWriteOnce或更好操作的StorageClass,以确保pv可以从任何节点访问。
安装CDI
在这个示例中,我们使用操作符部署CDI的最新版本。
export VERSION=$(basename $(curl -s -w %{redirect_url} https://github.com/kubevirt/containerized-data-importer/releases/latest))
kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-operator.yaml
kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yaml
检查上一步创建的cdi CustomResource (CR)的状态。CR的阶段将从部署阶段更改为已部署阶段,因为它部署的pods已经创建并达到了运行状态。
kubectl get cdi cdi -n cdi
检查添加的“cdi”单元。
kubectl get pods -n cdi
使用CDI方式导入磁盘映像
例如,我们将导入Fedora33云映像作为PVC,并启动使用它的虚拟机。
cat <<EOF > pvc_fedora.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: "fedora"
labels:
app: containerized-data-importer
annotations:
cdi.kubevirt.io/storage.import.endpoint: "https://download.fedoraproject.org/pub/fedora/linux/releases/33/Cloud/x86_64/images/Fedora-Cloud-Base-33-1.2.x86_64.raw.xz"
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
EOF
kubectl create -f pvc_fedora.yml
这将创建带有适当注释的PVC,以便CDI控制器检测到它并启动导入器pod来收集在CDI .kubevirt.io/storage.import中指定的图像。端点注释。
kubectl get pvc fedora -o yaml
kubectl get pod # Make note of the pod name assigned to the import process
kubectl logs -f importer-fedora-pnbqh # Substitute your importer-fedora pod name here.
注意,导入程序下载了公开的Fedora Cloud qcow映像。进入POD完成,这PVC准备在kubevirt使用。
如果导入器模块错误地完成,您可能需要重试它或为fedora云映像指定一个不同的URL。若要重试,首先删除导入的POD和PVC,然后重新创建PVC。
kubectl delete -f pvc_fedora.yml --wait kubectl create -f pvc_fedora.yml
让我们创建一个使用它的虚拟机。查看文件vm1_pvc.yml。
wget https://kubevirt.io/labs/manifests/vm1_pvc.yml
cat vm1_pvc.yml
我们更改这个虚拟机的yaml定义,以在云实例中注入默认的用户公钥。
# Generate a password-less SSH key using the default location.
ssh-keygen
PUBKEY=`cat ~/.ssh/id_rsa.pub`
sed -i "s%ssh-rsa.*%$PUBKEY%" vm1_pvc.yml
kubectl create -f vm1_pvc.yml
这将创建并启动一个名为vm1的虚拟机。我们可以使用下面的命令来检查我们的虚拟机正在运行并收集它的IP。你要找的是virt发射舱旁边的IP地址。
kubectl get pod -o wide
由于我们运行的是all in one设置,对应的虚拟机实际上运行在同一个节点上,所以我们可以检查它的qemu进程。
ps -ef | grep qemu | grep vm1
等待虚拟机启动并可用于登录。您可以通过控制台监视它的进度。虚拟机引导的速度取决于是否使用裸金属硬件。当使用嵌套虚拟化时,速度会慢得多,如果您在云提供商的实例上完成这个实验,很可能就是这种情况。
virtctl console vm1
通过键入:ctrl+]
断开与虚拟机控制台的连接
最后,我们将像普通用户一样连接到vm1虚拟机(VM),即通过ssh。如果我们在Kubernetes软件定义网络(SDN)中,这可以通过ssh到收集的ip来实现。如果我们连接到属于Kubernetes集群网络的节点,这是正确的。如果您遵循使用AWS的简单安装或使用GCP的简单安装,您的云实例可能已经是集群的一部分。
ssh fedora@VM_IP
另一方面,如果您遵循使用minikube进行轻松安装,请考虑您需要首先ssh到minikube,如下所示。
$ kubectl get vmi
NAME AGE PHASE IP NODENAME
vm1 109s Running 172.17.0.16 minikube
$ minikube ssh
_ _
_ _ ( ) ( )
___ ___ (_) ___ (_)| |/') _ _ | |_ __
/' _ ` _ `\| |/' _ `\| || , < ( ) ( )| '_`\ /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )( ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)
$ ssh fedora@172.17.0.16
The authenticity of host '172.17.0.16 (172.17.0.16)' can't be established.
ECDSA key fingerprint is SHA256:QmJUvc8vbM2oXiEonennW7+lZ8rVRGyhUtcQBVBTnHs.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.16' (ECDSA) to the list of known hosts.
fedora@172.17.0.16's password:
最后,在通常情况下,您可能希望将对vm1 VM的访问权限授予来自Kubernetes集群节点之外的其他人。实际上是从他或她的笔记本电脑连接的人。这可以通过minikube中已经安装的virtctl工具来实现。注意,这与从笔记本电脑连接到运行在本地Minikube实例上的vm1 VM是相同的情况
首先,我们将把vm1的ssh端口公开为NodePort类型。然后验证在Minikube或云实例的随机端口上成功创建了Kubernetes对象服务。
$ virtctl expose vmi vm1 --name=vm1-ssh --port=20222 --target-port=22 --type=NodePort
Service vm1-ssh successfully exposed for vmi vm1
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
vm1-ssh NodePort 10.101.226.150 <none> 20222:32495/TCP 24m
成功公开之后,检查Minikube虚拟机或云实例的IP,并验证可以使用之前配置的公共SSH密钥访问虚拟机。对于云实例,请验证应用的安全组是否允许流量通过创建的随机端口。
minikube ip
192.168.39.74
$ ssh -i ~/.ssh/id_rsa fedora@192.168.39.74 -p 32495
Last login: Wed Oct 9 13:59:29 2019 from 172.17.0.1
[fedora@vm1 ~]$
这部分的示例就到此结束了。