SuKai

Kubernetes容器存储接口CSI插件controller

前面文章介绍了CSI插件node-agent组件,node-agent主要实现了需要在主机节点上才能进行的操作功能,包含了LVMNode, LVMVolume, LVMSnapshot三个自定义资源控制器和NodeServer接口服务。那么LVMVolume,LVMSnapshot这些自定义资源又是由谁创建的呢?今天我们一起看一下OpenEBS LVM存储插件的Controller部分,了解Controller如何被编排调度系统Container Orchestration system(CO)侧Kubernetes调用,Controller又如何创建自定义资源给Node-Agent调谐的。 之前我们了解到CO侧Kubernetes开发了一系列组件如external-provisioner,external-attacher,external-snapshotter,external-resizer,这些组件通过Sidecar的方式和Plugin插件驱动侧一起运行,直接调用插件Controller的gRPC服务,实现存储卷的管理。下面我们来看一下Controller的接口服务。 Controller Interface包括以下方法 // ControllerServer is the server API for Controller service. type ControllerServer interface { // 创建存储卷,创建自定义资源LVMVolume实例 CreateVolume(context.Context, *CreateVolumeRequest) (*CreateVolumeResponse, error) // 删除存储卷,删除LVMVolume实例 DeleteVolume(context.Context, *DeleteVolumeRequest) (*DeleteVolumeResponse, error) // 挂接存储卷到指定节点,因为LVM是本地设备,末实现 ControllerPublishVolume(context.Context, *ControllerPublishVolumeRequest) (*ControllerPublishVolumeResponse, error) // 卸载存储卷,末实现 ControllerUnpublishVolume(context.Context, *ControllerUnpublishVolumeRequest) (*ControllerUnpublishVolumeResponse, error) // 验证是否支持存储卷访问模式,比如支持单/多机读写,Read-Write-Once ValidateVolumeCapabilities(context.Context, *ValidateVolumeCapabilitiesRequest) (*ValidateVolumeCapabilitiesResponse, error) // 列出所有的存储卷,末实现 ListVolumes(context.Context, *ListVolumesRequest) (*ListVolumesResponse, error) // 返回指定节点的容量信息,可用存储空间 GetCapacity(context.Context, *GetCapacityRequest) (*GetCapacityResponse, error) // 返回controller支持的功能,比如创建/删除存储卷,扩展存储卷,创建删除快照,获取容量 ControllerGetCapabilities(context.Context, *ControllerGetCapabilitiesRequest) (*ControllerGetCapabilitiesResponse, error) // 创建指定存储卷快照 CreateSnapshot(context.

继续阅读

Kubernetes容器存储接口CSI插件node-agent

