OpenStack Kubernetes kubevirt
# OpenStack Kubernetes kubevirt
# 一. OpenStack
# 1. 简介
OpenStack 是一个开源的云计算平台,用于构建和管理公有云和私有云环境。它提供了一组模块化的软件工具,用于创建和管理大规模的虚拟化资源池,包括计算、存储和网络资源。
解决什么问题
构建和管理云基础设施涉及多个组件和技术,包括计算、存储、网络等。OpenStack 提供了一个统一的平台,整合了这些组件,并提供了一致的管理工具和接口,帮助简化和标准化云基础设施的部署和管理过程。
将各个物理机的计算资源、网络资源、存储资源进行抽象,形成一个操作系统,提供上层服务。
# 2.核心组件
# Keystone - 身份识别服务(identy service)
keystone官方文档 (opens new window)
Keystone为所有的OpenStack组件提供认证和访问策略服务,它依赖自身REST系统进行工作,主要对(但不限于)Swift、Glance、Nova等进行认证与授权。
# Nova - 计算机服务 (Compute)
OpenStack Compute (nova) — nova 27.1.0.dev173 documentation (opens new window)
Nova是OpenStack计算的弹性控制器,用于创建和管理虚拟机实例的计算服务。OpenStack云实例生命期所需的各种动作都将由Nova进行处理和支撑,这就意味着Nova以管理平台的身份登场,负责管理整个云的计算资源、网络、授权及测度。虽然Nova本身并不提供任何虚拟能力,但是它将使用libvirt API与虚拟机的宿主机进行交互。Nova通过Web服务API来对外提供处理接口。
Nova不是虚拟机管理软件(Hypervisor)而是处于其上的编排调度可用的计算资源
支持的虚拟机管理软件:KVM,Xen,Vmware,ESXi,Hyper-V等
# Glance - 镜像服务(Image service)
Welcome to Glance’s documentation! — glance 27.0.0.0b3.dev33 documentation (opens new window)
通常而言,在虚拟机被创建之后,都需要为其安装一个操作系统,以便用户使用。为此,云计算系统中往往需要预置若干不同种类、不同版本的操作系统镜像,以便用户选用。Glance主要负责对系统中提供的各类镜像的元数据进行管理,并提供镜像的创建、删除、查询、上传、下载等能力。
OpenStack镜像服务器是一套虚拟机镜像发现、注册、检索系统。但并不是镜像的存储容器。
镜像文件可以保存OpenStack对象存储Swift中。
# Swift - 对象存储服务 (object storage service)
Welcome to Swift’s documentation! — Swift 2.32.1.dev6 documentation (opens new window)
Swift 是 OpenStack 的对象存储服务组件,用于提供可扩展的对象存储能力。它适用于存储大规模非结构化数据,具有高可用性、冗余和数据分布性的特点。
# Cinder - 块存储服务(block storage service)
Cinder 是 OpenStack 的块存储服务组件,用于提供持久化存储资源。它允许用户创建和管理块存储卷,并将其附加到虚拟机实例上,以满足应用程序的存储需求。
# Neutron - 网络服务 (networking service)
Welcome to Neutron’s documentation! — Neutron 23.0.0.0b4.dev22 documentation (opens new window)
网络服务,是任意云操作系统IaaS层能力的关键组成部分。只有基于稳定、易用、高性能的云上虚拟网络,用户才能将云计算系统提供的各类资源和服务能力连接成真正满足需求的应用系统,以解决自身的实际业务需求。
用户可以利用它管理虚拟网络资源和IP地址
用户可以通过门户面板,命令行和应用编程接口来创建、查看、修改和删除自己的网络,子网,端口,防火墙规则和路由器
# Ceilometer - 计量服务 (Telemetry)
Welcome to Ceilometer’s documentation! — Ceilometer 20.1.0.dev26 documentation (opens new window)
# Horizon - 控制面板服务 (Dashboard)
Horizon: The OpenStack Dashboard Project — horizon 23.2.1.dev22 documentation (opens new window)
Horizon是一个用以管理、控制OpenStack服务的Web控制面板,它可以管理实例、镜像、创建密匙对,对实例添加卷、操作Swift容器等。除此之外,用户还可以在控制面板中使用终端(console)或VNC直接访问实例。
支持其他云计算提供商在Dashboard进行二次开发。
# 二. Kubernetes
# 1. 简介
● 传统部署
无法为物理服务器中的应用程序定义资源边界
当一个服务器部署多个应用时,可能存在一个应用大量占用资源而导致另一个应用运行受影响
当每台服务器运行一个应用时,存在资源浪费以及物理服务器维护成本很高
● 虚拟化部署
缺点:增加了操作系统,浪费了部分资源
● 容器化部署
一个容器故障停机了,无法做到立刻启动另一个容器修复
当应用的并发访问量变大的时候,横向扩展容器数量麻烦
Kubernetes(常简称为K8s)是一个开源的容器编排和管理平台,用于自动化应用程序的部署、扩展和操作。它可以管理跨多个主机的容器化应用,提供了一种简化和自动化容器化应用程序的管理方式。
● (1)自我修复:一旦某个容器崩溃,能够再1秒中左右迅速启动新的容器
● (2)弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
● (3)服务发现:服务可以通过自动发现的形式找到它所依赖的服务
● (4)负载均衡:如果一个服务启动了多个容器,能够自动实现请求的负载均衡
● (5)版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
# 2. 组件
# Master
kube-apiserver(API Server): kube-apiserver 是 Kubernetes 的 API 入口,接收来自用户、客户端和其它组件的 API 请求,并将其分发到适当的组件进行处理。它是集群的控制中心。
kube-controller-manager(Controller Manager): kube-controller-manager 监控集群中的资源状态,并根据定义的期望状态来自动调整系统状态。例如,ReplicaSet、Deployment、Service 等控制器都属于这个组件的管理范畴。
kube-scheduler(Scheduler): kube-scheduler 负责将未分配的 Pod 调度到适当的 Worker 节点上,考虑到资源需求、硬件约束和亲和性等因素,以确保集群的均衡和高效。
etcd: etcd 是一个高可用的分布式键值存储,用于存储 Kubernetes 集群的所有配置数据、状态信息和元数据。所有 Master 节点共享同一个 etcd 集群。
cloud-controller-manager:主要目的是将云服务提供商相关的逻辑与 Kubernetes 核心代码进行分离。这样做的好处是,可以将云特定的操作和资源管理与 Kubernetes 的核心逻辑隔离开来,使 Kubernetes 的核心代码更加稳定和通用。同时,它也允许云提供商根据其平台的特性进行定制和优化。
# node
kubelet: kubelet 是每个 Worker 节点上的代理,负责监控该节点上的 Pod,并确保 Pod 的容器处于预期的状态。它会与 Master 节点中的 kube-apiserver 通
信以获取分配给它的 Pod。
kube-proxy: kube-proxy 负责维护节点上的网络代理,它管理集群中的网络规则,以便允许集群内的 Pod 与外部网络和其它 Pod 进行通信。
Container Runtime(如 Docker、containerd、CRI-O 等): Worker 节点上的容器运行时负责启动和管理容器。它负责拉取容器镜像、创建容器、监控容器状态,并处理容器生命周期。
Pod: Pod 是 Kubernetes 中最小的可调度单元,一个 Pod 中可以包含一个或多个容器。Worker 节点托管这些 Pod 的容器,保证它们在正确的节点上运
行。
# 3. 资源
NameSpace
Pod
Deployment
Service
Ingress
# 4. 污点和容忍度
# 三. kubevirt
# 1. 介绍
OpenStack: 关注于虚拟机的计算,网络和存储资源的管理
kubernetes:关注容器的自动化部署、编排调度和发布管理
kubevit将k8s和OpenStack的优势结合起来,提供更加灵活和统一的容器和虚拟机环境。
它提供了在 Kubernetes 上管理和运行虚拟机的能力,使得用户可以使用 Kubernetes API 和工具来管理虚拟机实例,将容器和虚拟机混合部署。
特点:
● 虚拟机管理:KubeVirt 允许用户通过 Kubernetes API 创建、启动、停止和删除虚拟机实例。它将虚拟机抽象为 Kubernetes 资源,用户可以使用标准 Kubernetes 工具和命令来管理虚拟机。
● 资源调度与共享:KubeVirt 借助 Kubernetes 的调度器和资源管理器来实现虚拟机的调度和资源分配。它可以与 Kubernetes 集群的调度策略和资源限制进行集成,实现虚拟机与容器资源的共享和利用。
● 容器与虚拟机混合部署:KubeVirt 允许用户在同一 Kubernetes 集群中同时部署容器和虚拟机。这使得用户可以根据应用程序的需求选择最适合的运行环境,无需使用独立的虚拟化平台。
● 存储和网络集成:KubeVirt 与 Kubernetes 的存储和网络功能进行集成,用户可以使用持久卷(Persistent Volume)和网络服务(Service)等 Kubernetes 资源来为虚拟机提供存储和网络连接。
# 2. 组件
# virt-controller
virt-controller 是 KubeVirt 的核心组件之一,负责实现虚拟机的生命周期管理和操作。它与 Kubernetes API Server 进行交互,接收用户的虚拟机操作请求,并与其他组件协同工作,确保虚拟机的正确运行。
# virt-api
virt-api 提供了一个 RESTful API 接口,用于与 KubeVirt 进行交互。用户可以使用该接口创建、修改和查询虚拟机实例,以及执行与虚拟机相关的操作。virt-api 与 Kubernetes API Server 进行通信,并将请求转发给 virt-controller 进行处理。
# virt-handler
virt-handler 是 KubeVirt 的另一个核心组件,运行在每个 Kubernetes 节点上。它负责在节点上创建和管理虚拟机实例,与底层的虚拟化平台(如 KVM)进行交互,并监控虚拟机的运行状态。
# virt-launcher
virt-launcher 是 KubeVirt 的容器运行时组件,用于在 Kubernetes 中启动和管理虚拟机实例。它负责创建和管理虚拟机所需的容器,以及与 virt-handler 进行通信以管理虚拟机的运行。
# libvirtd
libvirtd 是一个虚拟化管理工具,提供统一的接口和管理功能,用于管理和控制虚拟机的创建、配置和操作。
# QEMU
QEMU 是一个虚拟机监视器和仿真器,提供虚拟硬件模拟和虚拟机管理功能,使得在虚拟机中可以运行不同的操作系统。
# 3. 创建一台虚拟机
● 定义vm.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=
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
● 创建 vm
kubectl create -f vm.yaml
● 启动vmi
# 启动testvm这个虚拟机
[root@master ~]# virtctl start testvm
VM testvm was scheduled to start
# 查看Pod,这个Pod里面就存放一个虚拟机
[root@master ~]# kubectl get pods
virt-launcher-testvm-c5gfc 2/2 Running 0 25s
# 在查看vmi资源
[root@master ~]# kubectl get vmi
NAME AGE PHASE IP NODENAME READY
testvm 59s Running 10.244.1.26 node1 True
2
3
4
5
6
7
8
9
10
启动成功后可以进行登录:
virtctl console testvm
#Ctrl+]退出此虚拟机
Successfully connected to testvm console. The escape sequence is ^]
OK
GROWROOT: NOCHANGE: partition 1 is size 71647. it cannot be grown
/dev/root resized successfully [took 0.17s]
/run/cirros/datasource/data/user-data was not '#!' or executable
=== system information ===
Platform: KubeVirt None/RHEL-AV
Container: none
Arch: x86_64
CPU(s): 1 @ 2199.541 MHz
Cores/Sockets/Threads: 1/1/1
Virt-type: AMD-V
RAM Size: 43MB
Disks:
NAME MAJ:MIN SIZE LABEL MOUNTPOINT
vda 253:0 46137344
vda1 253:1 36683264 cirros-rootfs /
vda15 253:15 8388608
vdb 253:16 1048576 cidata
=== sshd host keys ===
-----BEGIN SSH HOST KEY KEYS-----
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCh4nXQS4nzbGRBMHw92aSBrSG1OPxbfp99vC2NHrYLtA6rMbi8sZ7H7Ys7A4RVC0vH1dcbVN/NFXRBfANXcD0rmr17HHX6nhXvFzWGBEEZEY2OYWErjxGAtAI/m+6OwOoYwYkHVIZTyAMejcN/JgW+yYqPAc8Md7zAfZ5c9xTqVnRASFxTpWwxGaf5p1pWq1RH2QHzKvEcbSqt0OIRyneqo25xn7we3rh2KcjCj16f4E0iL7qkum/ftv6bzgZ9mPKgRb2ja6W1LEek1GlHIwmvUuflL8Y6a4sk0RFTvyEUnNq8SdNBTqTUGZ9O8SSQx1bj733vr2WGLljDZkFB6Ver root@testvm
ssh-dss AAAAB3NzaC1kc3MAAACBAIlxV2kDXdGe3qapWXZ2qKoI3KCK9c6w80zSgfr0loLFwUaCWZax6NedlJDIXzoigjcgT0YWQT40aLxUrYQXlBUISnz8CkfKjfByzQK1WMP4OpZ0xjCWuuOdp0kqtGr76J8teq14RTRHdApUey0JHQCEkEU05AUqj3V3nmY8HcoRAAAAFQCmziUZA8vzBKHzc19KOpxnCsndUwAAAIBCPympZPf8EuY7miagP+vt6qFSW2Yv1X/xP0vTqd89BYCYmgoGHYKlU3B7gCq7EEF5kphzZ0CagjAPiHt50X3aL9vviqM9gJx721Dz+y5xvnicRs0OKfYMSDo7gg5bcsKM/BtKTR80gRq51IBWm+kO5NcIcCK75HIQX5cu5UK2DwAAAIBZPygbYSM7fetwf0qEvXInhbsvDtjFGXsHAh2M3n6DkbmDgTjwcnDBb2WPzkMzmnGz/mCsClMR/mZRjViZ7A5i3OKk2tpqBQbfP0drKPg4WaMuvtpkZ5drr8y6PHWlweekBmcuiK0mHlgRFCl0aoJ0KWXU0AH3llDxdZlVwl1U1Q== root@testvm
-----END SSH HOST KEY KEYS-----
=== network info ===
if-info: lo,up,127.0.0.1,8,,
if-info: eth0,up,10.0.2.2,24,fe80::5054:ff:feae:bce3/64,
ip-route:default via 10.0.2.1 dev eth0
ip-route:10.0.2.0/24 dev eth0 src 10.0.2.2
ip-route6:fe80::/64 dev eth0 metric 256
ip-route6:unreachable default dev lo metric -1 error -101
ip-route6:ff00::/8 dev eth0 metric 256
ip-route6:unreachable default dev lo metric -1 error -101
=== datasource: nocloud local ===
instance-id: testvm.default
name: N/A
availability-zone: N/A
local-hostname: testvm
launch-index: N/A
=== cirros: current=0.4.0 uptime=18.75 ===
____ ____ ____
/ __/ __ ____ ____ / __ / __/
/ /__ / // __// __// /_/ /\ \
___//_//_/ /_/ ____/___/
http://cirros-cloud.net
login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
#根据上面提供的用户/密码进行登录
testvm login:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
①虚拟机生命周期 Lifecycle
● 创建vm
kubectl create -f vmi.yaml
● 启动vmi
virtctl start my-vm
● 暂停vmi
virtctl stop my-vm
● 停止vmi
virtctl pause vmi testvm
● 删除vm
kubectl delete vmis testvmi
对比vm和vmi
Virtual machines, in contrast to VirtualMachineInstances, have a running state. Thus on VM you can define if it should be running, or not. VirtualMachineInstances are, if they are defined in the cluster, always running and consuming resources.