KubeVirt 核心模块功能说明

KubeVirt 模块概述

KubeVirt 采用模块化设计,各组件职责明确,相互协作完成虚拟机在 Kubernetes 集群中的管理。通过分析仓库结构和代码组织,可以清晰地了解 KubeVirt 的模块规划。

virt-controller 模块

核心功能:

virt-controller 是 KubeVirt 的核心控制器,负责协调和管理 KubeVirt 相关的 Kubernetes 资源。其主要功能包括:

资源监控与协调: 通过监听 Kubernetes API Server 中 VirtualMachineInstance (VMI)、VirtualMachine (VM)、VirtualMachineInstanceReplicaSet (VMIRS) 等 KubeVirt 自定义资源的变化,并根据这些变化执行相应的操作,确保虚拟机生命周期管理与 Kubernetes 资源状态的一致性。
生命周期管理: 负责虚拟机的创建、启动、停止、删除、迁移、克隆、快照和恢复等操作。
高可用性: 通过 Leader Election 机制,确保在集群中只有一个 virt-controller 实例处于活动状态,从而避免冲突和数据不一致。
配置管理: 响应 KubeVirt 集群配置的变化,并相应地调整其行为。
健康检查与指标暴露: 提供健康检查端点和 Prometheus 指标,以便进行监控和故障排除。

代码实现逻辑:

virt-controller 的实现基于 Kubernetes client-go 库的 informer 模式。其核心组件 VirtControllerApp 结构体包含了大量的 informercontroller 实例:

Informers: 用于监听 Kubernetes API Server 中各种 KubeVirt 相关资源(如 VMI、VM、Node、ReplicaSet、Migration、VMExport、VMSnapshot、VMRestore、DataVolume 等)的变化。当资源发生变化时,informer 会将对应的对象添加到工作队列中。
Controllers: 每个控制器负责处理特定类型资源的业务逻辑。例如,vmiController 负责管理 VMI 的生命周期,rsController 负责管理 VMIRS,migrationController 负责处理虚拟机迁移等。控制器从工作队列中取出事件,并根据事件类型执行相应的协调逻辑,例如创建 Pod 来运行 VMI,更新资源状态等。
Leader Election: 使用 client-go 提供的 Leader Election 机制,确保在多个 virt-controller 实例中只有一个是活动的,避免重复操作和资源冲突。
Web 服务: 暴露 /healthz/leader 等 HTTP 端点,用于健康检查和 Leader Election 状态查询。

工作流程:

启动与初始化: virt-controller 启动后,初始化 Kubernetes 客户端、各种 informer 和控制器。
Leader Election: 多个 virt-controller 实例会竞争成为 Leader。只有当选的 Leader 才会启动所有的 informer 和控制器。
资源监听: Informer 开始监听 Kubernetes API Server 中 KubeVirt 相关资源的变化。当检测到资源变化时(例如,用户创建了一个新的 VMI 对象),Informer 会将该 VMI 对象添加到对应的控制器的工作队列中。
事件处理: 控制器从其工作队列中取出 VMI 对象,并根据 VMI 的状态和规范执行相应的操作。例如,如果是一个新的 VMI,vmiController 会创建一个对应的 Pod,该 Pod 将运行 virt-launcher 进程来启动虚拟机。
状态协调: 控制器持续监控其负责的资源,并确保其在 Kubernetes 集群中的实际状态与期望状态保持一致。这可能涉及创建、更新或删除其他 Kubernetes 资源,或者与 virt-handler 进行通信以管理实际的虚拟机进程。

virt-api 模块

核心功能:

virt-api 是 KubeVirt 的 API 服务器,负责处理 KubeVirt 资源的 API 请求,并提供各种子资源(subresources)和准入控制(admission control)功能。其主要功能包括:

API 暴露: 暴露 KubeVirt 相关的 RESTful API 接口,允许用户和客户端通过 Kubernetes API Server 对虚拟机进行操作,例如启动、停止、重启、迁移、连接控制台和 VNC 等。
子资源处理: 提供对虚拟机子资源的访问,例如获取虚拟机控制台输出、VNC 连接、USB 重定向等。
准入控制: 实现 Kubernetes 的准入 webhook 机制,对 KubeVirt 资源的创建、更新、删除等操作进行验证和修改,确保资源的合法性和一致性。
认证与授权: 与 Kubernetes 的认证和授权机制集成,确保只有经过授权的用户才能访问和操作 KubeVirt 资源。
健康检查与指标暴露: 提供健康检查端点和 Prometheus 指标,以便进行监控和故障排除。

代码实现逻辑:

virt-api 的核心实现位于 pkg/virt-api/api.go 文件中。virtAPIApp 结构体是其主要组成部分,它包含了处理 API 请求和管理 webhook 所需的各种组件:

RESTful API 框架: 使用 go-restful 框架来构建 RESTful API 服务,定义了各种路由和处理函数来响应不同的 API 请求。
子资源处理器: rest.NewSubresourceAPIApp 创建了一个子资源 API 应用程序,用于处理虚拟机相关的子资源请求,例如 RestartVMRequestHandlerStartVMRequestHandlerConsoleRequestHandlerVNCRequestHandler 等。
Webhook 机制: 通过 webhooks 包实现了 mutating-webhookvalidating-webhook,用于在资源被持久化到 etcd 之前对其进行修改和验证。例如,mutating-webhook 可能会为 VMI 注入默认配置,而 validating-webhook 则会检查 VMI 配置的合法性。
TLS 配置: 处理 TLS 证书和密钥,确保 API 通信的安全性。
Kubernetes 客户端: 使用 client-go 库与 Kubernetes API Server 进行交互,获取和更新 KubeVirt 资源。

工作流程:

启动与初始化: virt-api 启动后,初始化 RESTful API 服务、TLS 配置、Kubernetes 客户端和 webhook 处理器。
API 注册: virt-api 向 Kubernetes API Server 注册其自定义资源定义 (CRD) 和 webhook 配置。
请求处理: 当用户或客户端通过 Kubernetes API Server 发送 KubeVirt 资源的 API 请求时,请求会被路由到 virt-api。
子资源处理: 对于子资源请求(例如,连接到 VMI 控制台),virt-api 会建立与 virt-launcher 的连接,并将数据流转发给客户端。
准入控制: 对于创建、更新或删除 KubeVirt 资源的请求,virt-api 会调用相应的 mutating 或 validating webhook 进行处理。Webhook 会根据预定义的规则对资源进行修改或验证,如果验证失败,则拒绝该请求。
响应返回: virt-api 处理完请求后,将结果返回给 Kubernetes API Server,再由 API Server 返回给客户端。

virt-operator 模块

核心功能:

virt-operator 是 KubeVirt 的部署和生命周期管理组件,负责在 Kubernetes 集群中安装、升级和维护 KubeVirt 的所有核心组件(包括 virt-controller、virt-api、virt-handler 等)。其主要功能包括:

KubeVirt 组件部署与管理: 负责 KubeVirt 核心组件的部署、升级和降级,确保 KubeVirt 始终处于健康和最新状态。
资源协调: 监听 KubeVirt 自定义资源的变化,并根据其配置来协调 KubeVirt 相关的 Kubernetes 资源(如 Deployment、DaemonSet、Service、WebhookConfiguration 等),以确保 KubeVirt 组件的正确运行。
证书管理: 负责管理 KubeVirt 组件之间通信所需的 TLS 证书,确保通信安全。
配置管理: 响应 KubeVirt 集群配置(通过 kubevirt-config ConfigMap)的变化,并相应地调整 KubeVirt 组件的部署。
Webhook 管理: 负责部署和管理 KubeVirt 的准入 Webhook,确保对 KubeVirt 资源的合法性检查和修改。
Leader Election: 通过 Leader Election 机制,确保在集群中只有一个 virt-operator 实例处于活动状态,避免冲突。
健康检查与指标暴露: 提供健康检查端点和 Prometheus 指标。

代码实现逻辑:

virt-operator 的核心实现位于 pkg/virt-operator/application.go 文件中。VirtOperatorApp 结构体是其主要组成部分:

Informers: 包含了大量的 informer 实例,用于监听各种 Kubernetes 资源(如 KubeVirt CR、CRD、Deployment、DaemonSet、Service、Secret、ConfigMap、WebhookConfiguration 等)的变化。这些 informer 使得 operator 能够感知集群状态的变化。
KubeVirtController: 这是 virt-operator 的核心控制器,负责协调 KubeVirt 资源的期望状态和实际状态。它会根据 KubeVirt CR 的配置,创建、更新或删除 KubeVirt 相关的 Kubernetes 资源。
证书管理器: 使用 bootstrap.NewFallbackCertificateManager 来管理 TLS 证书,包括生成、分发和轮换证书,以确保 KubeVirt 组件之间的安全通信。
Leader Election: 使用 client-go 提供的 Leader Election 机制,确保在多个 virt-operator 实例中只有一个是活动的。
Webhook 服务: 暴露 Webhook 端点,用于处理 KubeVirt 资源的验证和修改请求。

