Kubernetes(k8s)-Pod里面跑虚拟机(KubeVirt)

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

图片

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

我们前面讲解的所有的内容都是基于容器的,随着使用Kubernetes集群的深入,对于部分不适合容器化的组件需要使用虚拟机来部署(比如某些组件需要独立的内核环境),我们如何通过Kubernetes来管理这些虚拟机呢,他就是我们今天要讲的kubevirt。

1.安装kubevirt

# 导出 KubeVirt 版本(例如 v1.5.0)
export KUBEVIRT_VERSION="v1.5.0"
# 部署 KubeVirt Operator 和 CRD
kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml
#多等会,确认ok以后再执行下面的命令 
# 部署 KubeVirt 核心组件
kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-cr.yaml

图片

图片

2.创建kubevirt

apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
  name: centos-vmi
spec:
  domain:
    devices:
      disks:
      - name: containerdisk
        disk:
          bus: virtio
      - name: cloudinitdisk
        disk:
          bus: virtio
    resources:
      requests:
        memory: 1Gi
        cpu: 1
  volumes:
  - name: containerdisk
    containerDisk:
      image: kubevirt/fedora-cloud-container-disk-demo:latest
  - name: cloudinitdisk
    cloudInitNoCloud:
      userData: |
        #cloud-config
        password: fedora
        chpasswd: { expire: False }

devices下面挂载了2个磁盘,其中containerdisk是系统盘,cloudinitdisk代表是初始化盘,关于这个介绍可翻看我以前的历史文章

volumes下面的2个磁盘是则是上面2个盘的具体实现,一个是基于容器的,一个是就初始化配置文件。

3.检查kubevirt​​​​​​​

[root@master01 ~]# kubectl get vmi 
NAMESPACE   NAME         AGE   PHASE     IP            NODENAME   READY
default     centos-vmi   57m   Running   10.20.5.126   node03     True

通过进入Pod查看,可以看到Pod里面运行的是KVM相关的进程和基于KVM运行的虚拟机,如果没了解过关于KVM虚拟机可以去看我的历史文章:KVM总结篇

图片

4.管理虚拟机

由于这个的虚拟机在容器内部,而且我们的Kubernetes并没有对应的管理虚拟机的工具,所以我们这里需要额外安装工具。​​​​​​​

#这里需要先安装管理工具
VERSION=$(kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath="{.status.observedKubeVirtVersion}")
ARCH=$(uname -s | tr A-Z a-z)-$(uname -m | sed 's/x86_64/amd64/') || windows-amd64.exe
echo ${ARCH}
curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-${ARCH}
chmod +x virtctl
install virtctl /usr/local/bin

图片

通过我们命令我们进入到了虚拟机内部,可以看到它有独立的内核,并且有独立的磁盘和文件系统,和普通虚拟机已经没有区别。

当然这里只是演示,这个机器里面并没有真实业务,存储也是使用默认的存储,没考虑持久化的问题。

下个小节我们将介绍如何构建自己的虚拟机镜像,可以跑业务的那种。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

在使用 `kubectl` 命令部署 KubeVirt 虚拟机配置文件时,如果遇到错误提示 `Internal error occurred: failed calling webhook 'virtualmachine-validator.kubevirt.io' with context deadline exceeded`,这通常表示 Kubernetes 在调用 KubeVirt 的验证 Webhook 时超时。这种问题可能由多种原因引起,包括网络问题、Webhook 服务未正常运行、或证书配置问题等。 ### 常见原因及解决方法 #### 1. 检查 KubeVirt Webhook 服务是否正常运行 KubeVirt 的验证 Webhook 是一个独立的服务,负责对虚拟机定义进行校验。如果该服务未正常运行,`kubectl apply` 或 `kubectl create` 命令将无法完成虚拟机的创建。 ```bash kubectl get pods -n kubevirt ``` 确保 `virt-api` 和 `virt-validating-webhook` 相关的 Pod 处于 `Running` 状态。若发现异常 Pod,可进一步查看其日志: ```bash kubectl logs <pod-name> -n kubevirt ``` #### 2. 检查 Webhook 配置是否正确 KubeVirt 使用 `ValidatingWebhookConfiguration` 来注册其验证逻辑。可以通过以下命令检查配置是否正确: ```bash kubectl get validatingwebhookconfigurations ``` 确认 `kubevirt-validating-webhook` 是否存在并正确配置了服务地址和证书。 #### 3. 检查证书是否有效 Kubernetes Webhook 通常使用 TLS 证书进行加密通信。如果证书过期、未生效或配置错误,会导致连接失败或超时。可以检查证书的有效期和内容: ```bash kubectl get secret -n kubevirt kubevirt-validating-webhook-certs -o jsonpath='{.data.tls\.crt}' | base64 --decode | openssl x509 -noout -text ``` 如果证书存在问题,可以尝试重新生成证书并更新 Secret: ```bash # 生成新的证书 openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=kubevirt-validating-webhook.kubevirt.svc" # 更新 Secret kubectl create secret tls kubevirt-validating-webhook-certs --cert=cert.pem --key=key.pem -n kubevirt --dry-run=client -o yaml | kubectl apply -f - ``` #### 4. 检查网络连通性 确保 Kubernetes 控制平面能够访问 `virt-validating-webhook` 服务。可以尝试从 `kube-apiserver` 所在节点直接访问 Webhook 服务: ```bash curl -v https://kubevirt-validating-webhook.kubevirt.svc:443 ``` 如果出现连接超时或拒绝连接的情况,检查服务的 `Endpoint` 是否正确指向运行中的 Pod IP: ```bash kubectl get endpoints -n kubevirt kubevirt-validating-webhook ``` #### 5. 调整 Webhook 超时设置 如果 Webhook 处理时间较长,可以尝试调整 `ValidatingWebhookConfiguration` 中的 `timeoutSeconds` 字段,增加等待时间: ```yaml webhooks: - name: virtualmachine-validator.kubevirt.io clientConfig: service: name: kubevirt-validating-webhook namespace: kubevirt path: /virtualmachines rules: - operations: [ "CREATE", "UPDATE" ] apiGroups: ["kubevirt.io"] apiVersions: ["v1"] resources: ["virtualmachines"] timeoutSeconds: 10 ``` 更新配置后重新应用: ```bash kubectl apply -f validating-webhook-config.yaml ``` #### 6. 检查 KubeVirt 版本兼容性 不同版本的 KubeVirt 可能存在兼容性问题。确保所使用的 KubeVirt 版本与 Kubernetes 版本兼容。建议参考 [KubeVirt 官方文档](https://kubevirt.io/user-guide/) 获取兼容性信息。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值