Kubernetes CSI插件包含两部分:controller, node-agent。今天我们一起来看一下OpenEBS的LVM存储插件,了解OpenEBS如何实现Kubernetes使用LVM逻辑卷存储数据的。LVM逻辑卷管理(Logical Volume Manager),建立在硬盘和分区之上的一个逻辑层,提高磁盘分区管理的灵活性。Kubernetes可以利用LVM本地磁盘提高存储性能,LVM具备快照功能,为KubeVirt虚拟机提供了基于Copy-On-Write的精简配置存储,是一个非常不错的轻量级超融合解决方案。 本文将包含以下几个部分:LVM基本概念,node-agent包含组件,node-agent代码实现。 LVM基本概念 PV物理卷(physical volume),LVM的基本存储逻辑块,一个PV对应一个硬盘或者硬盘分区。VG卷组(Volume Group)由物理卷组成。LV逻辑卷(Logical Volume),建立在卷组之上,一个卷组可以创建多个逻辑卷,一个逻辑卷对应一个卷组。 LVM卷快照(snapshot)用于从文件系统的时间点视图创建备份。从快照备份文件系统,卷本身供用户使用,快照最初包含自身相关的一些元数据,不包含源逻辑卷的实际数据。快照使用写时复制技术Copy-On-Write(COW)在原始数据块的数据发生更改时,复制源块中数据进行更改。 LVM精简卷Thin Provisioned Logical Volumes,精简配置逻辑卷对存储资源进行按需动态分配,即对存储进行了虚拟化管理。在卷组上建立精简池Thin Pool,在精简池上创建精简卷Thin Volume。 node-agent组件 node-agent包含:三个自定义资源控制器,一个gRPC服务。 gRPC服务 Kubelet调用node-agent的gRPC服务接口,将存储卷挂载到本机目录,kubelet创建容器时将目录文件挂载到容器。 NodeServer接口如下: type NodeServer interface { // 挂载存储卷到临时目录 NodeStageVolume(context.Context, *NodeStageVolumeRequest) (*NodeStageVolumeResponse, error) // 从临时目录卸载存储卷 NodeUnstageVolume(context.Context, *NodeUnstageVolumeRequest) (*NodeUnstageVolumeResponse, error) // 发布存储卷,LVM逻辑卷挂载到对应主机指定目录。 NodePublishVolume(context.Context, *NodePublishVolumeRequest) (*NodePublishVolumeResponse, error) // 取消发布存储卷,卸载对应主机上的LVM逻辑卷。 NodeUnpublishVolume(context.Context, *NodeUnpublishVolumeRequest) (*NodeUnpublishVolumeResponse, error) // 返回存储卷统计信息,容量,inodes。 NodeGetVolumeStats(context.Context, *NodeGetVolumeStatsRequest) (*NodeGetVolumeStatsResponse, error) // 扩展存储卷容量。 NodeExpandVolume(context.Context, *NodeExpandVolumeRequest) (*NodeExpandVolumeResponse, error) // 返回主机节点支持的能力,比如支持存储卷扩展,存储卷数据统计。 NodeGetCapabilities(context.Context, *NodeGetCapabilitiesRequest) (*NodeGetCapabilitiesResponse, error) // 返回主机节点信息,主要是Label标签里的拓扑信息。 NodeGetInfo(context.

继续阅读

Kubernetes如何使用不同厂商存储

今天我们一起来看一下Kubernetes如何使用不同厂商存储的,了解一下CSI基本的概念。 基本概念 CSI 容器存储接口Container Storage Interface规范,定义了一个行业标准,使用存储厂商开发的插件可以在多个容器编排系统运行。 PV 持久卷PersistentVolume,Kubernetes集群中的一块存储卷,提供给Pod容器存储数据,通过卷插件(provisioner)来管理,拥有独立于Pod的生命周期。 PVC 持久卷声明PersistentVolumeClaim,用户对存储的资源请求声明。 StorageClass 存储类,集群中可以提供的存储类型。管理员可以创建不同的存储类来对应不同的存储资源,卷插件和策略。 Porvisioner 卷插件根据资料请求信息完成存储设备的卷资源操作。 dynamic provisioning 动态卷配置,基于StorageClass的自动化存储资源的生命周期管理,按用户需求自动动态创建和调整存储资源,用户无需过多关注存储的管理。 下面我们一起来看一下,如何使用动态卷配置。 动态卷配置流程 1,创建一个StorageClass,指定卷插件,回收策略,存储卷绑定模式。 2,用户创建一个PVC持久卷声明,指定卷使用的存储类,读写模式,资源大小,卷类型。 3,卷插件创建持久卷。 4,Kubernetes绑定持久卷和持久卷声明。 5,容器启动时,挂载到容器中使用。 使用示例 创建CSIDriver 创建一个CSI存储插件,当我们的插件注册时会使用相同的名称,Kubernetes的组件根据名称调用插件服务。 --- # Create the CSI Driver object apiVersion: storage.k8s.io/v1 kind: CSIDriver metadata: name: local.csi.sukai.io spec: # do not require volumeattachment attachRequired: false podInfoOnMount: true storageCapacity: true 创建StorageClass 指定provisioner为local.csi.sukai.io apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: openebs-lvmsc allowVolumeExpansion: true parameters: volgroup: "lvmvg" provisioner: local.csi.sukai.io 默认的回收策略为Delete删除策略,当与PV绑定的PVC被删除的时候,删除PV存储资源。另一种策略为Retain保留策略。持久卷绑定模式为Immediate即刻绑定,立即创建持久卷并将其绑定到持久卷声明。WaitForFirstConsumer为首次使用时绑定,第一次被容器组使用时,才创建持久卷,并将其绑定到持久卷声明。

继续阅读

云平台厂商如何避免IP进入垃圾邮件黑名单

各大邮件服务商都有严格的反垃圾邮件规则,一旦IP或者域名进入了垃圾邮件黑名单,那么各大厂商都会拒收来自这个IP或者域名的所有邮件,并且只有解决掉垃圾邮件问题才能从黑名单中移除,无法申诉黑名单例外。所以几乎所有云平台厂商都默认禁止使用云平台的IP向外发送邮件,业务需要时可以申请并遵守协议才开放有限的IP发送邮件。那么有什么技术解决方案,满足用户发送邮件的需求呢?一些云平台厂商提供了SMTP中继服务,用户可将邮件通过云平台的中继服务器代发邮件,中继服务器在进行垃圾邮件过滤后再转发出去。 下面我们看一下如何使用Postfix搭建邮件中继服务器,搭建邮件中继服务器过程如下: 1,生成TLS证书,SMTP使用安全连接传输邮件。 2,安装Postfix,提供邮件发送服务。 3,安装dovecot,用于Postfix的SMTP服务认证smtp-auth。 4,安装spamassassin,用于垃圾邮件扫描。 5,用户配置路由,使用中继服务器发送邮件。 基本概念 Smarthost/SMTP relay SMTP是简单邮件发送协议简称,SMTP relay,SMTP中继,SMTP relay提供邮件代发服务,用户的邮件服务器通过配置,将邮件发送到SMTP relay服务器,SMTP relay服务器将邮件发送到目的邮件服务器。Smarthost也是SMTP relay服务,smarthost需要认证才能使用代发服务,面向部分特定用户。中继服务器一般只提供SMTP发送邮件服务,不提供IMAP/POP3邮箱服务。 SASL Simple Authentication and Security Layer, 简单验证和安全层,SASL为应用程序和共享库的开发者提供了用于验证、数据完整性检查和加密的机制。SASL特别适用于使用SMTP、IMAP应用程序,SMTP、IMAP这些协议全都支持SASL。SASL对用户使用两个重要的标识符,验证ID(authid)用于验证用户的用户ID,授予用户系统访问权限。授权ID(userid)用于检查是否允许用户使用特定选项。SASL客户端和服务器应用程序协商SASL机制和安全级别,双方协商验证机制后,交换验证数据进行验证。 SMTP over SSL/TLS SSL(Secure Socket Layer)是加密传输层,TLS(Transport Layer Security)是SSL的升级版,提供更好的安全性和性能。STARTTLS是升级非安全连接为安全连接的协议,当服务端支持时,客户端和服务端协商将已经建立的连接升级到SSL加密。 设置主机名和DNS DNS中添加主机名解析,同时在域名的SPF记录中添加允许这台中继服务器发送邮件。 # 主机名配置FQDN域名 root@mx1:~# vi /etc/hostname mx1.primebooksnepal.com # 在DNS上添加A记录解析主机名 root@mx1:~# dig mx1.primebooksnepal.com +short 220.182.46.201 root@mx1:~# dig txt primebooksnepal.com +short "v=spf1 +a +mx +ip4:103.98.131.78 +ip4:220.182.46.201 include:_spf.google.com -all" "google-site-verification=z0qEJnwgxS04QWO_g_jlKLQCDKeqskPgMddZ39HI8-c" root@mx1:~# 安装Let’s encrypt 通过DNS认证方式生成SSL证书,CA证书 /etc/letsencrypt/live/mx1.primebooksnepal.com/fullchain.pem,私有key /etc/letsencrypt/live/mx1.primebooksnepal.com/key.pem。certbot会自动创建任务进行证书更新。 root@mx1:~# apt install certbot root@mx1:~# certbot certonly --manual --rsa-key-size 4096 --agree-tos --preferred-challenges dns -d mx1.

继续阅读

邮件服务器反垃圾邮件DNS配置

工作中需要为用户提供VPS服务,VPS用户要求能够简单管理和配置服务,尽量做到开箱即用,我们为客户提供cPanel管理工具,cPanel提供Apache, Let’s encrypt, powerDNS, Exim等各种服务管理。今天我们一起来看一下邮件服务器关于反垃圾邮件的DNS配置。 基本概念 FQDN Fully Qualified Domain Name, 完全合格域名,邮件服务器的主机名要求FQDN域名,比如:srv.primebooksnepal.com PTR记录 PTR(pointer)记录用于DNS提供IP地址关联域名的反向解析,与DNS域名A记录解析IP完全相反。 MX记录 MX是DNS一种记录类型,电子邮件路由信息,邮件服务器通过SMTP协议发送邮件时,与MX记录指定邮件服务器建立SMTP连接。MX值一般是邮件服务器的主机域名。 TXT记录 TXT是DNS一种记录类型,记录值为文本类型,通常用于域名所有者的验证信息保存。 SPF Sender Policy Framework,电子邮件系统中发送方策略框架,为防止仿冒邮件。在DNS中添加域名TXT类型记录,TXT值为SPF记录信息,SPF信息包含了邮件发送服务器的IP地址,接出邮件服务器可以根据SPF记录进行验证是发送邮件服务IP是否一致,拒绝伪造邮箱域名。 DKIM DomainKeys Identified Mail (DKIM) 是加密邮件验证系统,防止邮件的头和内容被篡改。DKIM密钥包含私钥和公钥,邮件发送前使用私钥进行签名,邮件到接收服务器时,查询DNS中公钥对邮件进行验证。 DMARC DMARC (Domain-based Message Authentication, Reporting & Conformance),基于SPF和DKIM协议的可扩展电子邮件认证协议。对SPF和DKIM验证不通过的邮件,采取DMARC中指定的策略处理邮件,比如none不处理,reject拒绝邮件,quarantine标记为垃圾邮件,并发送报告给DMARC中指定的邮箱地址。 HELO HELO是邮件服务器发送的SMTP(简单邮件传输协议)命令,命令后面紧随邮件服务器的域名,用于发送邮件时标识自己名称。 邮箱检测工具 Mxtoolbox Mxtoolbox提供了邮箱服务器检测服务。https://mxtoolbox.com/ Postmaster tools Google邮件管理员工具,分析统计你的邮件服务器发送邮件到Gmail邮箱的数据。https://postmaster.google.com/ Spamhaus黑名单 Spamhaus国际非营利组织,提供反垃圾邮件系统,并提供垃圾邮件实时黑名单查询,各大邮件服务提供商采用此名单阻止名单中邮箱投递。https://check.spamhaus.org/ 配置示例 我的域名为primebooksnepal.com,邮件服务器主机名为srv.primebooksnepal.com。 配置MX记录 ningsuan@ubuntuserver:~/yaml/vpc$ dig MX primebooksnepal.com ; <<>> DiG 9.16.1-Ubuntu <<>> MX primebooksnepal.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48404 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;primebooksnepal.

继续阅读

OVN路由器对等连接

公有云网络中通过VPC来实现网络的隔离,VPC可以对应到OVN虚拟网络逻辑路由器,那么如何来实现两个路由器下子网通过路由方式直接访问呢?下面我来一起看看OVN如何配置的。 添加一个新的路由器和交换机 sudo ovn-nbctl create Logical_Router name=router2 options:chassis=6fa2da75-1393-4efe-984d-0c0310b95ad3 fecc0e10-0e9e-440e-aaac-5bb667bb2991 sudo ovn-nbctl ls-add lswitch3 连接路由器与交换机 # 路由器上添加一个端口 sudo ovn-nbctl lrp-add router2 lr2-ls3 52:54:00:c1:68:90 10.2.0.1/24 # 交换机上添加一个端口,类型为router,与路由器端口关联 sudo ovn-nbctl lsp-add lswitch3 ls3-lr2 sudo ovn-nbctl lsp-set-type ls3-lr2 router sudo ovn-nbctl lsp-set-addresses ls3-lr2 52:54:00:c1:68:90 sudo ovn-nbctl lsp-set-options ls3-lr2 router-port=lr2-ls3 在节点上添加一个ovs internal port # 交换机添加一个端口 sudo ovn-nbctl lsp-add lswitch3 ls3-vm2 sudo ovn-nbctl lsp-set-addresses ls3-vm2 "02:ac:10:ff:01:37 10.2.0.70" sudo ovn-nbctl lsp-set-port-security ls3-vm2 "02:ac:10:ff:01:37 10.2.0.70" # 主机上添加vm2接口,与交换机连接 sudo ifconfig br-int up sudo ovs-vsctl add-port br-int vm2 -- set interface vm2 type=internal sudo ip netns add vm2 sudo ip link set vm2 netns vm2 sudo ip netns exec vm2 ip link set lo up sudo ip netns exec vm2 ip link set vm2 up sudo ip netns exec vm2 ip link set vm2 address 02:ac:10:ff:01:37 sudo ip netns exec vm2 ip addr add 10.

继续阅读

容器如何使用虚拟化网络

前面文章介绍了Kube-OVN基于OVS/OVN将网络虚拟化带入云原生领域。下面我们通过下面的实验场景来看一下容器如何使用虚拟化网络的,从而了解Kube-OVN的基本工作原理。 实验环境 实验使用的是两台虚拟机:ovn-1为控制节点和计算节点,IP地址为:192.168.0.115。ovn-2为计算节点,IP地址为:192.168.0.114。 实验场景 1,两个主机上进入网络命名空间,配置不同网段进行通信 2,Docker运行容器,通过OVS internal port进行通信 3,Docker运行容器,通过veth pair进行通信 安装部署 #控制节点和计算节点 sudo apt install net-tools sudo apt-get install python-six openssl -y sudo apt-get install openvswitch-switch openvswitch-common -y sudo systemctl disable apparmor #控制节点 sudo apt-get install ovn-central ovn-common ovn-host -y #计算节点 sudo apt-get install ovn-host ovn-common -y 配置ovn 设置ovn数据库允许tcp进行连接,默认只允许socket本地访问。 #控制节点 sudo ovn-nbctl set-connection ptcp:6641:0.0.0.0 -- set connection . inactivity_probe=60000 sudo ovn-sbctl set-connection ptcp:6642:0.0.0.0 -- set connection . inactivity_probe=60000 sudo ovs-appctl -t ovsdb-server ovsdb-server/add-remote ptcp:6640:192.

继续阅读

Kube-OVN如何实现Pod和主机网络连通

下面从Kube-OVN代码看一下如何实现Pod和主机网络连通的,再在实验环境中按照Kube-OVN方式进行实验。 | Kube-OVN初始化ovn0 Kube-OVN在主机上添加一个OVS的internal port:ovn0,实现主机和OVS网络的通信。 1,将ovn0连接到OVS集成网桥br-int,类型为internal port,与交换机端口关联。 2,配置ovn0的MAC, IP, MTU并启动接口。 // InitNodeGateway init ovn0 func InitNodeGateway(config *Configuration) error { ... return configureNodeNic(portName, ipAddr, gw, mac, config.MTU) } func configureNodeNic(portName, ip, gw string, macAddr net.HardwareAddr, mtu int) error { ipStr := util.GetIpWithoutMask(ip) raw, err := ovs.Exec(ovs.MayExist, "add-port", "br-int", util.NodeNic, "--", "set", "interface", util.NodeNic, "type=internal", "--", "set", "interface", util.NodeNic, fmt.Sprintf("external_ids:iface-id=%s", portName), fmt.Sprintf("external_ids:ip=%s", ipStr)) if err != nil { klog.Errorf("failed to configure node nic %s: %v, %q", portName, err, raw) return fmt.

继续阅读

Kube-OVN为KubeVirt虚拟机分配固定IP

KubeVirt虚拟机使用固定IP是生产中比较普遍的一个需求,今天我们一起看一下如何通过Kube-OVN为虚拟机提供固定IP。 配置kube-ovn-controller启动参数 Containers: kube-ovn-controller: Container ID: containerd://0f8d53403c9821c7b535c64d2c98e1ca130a15e1b2b878270cd9388c36d0e48a Image: kubeovn/kube-ovn:v1.11.0 Image ID: docker.io/kubeovn/kube-ovn@sha256:fea623e68a2a81ef78102c6cfe95b96c16c054c57f4c8b9d168bd3ff620b6779 Port: <none> Host Port: <none> Args: /kube-ovn/start-controller.sh --default-cidr=10.244.0.0/16 --default-gateway=10.244.0.1 --default-gateway-check=true --default-logical-gateway=false --default-exclude-ips= --node-switch-cidr=100.64.0.0/16 --service-cluster-ip-range=10.211.0.0/16 --network-type=geneve --default-interface-name= --default-vlan-id=100 --pod-nic-type=veth-pair --enable-lb=true --enable-np=true --enable-eip-snat=true --enable-external-vpc=true --keep-vm-ip=true 创建虚拟机 spec.template.spec.interfaces.macAddress指定虚拟机网卡MAC,每次删除重建这台虚拟机时使用同一个MAC地址,与系统的网卡配置文件/etc/netplan/50-cloud-init.yaml中MAC地址一致,不需要重新进行配置。 spec.template.metadata.annotations中添加两条记录,ovn.kubernetes.io/ip_address指定kube-ovn使用IP,ovn.kubernetes.io/mac_address告诉kube-ovn网卡的MAC地址。 --- apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata: labels: kubevirt.io/vm: ubuntu-c name: ubuntu-c namespace: mail263 spec: running: true template: metadata: labels: kubevirt.io/vm: ubuntu-c annotations: ovn.kubernetes.io/ip_address: 172.16.3.203 ovn.kubernetes.io/mac_address: 00:00:00:1F:C5:8F spec: domain: cpu: cores: 4 model: host-passthrough memory: guest: 1Gi devices: disks: - name: bootdisk disk: bus: virtio - disk: bus: virtio name: cloudinitdisk interfaces: - name: default bridge: {} macAddress: 00:00:00:1f:c5:8f resources: overcommitGuestOverhead: true networks: - name: default pod: {} terminationGracePeriodSeconds: 0 volumes: - name: bootdisk dataVolume: name: ubuntuboot-c - name: cloudinitdisk cloudInitNoCloud: userData: |- #cloud-config ssh_pwauth: True chpasswd: list: | ubuntu:ubuntu expire: False 固定MAC

继续阅读

KubeVirt虚拟机资源超卖

使用过虚拟化平台的同学都知道,虚拟化平台可以通过KVM内存ballooning技术动态调整虚拟机的内存配置,实现运行所有VM总内存可以大于物理主机实际内存。当我们在Kubernetes平台通过KubeVirt管理虚拟机时,如何实现资源超卖呢? 基本概念 KubeVirt资源管理 Kubernetes通过Pod的Resource requests来申请占用资源,根据资源请求量Kubernetes计算主机节点资源进行Pod的调度。默认情况下KubeVirt根据虚拟机VM的资源请求从主机申请资源创建虚拟机virt-launcher Pod,Pod调度后调用libvirt创建对应虚拟机,通过这种方式达到了Kubernetes对虚拟机资源的管理和调度。 通过上面介绍,我们知道KubeVirt可以分开配置Pod的资源request与libvirt虚拟机资源,比如通过设置一个比例来达到虚拟机资源超卖。举例说明,如果我们设置内存超卖比例为150%,创建一个虚拟机内存为3072M,那么Pod请求内存资源则为2048M。假设主机内存为100G,不考虑其他组件资源开销,根据Pod请求则可以创建出内存总量为150G的虚拟机。 但由于KubeVirt目前还不支持Memory Ballooning技术,KubeVirt并没有像KVM调用libvirt获取当前内存使用量,动态调整libvirt中虚拟机分配内存。所以KubeVirt中的虚拟机内存占用了的内存无法减少来释放资源。 CPU时间 Kubernetes将CPU一个核切分为1000时间片,使用m作为单位,1m表示千分之一核milliCPU。 操作实践 KubeVirt配置资源分配比例 cpuAllocationRatio指定CPU分配比例2000%,比如虚拟机CPU核数为12核,Pod virt-launcher的CPU资源请求则为600m。memoryOvercommit指定内存分配比例为150%。 kubectl -n kubevirt edit kubevirt ... spec: configuration: developerConfiguration: cpuAllocationRatio: 20 featureGates: - HardDisk - DataVolumes memoryOvercommit: 150 ... 创建KubeVirt虚拟机 可以看到spec.template.domain下的spec.template.domain.cpu和spec.template.domain.memory指定了创建虚拟机资源。 spec.template.domain.resources.overcommitGuestOverhead配置不请求额外资源开销,管理虚拟机的基础设施组件需要的内存资源。默认为false,当创建一个虚拟机内存为1Gi时,virt-launcher Pod请求的内存资源为1Gi + 200Mi。 spec.template.domain.resources.requests这里仍然指定了requests,virt-launcher Pod将使用这个requests来请求k8s资源,这样就会不使用上面配置的比例。一般情况不需要再这里指定requests,KubeVirt使用比例计算出requests的资源量。 --- apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata: labels: kubevirt.io/vm: mailserver name: ubuntu-c namespace: mail263 spec: running: true template: metadata: labels: kubevirt.io/vm: ubuntu-c annotations: ovn.kubernetes.io/ip_address: 172.16.3.203 ovn.kubernetes.io/mac_address: 00:00:00:1F:C5:8F spec: domain: cpu: cores: 12 model: host-passthrough memory: guest: 96Gi devices: disks: - name: bootdisk disk: bus: virtio - disk: bus: virtio name: cloudinitdisk interfaces: - name: default bridge: {} macAddress: 00:00:00:1f:c5:8f resources: overcommitGuestOverhead: true requests: memory: 16Gi networks: - name: default pod: {} terminationGracePeriodSeconds: 0 volumes: - name: bootdisk dataVolume: name: ubuntuboot-c - name: cloudinitdisk cloudInitNoCloud: userData: |- #cloud-config ssh_pwauth: True chpasswd: list: | ubuntu:ubuntu 查看KubeVirt的ubuntu-c虚拟机VMI资源定义

继续阅读