工作流程:

启动与初始化: virt-operator 启动后,初始化 Kubernetes 客户端、各种 informer 和 KubeVirtController
Leader Election: 多个 virt-operator 实例会竞争成为 Leader。只有当选的 Leader 才会启动所有的 informer 和控制器。
资源监听: Informer 开始监听 Kubernetes API Server 中 KubeVirt 相关资源和 Kubernetes 核心资源的变化。
协调循环: KubeVirtController 会持续监控 KubeVirt CR 的状态。当 KubeVirt CR 被创建或更新时,控制器会根据其配置来部署或更新 KubeVirt 的所有组件(例如,创建 virt-controllervirt-apivirt-handler 的 Deployment 和 DaemonSet)。
证书管理: virt-operator 会自动生成和管理 KubeVirt 组件所需的 TLS 证书,并将其分发到相应的 Secret 中。
Webhook 部署: virt-operator 还会部署和管理 KubeVirt 的准入 Webhook,确保对 KubeVirt 资源的合法性检查和修改。
状态同步: virt-operator 会持续协调集群状态,确保 KubeVirt 组件的部署和配置与 KubeVirt CR 中定义的期望状态保持一致。

virt-handler 模块

核心功能:

virt-handler 是 KubeVirt 的节点级代理,以 DaemonSet 的形式运行在每个 Kubernetes 节点上。它负责管理和监控该节点上运行的虚拟机实例 (VMI) 的生命周期。其主要功能包括:

VMI 生命周期管理: 监听其所在节点上的 VMI 资源变化,并与 libvirt 交互,负责虚拟机的创建、启动、停止、暂停、恢复、删除等操作。
VMI 状态同步:libvirt 报告的虚拟机状态同步回 Kubernetes API Server,更新 VMI 对象的 status 字段。
网络和存储配置: 根据 VMI 的配置,为虚拟机设置网络接口和存储卷,并确保它们能够正确地连接到虚拟机。
迁移支持: 参与虚拟机实时迁移过程,负责在源节点和目标节点之间协调迁移操作。
节点资源管理: 监控节点资源(如 CPU、内存、磁盘、网络)的使用情况,并向 virt-controller 报告,以便进行调度决策。
健康检查与指标暴露: 提供健康检查端点和 Prometheus 指标,以便进行监控和故障排除。
安全增强: 处理 SELinux 标签和 Seccomp 策略,增强虚拟机的安全性。

代码实现逻辑:

virt-handler 的核心实现位于 pkg/virt-handler 包中,virtHandlerApp 结构体是其主要组成部分:

Kubernetes 客户端和 Informers: 使用 client-go 库与 Kubernetes API Server 交互,并通过 vmiSourceInformervmiTargetInformer 监听其所在节点上的 VMI 资源变化。
Domain Shared Informer: virtcache.NewSharedInformer 用于监控 libvirt 域的状态,并将其与 Kubernetes 中的 VMI 状态进行同步。
VMController: virthandler.NewController 是 virt-handler 的核心控制器,它负责协调 VMI 的期望状态和 libvirt 报告的实际状态。它会根据 VMI 的配置,调用 libvirt API 来管理虚拟机。
TLS 配置: 处理 TLS 证书和密钥,确保与 virt-apivirt-launcher 之间的安全通信。
迁移代理: migrationproxy.NewMigrationProxyManager 负责处理虚拟机迁移过程中的网络连接。
节点标签器: nodelabeller.NewNodeLabeller 负责根据节点的能力(如 CPU 特性、KVM 支持等)为节点打上标签,以便 virt-controller 进行调度。
Seccomp 和 SELinux: seccompselinux 包提供了对 Seccomp 策略和 SELinux 标签的处理,以增强虚拟机的安全性。

工作流程:

启动与初始化: virt-handler 启动后,初始化 Kubernetes 客户端、各种 informer 和控制器,并标记自身节点为不可调度,以防止在启动过程中调度新的 VMI。
资源监听: Informer 开始监听其所在节点上的 VMI 资源变化。当检测到 VMI 变化时,会将 VMI 对象添加到控制器的工作队列中。
VMI 协调: VMController 从工作队列中取出 VMI 对象,并根据 VMI 的状态和规范执行相应的操作。例如,如果是一个新的 VMI,它会调用 libvirt API 来创建和启动虚拟机,并创建一个 virt-launcher Pod 来承载虚拟机进程。
状态同步: VMController 会持续监控 libvirt 报告的虚拟机状态,并将其同步回 Kubernetes API Server,更新 VMI 对象的 status 字段。
网络和存储配置: virt-handler 负责为虚拟机配置网络接口和存储卷,确保虚拟机能够正确地访问网络和存储资源。
迁移处理: 在虚拟机迁移过程中,virt-handler 会与源节点和目标节点上的 virt-handler 实例以及 virt-controller 协调,确保虚拟机能够平滑地迁移。
节点标签更新: nodelabeller 会定期更新节点标签,反映节点的能力变化。
优雅关机: 当 virt-handler 接收到终止信号时,会尝试优雅地关闭所有正在运行的虚拟机,并等待迁移连接终止。

