从0开始装一套 KubeVirt 1.2.1

news/2024/11/19 5:38:39/文章来源:https://www.cnblogs.com/david-cloud/p/18291698

KubeVirt 架构

架构

  • virt-api : 负责提供一些 KubeVirt 特有的 api,像是 console, vnc, startvm, stopvm 等。
  • virt-controller : 管理和监控 VMI 对象及其关联的 Pod,对其状态进行更新。
  • virt-hander : 以 DaemonSet 运行在每一个节点上,监听 VMI 的状态向上汇报,管理 VMI 的生命周期。
  • virt-launcher : 以 Pod 方式运行,每个 VMI Object 都会对应一个 virt-launcher Pod,容器内有单独的 libvirtd,用于启动和管理虚拟机。

网络和存储选型

固定 IP 能力:网络需要支持具备固定 IP 的能力, 这里选用 Calico

数据持久化:dataVolume、hostDisk、PVC ,这里选用 dataVolume,可以动态创建 PVC, 并将镜像填充进去

SC 选用 local-storage,性能最好,灾备首先磁盘 RAID 做了冗余,其次在应用层实现高可用灾备

Kubernetes 安装

使用 kubespray 安装 K8s 1.28 集群(离线版)

搬运镜像和文件

没有条件的,可以跳过这步,使用国内 daocloud 站点

## 安装 skopeo
sudo apt-get -y update # Ubuntu Server 22.04 LTS 
sudo apt-get -y install skopeo
sudo apt-get -y install ansible
git clone https://github.com/kubernetes-sigs/kubespray.git -b v2.24.1 --depth 1
## 生成搬运列表
cd kubespray/contrib/offline
bash generate_list.sh
## 搬运镜像,注意 {IMAGE-REPO} 为镜像仓库地址,根据实际情况修改
skopeo login {IMAGE-REPO}
for image in $(cat temp/images.list); do skopeo copy docker://${image} docker://{IMAGE-REPO}/k8s/${image#*/}; done
## 搬运文件
wget -x -P temp/files -i temp/files.list
### 安装配置 Nginx, Centos7
yum -y install nginx
systemctl start nginx
#### nginx.conf 配置location / {root    /home/clay/kubespray/contrib/offline/temp/files;autoindex on;autoindex_exact_size off;autoindex_localtime on;}
 

安装前准备

# 挂盘、升 kernel、升操作系统、配置时间同步、参数调优等
 

下载 kubespray,修改配置文件

# 下载
git clone https://github.com/kubernetes-sigs/kubespray.git -b v2.24.1 --depth 1
cd kubespray# 修改配置文件
cp -rfp inventory/sample inventory/kubevirt-test
## inventory/kubevirt-test/group_vars/k8s_cluster/k8s-cluster.yml 文件修改
### 开启审计日志
kubernetes_audit: true
### 自动重新生成证书
auto_renew_certificates: true
### 开启资源预留,注意,下面具体的参数也要打开 ## The following two items need to be set when kube_reserved is true
kube_reserved: true
system_reserved: true
### 修改 Pod 、 Service CIDR, 根据实际情况修改,不要冲突
kube_pods_subnet:
kube_service_addresses:## inventory/kubevirt-test/group_vars/all/offline.yml 文件修改,注意 {IMAGE-REPO} 、{FILE-REPO},根据实际情况修改
sed -i -E '/# .*\{\{ files_repo/s/^# //g' inventory/kubevirt-test/group_vars/all/offline.yml  # 命令需在 Linux 系统执行
tee -a inventory/kubevirt-test/group_vars/all/offline.yml <<EOF
gcr_image_repo: "{IMAGE-REPO}/k8s"
kube_image_repo: "{IMAGE-REPO}/k8s"
docker_image_repo: "{IMAGE-REPO}/k8s"
quay_image_repo: "{IMAGE-REPO}/k8s"
github_image_repo: "{IMAGE-REPO}/k8s"
files_repo: "{FILE-REPO}"
EOF## inventory/kubevirt-test/group_vars/k8s_cluster/addons.yml 修改默认安装插件
helm_enabled: true
metrics_server_enabled: true
csi_snapshot_controller_enabled: true
ingress_nginx_enabled: true## 修改主机列表,注意{HOSTNAME1},{IP1} {HOSTNAME2},{IP2} {HOSTNAME3},{IP3},根据实际情况修改
pip3 install ruamel_yaml
declare -a IPS=({HOSTNAME1},{IP1} {HOSTNAME2},{IP2} {HOSTNAME3},{IP3})
CONFIG_FILE=inventory/kubevirt-test/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
 

新建集群

## 下拉封装好的镜像
docker pull quay.io/kubespray/kubespray:v2.24.1## 启动
docker run --rm -it --mount type=bind,source="$(pwd)"/inventory,dst=/kubespray/inventory \--mount type=bind,source="${HOME}"/.ssh/id_rsa,dst=/root/.ssh/id_rsa \quay.io/kubespray/kubespray:v2.24.1 bash## 执行 playbook
ansible-playbook -i inventory/kubevirt-test/hosts.yaml --private-key /root/.ssh/id_rsa cluster.yml
 

