首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >将 oVirt 虚拟机迁移到 KubeVirt

将 oVirt 虚拟机迁移到 KubeVirt

作者头像
SRE运维进阶之路
发布于 2024-07-04 08:05:34
发布于 2024-07-04 08:05:34
212010
代码可运行
举报
运行总次数:10
代码可运行

本篇,我们将 oVirt 虚拟机迁移到 KubeVirt,分两步:

  1. oVirt 磁盘数据借助 CDI 导出
  2. KubeVirt 使用 DataVolume 导入

Ovirt 磁盘数据使用 CDI 导出

创建 sourceimageioDataVolume 对象,先创建依赖,Secret 认证信息、tls-certs 证书信息

endpoint-secret.yaml 内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Secret
metadata:
  name: endpoint-secret
  labels:
    app: containerized-data-importer
type: Opaque
data:
  accessKeyId: ""  # <optional: your key or user name, base64 encoded>
  secretKey:    "" # <optional: your secret or password, base64 encoded>

用户名、密码通过 base64 加密

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo -n  "username"| base64
echo -n  "password"| base64

cert-configmap.yaml 内容如下:

证书获取方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: tls-certs
data:
  ca.pem: |
    -----BEGIN CERTIFICATE-----
    ... <base64 encoded cert> ...
    -----END CERTIFICATE-----

一般虚拟机上,有两块盘,系统盘和数据盘,先准备 PV ,再创建 DataVolume

test-pv.yaml 内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ovirt-test-sys
spec:
  capacity:
    storage: 90Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /data/ovirt-test-sys
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - sh1-st-int-k8s-ops-kubevirt-03

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ovirt-test-data
spec:
  capacity:
    storage: 12Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /data/ovirt-test-data
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - sh1-st-int-k8s-ops-kubevirt-03

为了测试,所以数据盘较小一些

PV 中 spec.capacity.storage 要略大于 DataVolume 中的设置

local 类型的 path 需要在宿主机上提前创建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir /data/ovirt-test-sys /data/ovirt-test-data

test-dv.yaml内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  annotations:
    cdi.kubevirt.io/storage.bind.immediate.requested: ""
    cdi.kubevirt.io/storage.usePopulator: "false"
  name: "test-dv-sys"
spec:
  source:
      imageio:
         url: "https://xxx/ovirt-engine/api"
         secretRef: "endpoint-secret"
         certConfigMap: "tls-certs"
         diskId: "xxx"
  storage:
    accessModes:
    - ReadWriteOnce
    resources:
      requests:
        storage: 80Gi
    storageClassName: local-storage

---
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  annotations:
    cdi.kubevirt.io/storage.bind.immediate.requested: ""
    cdi.kubevirt.io/storage.usePopulator: "false"
  name: "test-dv-data"
spec:
  source:
      imageio:
         url: "https://xxx/ovirt-engine/api"
         secretRef: "endpoint-secret"
         certConfigMap: "tls-certs"
         diskId: "xxx"
  storage:
    accessModes:
    - ReadWriteOnce
    resources:
      requests:
        storage: 10Gi
    storageClassName: local-storage

Apply

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f endpoint-secret.yaml
kubectl apply -f cert-configmap.yaml
kubectl  apply -f test-pv.yaml
kubectl  apply -f test-dv.yaml

由于 ovirt 域名做的本地 hosts 解析,所以要在 Coredns 上加上,域名对应的解析记录,见附录一 要迁移的虚拟机,需要关机,使用离线迁移方式,否则会报错 Fault reason is "Operation Failed". Fault detail is "[Cannot transfer Virtual Disk. The disk xxx_Disk1 is plugged to non-Down VMs: ip-hostname]". HTTP response code is "409". HTTP response message is "409 Conflict".

查看导入状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get datavolumes.cdi.kubevirt.io
NAME           PHASE       PROGRESS   RESTARTS   AGE
test-dv-data   Succeeded   100.0%                13m
test-dv-sys    Succeeded   100.0%                13m

KubeVirt 使用 DataVolume 导入

创建 VMtest-vm.yaml内容如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  labels:
    kubevirt.io/vm: ovirt-test
  name: ovirt-test
spec:
  running: false
  template:
    metadata:
      labels:
        kubevirt.io/vm: ovirt-test
      annotations:
        cni.projectcalico.org/ipAddrs: '["10.70.73.10"]'
    spec:
      domain:
        devices:
          disks:
          - disk:
              bus: virtio
            name: test-dv-sys
          - disk:
              bus: virtio
            name: test-dv-data
          interfaces:
          - name: default
            bridge: {}
        resources:
          requests:
            cpu: 4
            memory: 8Gi
      networks:
      - name: default
        pod: {}
      volumes:
      - dataVolume:
          name: test-dv-sys
        name: test-dv-sys
      - dataVolume:
          name: test-dv-data
        name: test-dv-data