virt-launcher 模块

核心功能:

virt-launcher 是 KubeVirt 中运行虚拟机实例 (VMI) 的实际执行单元。每个 VMI 都会对应一个 virt-launcher Pod,并在该 Pod 中运行 virt-launcher 进程。其主要功能包括:

虚拟机生命周期管理: virt-launcher 是 VMI 的宿主,负责启动、停止、暂停、恢复、重启虚拟机,并与 libvirt 守护进程交互来管理虚拟机的实际运行。
资源准备: 负责准备虚拟机所需的各种资源,包括挂载磁盘(临时磁盘、容器磁盘、热插拔磁盘等)、配置网络接口、处理 Cloud-Init 和 Ignition 数据等。
libvirt 交互: 通过 libvirt 库与宿主机上的 libvirtd 守护进程通信,执行虚拟机的创建、配置和管理操作。
QEMU 进程管理: 启动和监控 QEMU 进程,这是实际运行虚拟机的组件。
virt-handler 通信: 通过 Unix socket 暴露一个命令服务器,接收来自 virt-handler 的指令,例如启动、停止、迁移虚拟机等。
事件通知: 监听 libvirt 域事件,并将重要的虚拟机状态变化通知给 virt-handler
健康检查: 确保虚拟机进程的健康运行。

代码实现逻辑:

virt-launcher 的核心实现位于 pkg/virt-launcher 包中,virt-launcher.go 文件是其入口。其主要组成部分包括:

目录初始化: initializeDirs 函数负责创建和初始化虚拟机所需的各种目录,例如 /var/run/kubevirt-private 用于存储私有数据,以及用于临时磁盘、容器磁盘、热插拔磁盘等的数据目录。
libvirt 连接: createLibvirtConnection 函数负责建立与 libvirt 守护进程的连接。virtwrap.NewLibvirtDomainManager 负责管理 libvirt 域(即虚拟机)。
命令服务器: cmdserver.RunServer 启动一个 Unix socket 服务器,用于接收来自 virt-handler 的命令。cmdclient 包则用于 virt-handlervirt-launcher 进行通信。
事件监控: startDomainEventMonitoring 函数负责监听 libvirt 域事件,并通过 notifyclient.Notifier 将事件通知给 virt-handler
QEMU 代理: agentpoller.AsyncAgentStore 用于与 QEMU 代理进行通信,获取虚拟机内部的信息。
信号处理: 捕获操作系统信号(如 SIGTERM),以便进行优雅关机。

工作流程:

Pod 启动:virt-controller 决定在一个节点上启动一个 VMI 时,它会创建一个 virt-launcher Pod。该 Pod 包含 virt-launcher 容器。
virt-launcher 启动与初始化: virt-launcher 进程在 Pod 中启动后,首先初始化必要的目录结构,并建立与 libvirt 守护进程的连接。
命令服务器启动: virt-launcher 启动一个本地的命令服务器,等待 virt-handler 的指令。
VMI 启动: virt-handler 通过命令服务器向 virt-launcher 发送启动 VMI 的指令。virt-launcher 接收到指令后,会根据 VMI 的配置,调用 libvirt API 来创建和启动 QEMU 进程,从而启动虚拟机。
资源挂载与配置: 在虚拟机启动过程中,virt-launcher 会根据 VMI 的配置,将所需的磁盘(如容器磁盘、临时磁盘)挂载到虚拟机中,并配置网络接口、注入 Cloud-Init 或 Ignition 数据。
状态同步与事件通知: virt-launcher 持续监控 libvirt 报告的虚拟机状态。当虚拟机状态发生变化时(例如,虚拟机启动、停止、崩溃),virt-launcher 会通过 notifyclient 将这些事件通知给 virt-handler
命令响应: virt-launcher 持续监听来自 virt-handler 的命令,并执行相应的操作,例如暂停、恢复、重启虚拟机等。
优雅关机:virt-launcher 接收到终止信号时,它会尝试优雅地关闭虚拟机,并确保所有资源被正确清理。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容