KubeVirt 安装

KubeVirt 是 Kubernetes 的虚拟化附加组件,本指南假定已经安装了 Kubernetes 群集。

Requirements

在开始之前需要满足一些要求

  • Kubernetes 群集或衍生物(例如 OpenShift ),基于最新的三个 Kubernetes 发行版之一,该版本是在 KubeVirt 发布时发行的。
    • 这里 KubeVirt 最新版是 1.2.1 ,K8s 选择 1.28.6
  • Kubernetes apiserver 必须具有-allow-privileged = true,才能运行Kubevirt的特权守护程序。
  • kubectl 客户端
  • 推荐使用 containerd 或 crio (with runv) 容器运行时

验证硬件虚拟化支持

建议使用虚拟化支持的硬件。您可以使用 virt-host validate 来确保您的主机能够运行虚拟化工作负载:

# 安装 virt-host-validate 命令,centos7
yum install -y qemu-kvm libvirt virt-install bridge-utils
# 验证
virt-host-validate qemuQEMU: Checking for hardware virtualization                                 : PASSQEMU: Checking if device /dev/kvm exists                                   : PASSQEMU: Checking if device /dev/kvm is accessible                            : PASSQEMU: Checking if device /dev/vhost-net exists                             : PASSQEMU: Checking if device /dev/net/tun exists                               : PASS
...
 

在 Kubernetes 上安装 KubeVirt

# 指定为 v1.2.1 版本
export RELEASE=v1.2.1
# 下载 KubeVirt operator Yaml,并安装
wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml
kubectl apply -f kubevirt-operator.yaml
# 下载 KubeVirt CR, 创建 KubeVirt CR(实例部署请求),该 CR 触发实际安装
wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml
kubectl apply -f kubevirt-cr.yaml
# 等待所有 KubeVirt 组件都启动
kubectl -n kubevirt wait kv kubevirt --for condition=Available
# 下载 virtctl client
wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/virtctl-${RELEASE}-linux-amd64
mv virtctl-${RELEASE}-linux-amd64 /usr/local/bin/virtctl
chmod +x /usr/local/bin/virtctl
 

Containerized Data Importer

CDI (Containerized Data Importer)项目提供了一些功能,可以通过 DataVolumes 将 pvc (Persistent Volume Claims) 用作 KubeVirt 虚拟机的磁盘。三个主要的CDI 用例是:

  • 从 web 服务器或容器注册中心导入磁盘映像到 DataVolume
  • 将现有的 PVC 克隆到数据卷
  • 上传本地磁盘映像到数据卷

安装 CDI

# 指定 v1.59.0 版本
export VERSION=v1.59.0
# 下载 Yaml 并创建
wget https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-operator.yaml
wget https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yaml
kubectl create -f cdi-operator.yaml
kubectl create -f cdi-cr.yaml
 

配置启动 VM

vm 特性

  • 需要数据持久化,重启不丢数据
  • IP 固定不变

配置 sc、pv、pvc

# local-sc-and-pv.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:name: centos-image
spec:capacity:storage: 90GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: DeletestorageClassName: local-storagelocal:path: /data/centos-imagenodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- sh1-st-int-k8s-ops-kubevirt-03
---
apiVersion: v1
kind: PersistentVolume
metadata:name: centos-image-scratch
spec:capacity:storage: 90GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: DeletestorageClassName: local-storagelocal:path: /data/centos-image-scratchnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- sh1-st-int-k8s-ops-kubevirt-03
 
kubectl  apply -f local-sc-and-pv.yaml
 

将压缩好的镜像放到内部 文件服务器中, {source_url} ,根据实际情况修改,然后部署 vm

# vm.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:labels:kubevirt.io/vm: vm-centos-testname: vm-centos-test
spec:running: falsetemplate:metadata:labels:kubevirt.io/vm: vm-centos-testannotations:cni.projectcalico.org/ipAddrs: '["10.70.73.9"]'spec:domain:devices:disks:- disk:bus: virtioname: datavolumedisk1interfaces:- name: defaultbridge: {}resources:requests:cpu: 4memory: 8Ginetworks:- name: defaultpod: {}volumes:- dataVolume:name: centos-dvname: datavolumedisk1dataVolumeTemplates:- metadata:name: centos-dvspec:storage:storageClassName: local-storageaccessModes:- ReadWriteOnceresources:requests:storage: 80Gisource:http:url: {source_url}
 
# 部署 vm
kubectl  apply -f vm.yaml
# 启动 vm
virtctl start vm-centos-test
# 进入 vmi
virtctl console vm-centos-test
# 写文件,然后重启,然后数据持久化,和 IP 是否固定
virtctl restart vm-centos-test
 

踩坑:

PVC 需要看镜像里面,实际的大小限制

CPU、MEM 不能太小,不然启动不起来

Todo:

编写自动化工具实现

  • 自动按需创建 local-pv
  • 纳管 calico-ipam, 实现 静态 IP 固定和分发。

