通过Python客户端在KubeVirt中创建虚拟机是否可行?

0 投票
1 回答
34 浏览
提问于 2025-04-13 15:32

KubeVirt是Kubernetes的一个扩展,它让Kubernetes能够管理虚拟机。我已经部署了一个KubeVirt集群。我想用Python客户端来操作KubeVirt,以管理虚拟机。这可行吗?

我使用的是Kubernetes的Python客户端。但是它似乎不支持虚拟机这种资源类型。我的集群可以通过kubectl apply - f testvm.yaml来创建虚拟机。

Python代码:

from kubernetes import client, config, utils

config.load_kube_config('config')


k8s_client = client.ApiClient()

file = 'yamlfile\\testvm.yaml'
utils.create_from_yaml(k8s_client, file, verbose=True)

错误信息:

AttributeError: module 'kubernetes.client' has no attribute 'KubevirtIoV1Api'

testvm.yaml文件内容:

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: testvm
spec:
  running: false
  template:
    metadata:
      labels:
        kubevirt.io/size: small
        kubevirt.io/domain: testvm
    spec:
      domain:
        devices:
          disks:
            - name: containerdisk
              disk:
                bus: virtio
            - name: cloudinitdisk
              disk:
                bus: virtio
          interfaces:
          - name: default
            masquerade: {}
        resources:
          requests:
            memory: 64M
      networks:
      - name: default
        pod: {}
      volumes:
        - name: containerdisk
          containerDisk:
            image: quay.io/kubevirt/cirros-container-disk-demo
        - name: cloudinitdisk
          cloudInitNoCloud:
            userDataBase64: SGkuXG4=
---
apiVersion: v1
kind: Service
metadata:
  name: vm-ssh
spec:
  type: NodePort
  ports:
  - protocol: TCP
    port: 24
    targetPort: 22
    name: test
  selector:
    kubevirt.io/domain: testvm
    kubevirt.io/size: small

1 个回答

0

你想创建一些使用 kubevirt.io/v1 这个接口的资源。这个接口不是 Kubernetes 的核心接口,而是由 kubevirt 提供的 自定义资源定义,这意味着它不被 Python 的 Kubernetes 客户端的静态部分支持。

不过别担心,这正是 动态客户端 的用武之地!你可以在 这里 找到一些使用动态客户端的示例。

你的代码最终看起来会像这样:

import yaml
from kubernetes import config, dynamic
from kubernetes.client import api_client


# Creating a dynamic client
client = dynamic.DynamicClient(
    api_client.ApiClient(configuration=config.load_kube_config())
)

# fetching the configmap api
api = client.resources.get(api_version="kubevirt.io/v1", kind="VirtualMachine")
path = 'testvm.yaml'
with open(path) as fd:
  resource = yaml.safe_load(fd)

api.create(body=resource)

撰写回答