利用 Kuryr 整合 OpenStack 与 Kubernetes 网络

Kubernetes Kuryr 是 OpenStack Neutron 的子项目,其主要目标是通过该项目来整合 OpenStack 与 Kubernetes 的网络。该项目在 Kubernetes 中实作了原生 Neutron-based 的网络,因此使用 Kuryr-Kubernetes 可以让你的 OpenStack VM 与 Kubernetes Pods 能够选择在同一个子网上运作,并且能够使用 Neutron 的 L3 与 Security Group 来对网络进行路由,以及阻挡特定来源 Port。

Kuryr-Kubernetes 整合有两个主要组成部分:

  1. Kuryr Controller:
    Controller 主要目的是监控 Kubernetes API 的来获取 Kubernetes 资源的变化,然后依据 Kubernetes 资源的需求来执行子资源的分配和资源管理。
  2. Kuryr CNI:主要是依据 Kuryr Controller 分配的资源来绑定网络至 Pods 上。

本篇我们将说明如何利用DevStack与Kubespray建立一个简单的测试环境。

环境资源与事前准备

准备两台实体机器,这边测试的操作系统为CentOS 7.x,该环境将在扁平的网络下进行。

IP Address 1Role
172.24.0.34controller, k8s-master
172.24.0.80compute, k8s-node1

更新每台节点的 CentOS 7.x packages:

$ sudo yum --enablerepo=cr update -y

然后关闭 firewalld 以及 SELinux 来避免实现发生问题:

$ sudo setenforce 0 
$ sudo systemctl disable firewalld && sudo systemctl stop firewalld

OpenStack Controller 安装

首先进入172.24.0.34(controller),并且执行以下指令。

然后执行以下指令来建立 DevStack 专用使用者:

$ sudo useradd -s /bin/bash -d /opt/stack -m stack
$ echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack

选用 DevStack 是因为现在都是用 Systemd 来管理服务,不用再用 screen 了,虽然都很方便。

接着切换至该使用者环境来建立 OpenStack:

$ sudo su - stack

下载 DevStack 安装套件:

$ git clone https://git.openstack.org/openstack-dev/devstack
$ cd devstack

新增local.conf文件,来描述部署信息:

[[local|localrc]]
HOST_IP=172.24.0.34
GIT_BASE=https://github.com

ADMIN_PASSWORD=passwd
DATABASE_PASSWORD=passwd
RABBIT_PASSWORD=passwd
SERVICE_PASSWORD=passwd
SERVICE_TOKEN=passwd
MULTI_HOST=1

修改 HOST_IP 为自己的 IP 位置。

完成后,执行以下指令开始部署:

$ ./stack.sh

Openstack Compute 安装

进入到172.24.0.80(compute),并且执行以下指令。

然后执行以下指令来建立 DevStack 专用使用者:

$ sudo useradd -s /bin/bash -d /opt/stack -m stack
$ echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack

选用 DevStack 是因为现在都是用 Systemd 来管理服务,不用再用 screen 了,虽然都很方便。

接着切换至该使用者环境来建立 OpenStack:

$ sudo su - stack

下载 DevStack 安装套件:

$ git clone https://git.openstack.org/openstack-dev/devstack
$ cd devstack

新增local.conf文件,来描述部署信息:

[[local|localrc]]
HOST_IP=172.24.0.80
GIT_BASE=https://github.com
MULTI_HOST=1
LOGFILE=/opt/stack/logs/stack.sh.log
ADMIN_PASSWORD=passwd
DATABASE_PASSWORD=passwd
RABBIT_PASSWORD=passwd
SERVICE_PASSWORD=passwd
DATABASE_TYPE=mysql

SERVICE_HOST=172.24.0.34
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=$SERVICE_HOST:9292
ENABLED_SERVICES=n-cpu,q-agt,n-api-meta,c-vol,placement-client
NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
VNCSERVER_LISTEN=$HOST_IP
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN

Tips:
修改 HOST_IP 为自己的主机位置。
修改 SERVICE_HOST 为 Master 的IP位置。

完成后,执行以下指令开始部署:

$ ./stack.sh

建立 Kubernetes 集群环境

首先确认所有节点之间不需要 SSH 密码即可登入,接着进入到172.24.0.34(k8s-master)并且执行以下指令。

接着安装所需要的套件:

$ sudo yum -y install software-properties-common ansible git gcc python-pip python-devel libffi-devel openssl-devel
$ sudo pip install -U kubespray

完成后,新增 kubespray 配置文件:

$ cat <<EOF >  ~/.kubespray.yml
kubespray_git_repo: "https://github.com/kubernetes-incubator/kubespray.git"
# Logging options
loglevel: "info"
EOF

然后利用 kubespray-cli 快速生成环境的inventory文件,并修改部分内容:

$ sudo -i
$ kubespray prepare --masters master --etcds master --nodes node1

编辑/root/.kubespray/inventory/inventory.cfg,修改以下内容:

[all]
master  ansible_host=172.24.0.34 ansible_user=root ip=172.24.0.34
node1    ansible_host=172.24.0.80 ansible_user=root ip=172.24.0.80

[kube-master]
master

[kube-node]
master
node1

[etcd]
master

[k8s-cluster:children]
kube-node1
kube-master

完成后,即可利用 kubespray-cli 指令来进行部署:

$ kubespray deploy --verbose -u root -k .ssh/id_rsa -n calico

经过一段时间后就会部署完成,这时候检查节点是否正常:

$ kubectl get no
NAME      STATUS         AGE       VERSION
master    Ready,master   2m        v1.7.4
node1     Ready          2m        v1.7.4

接着为了方便让 Kuryr Controller 简单取得 K8s API Server,这边修改/etc/kubernetes/manifests/kube-apiserver.yml档案,加入以下内容:

- "--insecure-bind-address=0.0.0.0"
- "--insecure-port=8080"

Tips:
将 insecure 绑定到 0.0.0.0 之上,以及开启 8080 Port。

安装 Openstack Kuryr

进入到172.24.0.34(controller),并且执行以下指令。

首先在节点安装所需要的套件:

$ sudo yum -y install  gcc libffi-devel python-devel openssl-devel install python-pip

然后下载 kuryr-kubernetes 并进行安装:

$ git clone http://git.openstack.org/openstack/kuryr-kubernetes
$ pip install -e kuryr-kubernetes

新增kuryr.conf至/etc/kuryr目录:

$ cd kuryr-kubernetes
$ ./tools/generate_config_file_samples.sh
$ sudo mkdir -p /etc/kuryr/
$ sudo cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf

接着使用 OpenStack Dashboard 建立相关项目,在浏览器输入Dashboard,并执行以下步骤。

  1. 新增 K8s project。
  2. 修改 K8s project member 加入到 service project。
  3. 在该 Project 中新增 Security Groups,参考kuryr-kubernetes manually
  4. 在该 Project 中新增 pod_subnet 子网。
  5. 在该 Project 中新增 service_subnet 子网。

完成后,修改/etc/kuryr/kuryr.conf文件,加入以下内容:

[DEFAULT]
use_stderr = true
bindir = /usr/local/libexec/kuryr

[kubernetes]
api_root = http://172.24.0.34:8080

[neutron]
auth_url = http://172.24.0.34/identity
username = admin
user_domain_name = Default
password = admin
project_name = service
project_domain_name = Default
auth_type = password

[neutron_defaults]
ovs_bridge = br-int
pod_security_groups = {id_of_secuirity_group_for_pods}
pod_subnet = {id_of_subnet_for_pods}
project = {id_of_project}
service_subnet = {id_of_subnet_for_k8s_services}

完成后执行 kuryr-k8s-controller:

$ kuryr-k8s-controller --config-file /etc/kuryr/kuryr.conf

安装 Kuryr-CNI

进入到172.24.0.80(node1)并且执行以下指令。

首先在节点安装所需要的套件:

$ sudo yum -y install  gcc libffi-devel python-devel openssl-devel python-pip

然后安装 Kuryr-CNI 来提供给 kubelet 使用:

$ git clone http://git.openstack.org/openstack/kuryr-kubernetes
$ sudo pip install -e kuryr-kubernetes

新增kuryr.conf至/etc/kuryr目录:

$ cd kuryr-kubernetes
$ ./tools/generate_config_file_samples.sh
$ sudo mkdir -p /etc/kuryr/
$ sudo cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf

修改/etc/kuryr/kuryr.conf档案,加入以下内容:

[DEFAULT]
use_stderr = true
bindir = /usr/local/libexec/kuryr
[kubernetes]
api_root = http://172.24.0.34:8080

建立 CNI bin 与 Conf 目录:

$ sudo mkdir -p /opt/cni/bin
$ sudo ln -s $(which kuryr-cni) /opt/cni/bin/
$ sudo mkdir -p /etc/cni/net.d/

新增/etc/cni/net.d/10-kuryr.conf CNI 配置文件:

{
    "cniVersion": "0.3.0",
    "name": "kuryr",
    "type": "kuryr-cni",
    "kuryr_conf": "/etc/kuryr/kuryr.conf",
    "debug": true
}

完成后,更新 oslo 与 vif python 库:

 $ sudo pip install 'oslo.privsep>=1.20.0' 'os-vif>=1.5.0'

最后重新启动相关服务:

sudo systemctl daemon-reload && systemctl restart kubelet.service

测试结果

我们这边开一个 Pod 与 OpenStack VM 来进行沟通:

<think>好的,我需要帮用户寻找在Kubernetes集群中替代KubeVirt和Virtlet的虚拟机管理工具。首先,回顾用户提供的引用内容,用户已经了解KubeVirt和Virtlet的基本架构,比如KubeVirt使用CRD、virt-launcher Pod管理虚拟机,而Virtlet通过CNI配置网络。用户现在需要替代方案,可能需要类似的集成度或不同的优势。 接下来,我应该回忆一下其他在K8s上管理虚拟机的工具。首先想到的是OpenStack的Nova,但用户可能想要更轻量级的方案。然后是Kata Containers,不过它更偏向容器运行时,提供虚拟机级别的隔离,但用户可能希望直接管理虚拟机。接着是Firecracker,由AWS开发,适合轻量级VM,常用于serverless场景,比如配合K8s的CRI实现。此外,还有Rancher的Harvester,专为K8s设计的混合管理平台,可能符合用户需求。 另外,检查是否有其他项目,如Virtink,这是一个新兴项目,专注于简化VM管理,使用K8s原生API。还有像Google的gVisor,但它的安全沙箱可能不够VM级别的管理。此外,可能需要考虑云厂商的特定方案,如AWS的EKS Anywhere,但可能不符合用户的自托管需求。 需要验证这些工具是否支持通过K8s API管理VM,是否活跃维护,社区支持如何。例如,Harvester由Rancher支持,社区活跃;Firecracker有AWS背景,但集成到K8s需要额外工具如Ignite。Virtink相对较新,可能生态不够成熟。KubeVirt和Virtlet的替代方案需要满足类似的CRD和Pod管理VM的方式。 同时,用户可能关注网络、存储的集成,以及是否支持热迁移、快照等高级功能。比如Harvester内置Longhorn存储,适合需要存储管理的场景。而Firecracker更注重启动速度和资源效率,适合高密度部署。 另外,是否需要Operator模式或使用现有工具如TerraformK8s结合?但用户明确想要在K8s集群内管理VM的工具,所以应专注于原生集成方案。 总结可能的替代方案:Harvester、Kata Containers(作为运行时)、Firecracker with Ignite、Virtink、以及OpenStack的Nova集成。需要逐一分析这些工具的优缺点,并对比用户引用中提到的KubeVirt特性,如CRD、Pod管理、网络配置方式等,确保推荐方案能满足类似需求。 最后,用户可能需要具体的比较,如架构差异、适用场景、部署复杂度等,因此回答中需要结构清晰地列出每个工具,并说明其特点及适用性,帮助用户做出选择。</think>### 替代 KubeVirt 和 Virtlet 的 Kubernetes 虚拟机管理方案 在 Kubernetes 集群中管理虚拟机(VM)时,除了 KubeVirt 和 Virtlet,还有多种替代工具和技术可满足不同场景需求。以下是几种主流方案及其核心特点: --- #### 1. **Harvester(Rancher 生态系统)** - **架构特点**: Harvester 是一个专为 Kubernetes 设计的开源混合云平台,通过内置的轻量化 Hypervisor(如 KVM)直接管理虚拟机,并 Kubernetes 资源无缝集成。它使用 `Longhorn` 提供分布式存储,支持 VM 生命周期管理、快照、热迁移等功能[^1]。 - **适用场景**: 需要容器虚拟机混合管理,且注重存储高可用性和自动化运维的场景。 - **优势**: - 完全基于 Kubernetes 原生 API 扩展; - 提供 GUI 管理界面,降低操作复杂度; - 内置 Rancher 生态工具链(如监控、日志)。 --- #### 2. **Firecracker + Ignite** - **技术原理**: - **Firecracker**:由 AWS 开发的轻量级虚拟化引擎,专注于安全性和启动速度,常用于无服务器场景(如 AWS Lambda)。 - **Ignite**:基于 Firecracker 的 Kubernetes 工具,将 VM 封装为容器镜像,通过 OCI 标准管理,每个 VM 对应一个 Pod[^2]。 - **适用场景**: 高密度、短生命周期的轻量级 VM 管理(如函数计算、测试环境)。 - **优势**: - 极低的资源开销(内存 < 5MB/VM); - 秒级启动速度; - 天然兼容容器网络(CNI)和存储(CSI)。 --- #### 3. **Kata Containers** - **技术原理**: Kata Containers 是一种容器运行时,通过轻量级 VM 提供强隔离性,每个容器运行在独立的微型虚拟机中,兼容 Kubernetes CRI(Container Runtime Interface)[^3]。 - **适用场景**: 需要容器级别的敏捷性但要求虚拟机级别安全隔离的场景(如多租户 SaaS)。 - **优势**: - 无缝集成 Kubernetes,无需额外管理 VM 生命周期; - 兼容标准容器工具链(如 Docker、Containerd)。 --- #### 4. **OpenStack Nova on Kubernetes** - **集成方式**: 将 OpenStack Nova 组件部署在 Kubernetes 集群中,通过 Nova 调度 VM 并利用 Kuryr 实现 Neutron 网络 CNI 的桥接。 - **适用场景**: 已有 OpenStack 生态且需向 Kubernetes 迁移的混合云环境。 - **挑战**: - 架构复杂,运维成本高; - 依赖 OpenStack Kubernetes 的深度整合。 --- #### 5. **Virtink(新兴方案)** - **特点**: Virtink 是一个新兴的 Kubernetes 原生虚拟机管理项目,通过自定义资源(CRD)定义 VM,使用 libvirt 或 Cloud Hypervisor 作为后端,设计更简洁[^4]。 - **适用场景**: 寻求轻量化替代 KubeVirt 的实验性场景。 - **优势**: - 代码库精简,依赖较少; - 支持多虚拟化后端切换。 --- ### 方案对比选型建议 | 方案 | 集成复杂度 | 隔离性 | 性能开销 | 适用场景 | |-----------------|------------|---------|----------|---------------------------| | Harvester | 低 | 高 | 中 | 混合云、存储敏感型 | | Firecracker | 中 | 高 | 低 | 无服务器、高密度部署 | | Kata Containers | 低 | 中高 | 中 | 安全隔离容器 | | Nova on K8s | 高 | 高 | 高 | OpenStack 迁移过渡 | | Virtink | 中 | 高 | 中 | 实验性替代 KubeVirt | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值