参考文档:

kubespray doc:https://github.com/kubernetes-sigs/kubespray/blob/master/docs/operations/mirror.md

kubespray 离线安装配置 | roc:https://imroc.cc/kubernetes/basics/deploy/kubespray/offline

Kubevirt doc:https://kubevirt.io/user-guide/architecture/

kubevirt doc:https://kubevirt.io/user-guide/cluster_admin/installation/

kubevirt doc:https://kubevirt.io/user-guide/storage/containerized_data_importer/

kubevirt k8s-support-matrix:https://github.com/kubevirt/sig-release/blob/main/releases/k8s-support-matrix.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741130.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

夏日狂欢,铁威马众多惊喜福利来袭,这很city!

随着618的尾声悄然落下 你是否还在为错失的优惠而扼腕叹息? 但请放下遗憾,精彩从未真正落幕。 铁威马夏日狂欢季 正是为你量身打造的专属福利时刻 众多优惠活动接踵而至 往下看⬇ 惊喜福利层出不穷 快来参与吧~ 以旧换新,焕新升级 想要换新机的朋友们,铁威马夏日狂欢季为你…

manim边学边做--Paragraph

对于长篇大段的文本显示,manim中专门提供了一个Paragraph类。使用Paragraph,就不需要用拼接Text的方式来显示大段的文本。Paragraph在manim各个模块中的位置大致如上图中所示。 1. 主要参数 Paragraph可以看作是基于Text的扩展,当你需要显示多行文本的时候,用Paragraph更加…

【免费】可视化工具如何重塑教育资源的呈现方式

相比于其他的付费软件,山海鲸可视化软件内提供了海量模板,而且可以直接下载使用,无需具备专业的编程知识即可快速上手,大大节省了学校制作数据可视化大屏的时间和精力。传统教育模式下,教育资源的分配、学生的学习进度、教师的教学质量等关键信息往往隐藏在海量的数据之中…

什么?这动物图片可以上国家地理?

众所周知,能上国家地理的照片肯定是好照片,那么我们能不能用SD做出类似国家地理地理风格图片呢?一起来看看吧stable difussion中大部分的模型都是关于人的,今天交给大家一些不一样的:如何生成动物图片。在这篇文章中我们将会学到如何生成逼真的动物,可爱的动物,还有幻想中的…

飞书集成平台写入多维表格报错2

报错详情 原因多维表格中缺少审批名称字段解决办法增加这个字段,即可。

飞书集成平台写入多维表格报错

报错信息如下 原因入参中传递对应的字段中是字符串,多维表格中是超链接类型。解决办法修改多维表格的字段类型为文本类型,即可。

7 Jenkins Job迁移

在工作中可能会遇到这样的场景,即需要把一个Jenkins Master上的job迁移到另外一台Jenkins Master上,那怎么做比较好呢? 如果只是单独的一个job且这个job的设置很简单,这种情况下当然可以直接在新的Jenkins Master上直接创建job然后从旧的job拷贝下配置即可。但如果job很多,…

DeepViT:字节提出深层ViT的训练策略 | 2021 arxiv

作者发现深层ViT出现的注意力崩溃问题,提出了新颖的Re-attention机制来解决,计算量和内存开销都很少,在增加ViT深度时能够保持性能不断提高 来源:晓飞的算法工程笔记 公众号论文: DeepViT: Towards Deeper Vision Transformer论文地址:https://arxiv.org/abs/2103.11886 论…

4.7 在 VS Code 中校验 Jenkinsfile

在日常工作中,我经常需要创建或修改很多 Jenkinsfile,有时还会发生错误。这是一个非常繁琐的流程——修改 Jenkinsfile,提交、推送,然后等 Jenkins 提醒你少加了一个括号。 Command-line Pipeline Linter(https://jenkins.io/doc/book/pipeline/development/) 可以有效地减…

4.4 Jenkins共享库应用

由来与演进 在Jenkins 1.x中,对于job的配置大多是基于图形界面的,也就是说,要在GUI页面手动设置相关的job参数。 随着不同类型和用途的job越来越多,参数越来越复杂,难以有效地管理数量庞大的图形界面配置信息,也无法有效追踪和记录配置的更改。 在Jenkins 2.0中,基于Pip…

Franka libfranka 介绍

libfranka是 FCI 客户端的 C++ 实现。它处理与 Control 的网络通信,并提供接口以轻松实现以下功能:执行非实时命令来控制手并配置手臂参数。执行实时命令来运行您自己的 1 kHz 控制循环。读取机器人状态以 1 kHz 的频率获取传感器数据。访问模型库来计算所需的运动学和动态参…

Exchange被黑客利用做中继外发垃圾邮件问题分析

近期有用户反馈有大量非本域的邮件从自家服务器发出,还成功投递出来了,不过不用担心,到我们服务商这边被识破,全部拦截下来。 以下是用户自建服务器发出的垃圾邮件案例:以上信息只有ip是用户自建服务器的,发件人和邮件都非用户本人发送,可以看出域名都可以通过客户的服务…