创建、启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl  apply -f test-vm.yaml
virtctl start ovirt-test

连接服务查看系统是否正常

在创建 VM 的过程中,使用 virtctl console ovirt-test , 终端无反应,且 VM IP Ping 不同,然后安装了 VNC 排查解决了 cloud-init 问题,见附录二 ⚠️ 需要数据落盘的,不要直接删除 VM,要先 STOP,在 DELETE

附录一:K8s 新增自定义解析

本集群使用 Coredns + NodeLocalDNS 方案

首先在 Coredns 上修改配置文件,然后重启

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl  -n kube-system edit cm coredns
        hosts {
            ovirt-ip ovirt-domain
            fallthrough
        }
$ kubectl  -n kube-system rollout restart deployment coredns        

然后在 NodeLocalDNS 上修改配置文件 ,然后重启

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl  -n kube-system edit cm nodelocaldns
# .53 下面的 forward 进行修改,此处为 CoreDNS 地址
        forward . {CoreDNS_SERVICE_IP}} {
            force_tcp
        }
$ kubectl -n kube-system rollout restart ds nodelocaldns        

附录二:安装 VNC 排查网络不通,VM 连不上

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Centos 安装可视化页面
yum groupinstall "GNOME Desktop"
systemctl set-default graphical.target
systemctl start graphical.target

# 安装 vnc
yum install -y tigervnc tigervnc-server

# vnc 进去排查
virtctl vnc ovirt-test

## 排查发现,网络依然是 oVirt 旧虚拟机的网络,默认 cloud-init 服务会重置网络为 DHCP ,分配 IP 才对,这里没有生效
## oVirt 虚拟机开机,发现停止且禁用了 cloud-init 服务,启动服务,关机,重启导入即可

根因:oVirt 虚拟机停止禁用了 cloud-init 服务。所以 oVirt 迁移前,需要先启动 cloud-init 服务

参考链接:

从 oVirt 导入:https://github.com/kubevirt/containerized-data-importer/blob/main/doc/datavolumes.md#image-io-data-volume

文章如有错误,欢迎业界专家指正

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SRE运维进阶之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
MQL5从入门到精通【第二章】变量与数据类型(二)
我们讲了变量和数据类型,都是单个的变量,及其值。那么这个数组,是用来装载多个数据的一种结构。你可以把数组想象为一个数字列表,每个数字对应不同的值。可以从头按照数字遍历这个列表,并获取其相对应的值。
程序员小助手
2020/04/08
1.2K0
MQL5从入门到精通【第七章】MQL5程序结构
顶部,是预处理声明;接着是输入变量和全局变量。最后是函数,类,以及定义的程序处理器。
程序员小助手
2020/04/08
1.2K0
MQL5从入门到精通【第二章】变量与数据类型(四)
输入变量是MQL5中仅有的,可供用户修改数值的变量。这些变量可由交易配置,指示器配置,止损收益配置等等组成。这些变量展示在程序的属性窗口。
程序员小助手
2020/04/08
1.1K0
MQL5从入门到精通【第五章】函数function
讲完了数据类型,操作语句,接着我们把这些元素组合在一起使用。封装起来,成为函数。可供程序内调用,减少冗余代码,提高代码可维护性,降低程序复杂度。
程序员小助手
2020/04/08
1.7K0
MQL5从入门到精通【第二章】变量与数据类型(三)
枚举是特殊的整数类型,定义了一列常量,用于指代整数值。枚举类型,只有定义了才能使用,没定义了,你找不到它的值,报错!
程序员小助手
2020/04/08
1.2K0
go 从入门到精通(二)基本数据类型和操作符
一、文件名&关键字&标识符 所有go源码都是以.go结尾 标识符以字母或下划线开头,大小写敏感 下划线_是特殊标识符,用户忽略结果 保留关键字 导入包时可以设置别名 下面是保留关键字: 二、GO程序的
coders
2018/01/04
7550
go 从入门到精通(二)基本数据类型和操作符
golang基础(一)go的特点、数据类型以及变量的定义
静态类型语言:与动态类型语言刚好相反,它的数据类型检查发生在在编译阶段,也就是说在写程序时要声明变量的数据类型。C/C++、C#、Java都是静态类型语言的典型代表。
GH
2020/03/25
1.7K0
MQL5从入门到精通【第四章】(一)条件判断语句
程序的基础功能之一就是做判断。判断语句通过评估条件的真伪作出决定。MQL5中有三个条件判断语句:if - else,三目操作符,和switch - case语句。
程序员小助手
2020/04/08
1.1K0
Python:变量与数据类型
在 Python 中 变量命名规定,必须是大小写英文,数字和 下划线(_)的组合,并且不能用数字开头。
HLee
2021/03/02
1.1K0
Python:变量与数据类型
【Java】基础07:常量、变量和数据类型
顾名思义: 常量是指固定不变的数据 变量是指在程序中可以变化的量 一、常量 整数常量:所有的整数,比如0、100等 小数常量:所有的小数,比如0.1、3.58等 字符常量:单引号引起来,只能写一个字符,必须有内容(空格也是字符),比如‘a’、‘ ’、‘嘻’等 字符串常量:双引号引起来,可以写多个字符,也可以不写,比如”A“、”“、”HelloWorld“等 布尔常量:只有两个值,true(真)和false(假) 空常量:只有一个值(null) 实例: public class ConstantDem
刘小爱
2020/07/30
4410
【Java】基础07:常量、变量和数据类型
第一阶段-Java基础知识:【第二章 Java基础语法知识】
在我们开始讲解程序之前,命名规范是我们不得不提的一个话题,虽说命名本应该是自由的,但是仍然有一定的“潜规则”,通过你对命名的书写,别人一眼就能看出你是不是一个“行家”。我们先来看一下有哪些规则。
BWH_Steven
2019/08/09
1.2K0
Java 基础入门教程
Java 是由 Sun Microsystems(现已被 Oracle 收购)于 1995 年推出的编程语言,具有跨平台、面向对象、安全可靠等特点,广泛应用于企业级应用开发、Android 应用开发、大数据处理等领域。
小焱
2025/06/20
1920
Java 基础入门教程
【JavaSE】数据类型与变量
比如: System.Out.println("Hello World"); 语句,不论程序何时运行,输出的都是Hello World,其实"Hello World"就是字面常量。
用户11369558
2024/11/20
1270
【JavaSE】数据类型与变量
Swift基础语法(常量变量、数据类型、元组、可选、断言)
本文来自Swift中文开发组,感谢翻译者的分享。 本文将分几部分对Swift对ios的语法做讲解。本文为第一节,主要讲解基础语法。 常量和变量 常量和变量把一个名字(比如maximumNumberOfLoginAttempts或者welcomeMessage)和一个指定类型的值(比如数字10或者字符串"Hello")关联起来。常量的值一旦设定就不能改变,而变量的值可以随意更改。 声明常量和变量 常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。下面的例子展示了如何用常量和变量来记录用户尝试
xiangzhihong
2018/02/05
2.2K0
知识改变命运 第二集:Java的数据类型与变量
在上节课HelloWorld程序中, System.Out.println(“Hello World”); 语句,不论程序何时运行,输出的都是Hello World,其实"Hello World"就是字面常量。常量即程序运行期间,固定不变的量称为常量,比如:一个礼拜七天,一年12个月等。
用户11319080
2024/10/17
2070
知识改变命运 第二集:Java的数据类型与变量
PL/SQL学习笔记-常量变量及数据类型初步
declare是声明部分 我在这个部分声明了varchar2类型的变量,名字叫mydata,内容是hellow world,长度是16个长度。 begin….end 部分是执行部分 我在这里调用了oracle已有的过程dbms_output.put_line,这个过程起到了打印的目的 执行完后就打印出了我刚才定义的变量。 注意PL/SQL与T-SQL一样是不区分大小写的 我是用pl/sql developer工具执行上述程序的(如果有必要以后介绍下oracle的安装,基本操作和相关工具) 下面贴两个图,看一下:
liulun
2022/05/09
4390
PL/SQL学习笔记-常量变量及数据类型初步
Python教程第2章 | 基本数据类型和变量
如果你是初学者,可能对函数不太了解,没关系,你先了解它的组成部分和作用就可以了,后面函数会详细说明。
仲君Johnny
2024/01/24
2730
Python教程第2章 | 基本数据类型和变量
PHP 基本数据类型
上篇教程,学院君给大家介绍了 PHP 中变量和常量的声明和使用,并且提到,PHP 是弱类型语言,在声明变量时,无需指定类型,变量值对应的数据类型会在运行时进行判断,所以虽然无需指定类型,但实际上还是有类型的,只不过这个判定工作交给了 PHP 底层引擎完成,这是以牺牲程序性能为代价换取开发效率和语言的简单性,所有的弱类型解释型语言,比如 Python、JavaScript 都是这么做的。
学院君
2020/05/27
2K0
Swift进阶二:基本数据类型相关
而在Objective-C中,如果没有特殊的指明,我们所声明的都是变量。可以通过如下几种方式来声明常量:
拉维
2020/07/20
9430
Swift进阶二:基本数据类型相关
Scala 基础 (二):变量和数据类型
Scala中的关键字合集: • package, import, class, object, trait, extends, with, type, for • private, protected, abstract, sealed, final, implicit, lazy, override • try, catch, finally, throw • if, else, match, case, do, while, for, return, yield • def, val, var • this, super • new • true, false, null
百思不得小赵
2022/12/01
9670
Scala 基础 (二):变量和数据类型
推荐阅读
相关推荐
MQL5从入门到精通【第二章】变量与数据类型(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验