在 Cilium CNI 集群上运行 vCluster 虚拟集群

上周在 KubeCon China 2024 大会上,我和社区伙伴们作为志愿者在 Cilium 项目展台与用户交流。有位用户询问 Cilium 是否能与 vCluster 集成,当时未能给出明确答复,特地回来后进行了测试。

答案是:在最新的 vCluster v0.20 中容器网络没有问题,但如果要在虚拟集群上使用 Cilium 的网络策略,则会受到限制。

背景

什么是虚拟集群

虚拟集群是一种在现有 Kubernetes 集群(Host 集群)之上创建的轻量级 Kubernetes 集群。它提供了一个独立的 Kubernetes 环境,但实际上是通过共享 Host 集群的资源来实现的。这种方式允许多个虚拟集群运行在同一个物理集群中,为不同的团队或项目提供隔离的开发、测试和生产环境,而不需要为每个环境创建单独的物理集群。

为什么要使用虚拟集群

  • 多租户隔离:在一个物理集群中为不同团队或项目提供独立的 Kubernetes 环境,确保资源和安全性隔离。
  • 开发与测试便利:开发人员可以快速创建和销毁与生产环境类似的虚拟集群,用于独立开发、测试和调试。
  • 资源优化:通过共享基础设施提高资源利用率,减少硬件需求和管理开销。
  • 灵活管理:虚拟集群允许独立配置、运行不同版本的 Kubernetes,有助于版本控制和灵活调整集群策略。
  • 成本降低:减少维护多个物理集群的需求,优化资源分配,降低整体成本。

vCluster 简介

vCluster 是一种轻量级的虚拟集群解决方案,允许你在 Kubernetes 集群中创建和管理虚拟的 Kubernetes 集群。它是由 Loft Labs 开发的,用于多租户环境、开发测试环境以及简化复杂的 Kubernetes 集群管理。

关于 vCluster 的更多信息,后面我会再写一篇深入介绍下。

Cilium CNI 简介

Cilium 是一个基于 eBPF(extended Berkeley Packet Filter)技术的容器网络接口(CNI)插件,旨在为 Kubernetes 和其他容器平台提供高效、安全的网络和负载均衡功能。Cilium 的核心目标是通过使用 eBPF 实现更高性能、更灵活的网络数据处理,并简化网络安全策略的管理。在之前的文章 Kubernetes 网络学习之 Cilium 与 eBPF 和 深入探索 Cilium 的工作机制 中曾介绍过

接下来我们看下如何在 Cilium CNI 集群上运行 vCluster 虚拟集群。

环境搭建

准备 Host 集群

准备 Kubernetes 集群,使用 v1.28.13+k3s1 版本的 K3s 作为 Host 集群,禁用 flannel。

export INSTALL_K3S_VERSION=v1.28.13+k3s1
curl -sfL https://get.k3s.io | sh -s - --disable traefik --disable metrics-server --flannel-backend=none --cluster-cidr=10.42.0.0/16 --disable-network-policy --write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config

集群安装后,查看 Pod 状态。Pending 状态是因为没有 CNI 插件。

kubectl get po -A
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   coredns-6799fbcd5-h8cfh                   0/1     Pending   0          41s
kube-system   local-path-provisioner-5ccc7458d5-scfq4   0/1     Pending   0          41s

安装 Cilium CNI

安装 Cilium。

curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-amd64.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
rm cilium-linux-amd64.tar.gz{,.sha256sum}

目前最新的 stable 版本未 v1.16.1

cilium version
cilium-cli:  compiled with go1.23.0 on linux/amd64
cilium image (default): v1.16.0
cilium image (stable): v1.16.1
cilium image (running): unknown. Unable to obtain cilium version. Reason: release: not found

安装 Cilium 到集群:

cilium install

等待 Cilium 安装完成。

cilium status --wait/¯¯\/¯¯\__/¯¯\    Cilium:             2 warnings/¯¯\/¯¯\__/¯¯\    Cilium:             OK\__/¯¯\__/    Operator:           OK/¯¯\__/¯¯\    Envoy DaemonSet:    OK\__/¯¯\__/    Hubble Relay:       disabled\__/       ClusterMesh:        disabledDaemonSet              cilium             Desired: 1, Ready: 1/1, Available: 1/1
Deployment             cilium-operator    Desired: 1, Ready: 1/1, Available: 1/1
DaemonSet              cilium-envoy       Desired: 1, Ready: 1/1, Available: 1/1
Containers:            cilium             Running: 1cilium-envoy       Running: 1cilium-operator    Running: 1
Cluster Pods:          2/2 managed by Cilium
Helm chart version:
Image versions         cilium-operator    quay.io/cilium/operator-generic:v1.16.0@sha256:d6621c11c4e4943bf2998af7febe05be5ed6fdcf812b27ad4388f47022190316: 1cilium             quay.io/cilium/cilium:v1.16.0@sha256:46ffa4ef3cf6d8885dcc4af5963b0683f7d59daa90d49ed9fb68d3b1627fe058: 1cilium-envoy       quay.io/cilium/cilium-envoy:v1.29.7-39a2a56bbd5b3a591f69dbca51d3e30ef97e0e51@sha256:bd5ff8c66716080028f414ec1cb4f7dc66f40d2fb5a009fff187f4a9b90b566b: 1

待 Cilium 安装完成后,所有的 Pod 都正常运行。

kubectl get po -A
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   cilium-envoy-t2vbd                        1/1     Running   0          75s
kube-system   cilium-gfk5r                              1/1     Running   0          75s
kube-system   cilium-operator-885db8fcf-kp2dr           1/1     Running   0          75s
kube-system   coredns-6799fbcd5-4xmcd                   1/1     Running   0          94s
kube-system   local-path-provisioner-5ccc7458d5-scfq4   1/1     Running   0          94s

安装 vCluster

这里使用 vCluster CLI 来管理虚拟集群,首先安装 vCluster CLI。

curl -L -o vCluster "https://github.com/loft-sh/vCluster/releases/latest/download/vCluster-linux-amd64" && sudo install -c -m 0755 vCluster /usr/local/bin && rm -f vCluster

最新的版本为 vCluster

vCluster version
vCluster version 0.20.0

查看 Host 集群的命名空间。

kubectl get ns
NAME              STATUS   AGE
default           Active   2m8s
kube-node-lease   Active   2m8s
kube-public       Active   2m8s
kube-system       Active   2m8s

虚拟集群

创建虚拟集群

使用 vCluster create NAME 创建名为 vc-a 的虚拟集群。

vCluster create vc-a
07:02:38 info Creating namespace vCluster-vc-a
07:02:38 info Create vCluster vc-a...
07:02:38 info execute command: helm upgrade vc-a /tmp/vCluster-0.20.0.tgz-759956343 --create-namespace --kubeconfig /tmp/1343191442 --namespace vCluster-vc-a --install --repository-config='' --values /tmp/3416084562
07:02:39 done Successfully created virtual cluster vc-a in namespace vCluster-vc-a
07:02:44 info Waiting for vCluster to come up...
07:02:55 warn vCluster is waiting, because vCluster pod vc-a-0 has status: Init:2/3
07:03:15 done vCluster is up and running
07:03:15 done Switched active kube context to vCluster_vc-a_vCluster-vc-a_default
- Use `vCluster disconnect` to return to your previous kube context
- Use `kubectl get namespaces` to access the vCluster

vCluster 会在 Host 集群上为虚拟集群创建一个独立的命名空间,比如这里的 vCluster-vc-a 就是虚拟集群 vc-a 在 Host 集群上的命名空间。

kubectl get ns
NAME              STATUS   AGE
default           Active   7m51s
kube-node-lease   Active   7m51s
kube-public       Active   7m51s
kube-system       Active   7m51s
vCluster-vc-a     Active   2m8s

在该命名空间下,有 vCluster 的控制面和 coredns。默认情况下,vCluster 的组件都是 StatefulSet 单实例运行。这种单实例架构适合开发环境或者 CI/CD 环境,但生产环境建议使用 高可用方案 部署。

kubectl get po -n vCluster-vc-a
NAME                                            READY   STATUS    RESTARTS   AGE
coredns-5c7466bb88-zgqqk-x-kube-system-x-vc-a   1/1     Running   0          2m19s
vc-a-0                                          1/1     Running   0          2m49s

这里 vc-a-0 就是虚拟集群 vc-a 的控制面实例,在这个实例中包含了:

  • Kubernetes API server:Kubernetes API 服务器,它是虚拟集群内所有 API 请求的管理接口。
  • controller manager:控制器管理器,用于维护 pod 等 Kubernetes 资源的状态,确保它们匹配所需的配置。
  • data store:数据存储,是 API 存储所有资源的数据存储。默认使用内置的 SQLite,通过 PVC 做持久化存储。
  • syncer:同步器,用于同步虚拟集群和主机集群之间的资源,并完成主机基础设施上的工作负载管理。
  • scheduler:调度程序,它是调度工作负载的可选组件。默认情况下,vCluster 重用主机集群调度程序以节省计算资源。如果需要添加节点标签或污点来控制调度、排出节点或利用自定义调度程序,可以启用虚拟调度程序。

使用同样的方式,我们再创建一个虚拟集群 vc-b

vCluster create vc-b

查看已有的虚拟集群。

vCluster listNAME |   NAMESPACE   | STATUS  | VERSION | CONNECTED |  AGE-------+---------------+---------+---------+-----------+---------vc-a | vCluster-vc-a | Running | 0.20.0  |           | 41m34svc-b | vCluster-vc-b | Running | 0.20.0  |           | 16m36s

虚拟集群的 KubeConfig

虚拟集群的 KubeConfig 保存在对应的 Host 集群的命名空间中,比如虚拟集群 vc-a 的 kubeconfig 保存在 Host 集群的命名空间 vCluster-vc-a 下的 Secret vc-vc-a 中。

kubectl get secret -n vCluster-vc-a
NAME                         TYPE                 DATA   AGE
sh.helm.release.v1.vc-a.v1   helm.sh/release.v1   1      46m
vc-a-certs                   Opaque               25     46m
vc-config-vc-a               Opaque               1      46m
vc-vc-a                      Opaque               4      45m

通过下面的命令可以查看 kubeconfig 的内容。

kubectl get secret -n vCluster-vc-a vc-vc-a -o jsonpath='{.data.config}' | base64 -d

连接到虚拟集群

要连接到虚拟集群不需要直接使用 kubeconfig,vCluster CLI 提供了命令可以快捷地连接到虚拟集群。

07:51:42 done vCluster is up and running
07:51:42 done Switched active kube context to vCluster_vc-a_vCluster-vc-a_default
- Use `vCluster disconnect` to return to your previous kube context
- Use `kubectl get namespaces` to access the vCluster

连接成功后,就可以操作虚拟集群了。

kubectl get po -A
NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE
kube-system   coredns-5c7466bb88-zgqqk   1/1     Running   0          48m

通过命令 vCluster disconnect 可以断开连接,切换到 Host 集群。

测试

部署实例应用

在虚拟集群 vc-a 上部署应用 deathstartiefighterxwing

cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: Service
metadata:name: deathstarlabels:app.kubernetes.io/name: deathstar
spec:type: ClusterIPports:- port: 80selector:org: empireclass: deathstar
---
apiVersion: apps/v1
kind: Deployment
metadata:name: deathstarlabels:app.kubernetes.io/name: deathstar
spec:replicas: 2selector:matchLabels:org: empireclass: deathstartemplate:metadata:labels:org: empireclass: deathstarapp.kubernetes.io/name: deathstarspec:containers:- name: deathstarimage: docker.io/cilium/starwars
---
apiVersion: v1
kind: Pod
metadata:name: tiefighterlabels:org: empireclass: tiefighterapp.kubernetes.io/name: tiefighter
spec:containers:- name: spaceshipimage: docker.io/tgraf/netperf
---
apiVersion: v1
kind: Pod
metadata:name: xwinglabels:app.kubernetes.io/name: xwingorg: allianceclass: xwing
spec:containers:- name: spaceshipimage: docker.io/tgraf/netperf
EOF

待应用启动后测试服务调用。

kubectl exec tiefighter -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing
kubectl exec xwing -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing

如果显示下面的结果,访问正常,说明容器网络没有问题。

Ship landed
Ship landed

总结

vCluster 在使用 Cilium CNI 的 Host 集群上容器网络是没有问题的,可以说 vCluster 使用的还是 Host 集群的容器网络,不受 CNI 实现的影响。

但如果要在虚拟集群上使用 Cilium 的网络策略,则会受到限制。

这是因为 Syncer 是 vCluster 架构中的一个关键组件,负责在虚拟集群和 Host 集群之间同步 Kubernetes 资源。它使得 vCluster 能够在宿主集群上运行,同时保持与虚拟集群的 Kubernetes API Server 一致。

简单说 Syncer 在 Host 集群和虚拟集群间完成资源的“转译”,实现资源的同步,但仅限于 Kubernetes 的原生资源(如 Pods、Services、ConfigMaps 等)。

在 vCluster v0.14 - 0.19 中,可以通过扩展 vcluster-generic-crd-sync-plugin 完成特定 CRD 的同步,但这个仓库已经一年多未更新。

关注"云原生指北"微信公众号 (转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

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

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

相关文章

【Python篇】Python 类和对象:详细讲解(上篇)

文章目录 Python 类和对象&#xff1a;详细讲解1. 什么是类&#xff08;Class&#xff09;类的定义 2. 什么是对象&#xff08;Object&#xff09;创建对象 3. 属性和方法属性&#xff08;Attributes&#xff09;方法&#xff08;Methods&#xff09;在类中定义属性和方法使用对…

重生奇迹MU 小清新职业智弓MM

游戏中有一种令人迷醉的职业——智弓MM&#xff0c;她们以高超的射箭技能闻名于世。本文将为您介绍这个悠闲的小清新职业&#xff0c;在游戏中的特点以及如何成为一名出色的智弓MM。跟随我们一起探索这个奇妙而神秘的职业吧&#xff01; 悠闲的游戏节奏是游戏的初衷之一&#…

52 mysql 启动过程中常见的相关报错信息

前言 我们这里主要是看一下 service mysql start, service mysql stop 的过程中的一些常见的错误问题 这些 也是之前经常碰到, 但是 每次都是 去搜索, 尝试 1, 2, 3, 4 去解决问题 但是 从来未曾思考过 这个问题到底是 怎么造成的 The server quit without updating PID fil…

【设计模式】创建型模式——抽象工厂模式

抽象工厂模式 1. 模式定义2. 模式结构3. 实现3.1 实现抽象产品接口3.2 定义具体产品3.3 定义抽象工厂接口3.4 定义具体工厂3.5 客户端代码 4. 模式分析4.1 抽象工厂模式退化为工厂方法模式4.2 工厂方法模式退化为简单工厂模式 5. 模式特点5.1 优点5.2 缺点 6. 适用场景6.1 需要…

用3点结构的s1顺序标定2点结构的s2顺序

在行列可自由变换的条件下&#xff0c;3点结构有6个 (A,B)---6*30*2---(0,1)(1,0) 让A分别是3a1&#xff0c;2&#xff0c;…&#xff0c;6&#xff0c;让B全是0。当收敛误差为7e-4&#xff0c;收敛199次取迭代次数平均值&#xff0c;得到 迭代 搜索难度 1 13913.2 1 2 …

客服系统简易版

整体架构解读 客服端和商城端都通过websocket连接到客服系统, 并定期维持心跳当客户接入客服系统时, 先根据策略选择在线客服, 然后再发送消息给客服 websocket实现 用netty实现websocket协议, 增加心跳处理的handler, 详见chat-server模块 客服路由规则 暂时仅支持轮询的…

视频结构化从入门到精通——视频结构化主要技术介绍

视频结构化主要技术 1 视频接入 “视频接入”是视频结构化管道的起点&#xff08;SRC Point&#xff09;视频接入是视频结构化处理的第一步&#xff0c;它涉及将视频数据从各种采集源获取到系统中进行进一步处理。视频接入的质量和稳定性对后续的数据处理、分析和应用至关重要…

【openwrt-21.02】T750 openwrt-21.02 Linux-5.4.238 input子系统----gpio-keys实现分析

input子系统 输入子系统是由设备驱动层(input driver)、输入核心层(input core)、输入事件处理层(input event handle)组成 input子系统架构图 gpio-keys gpio-keys是基于input子系统实现的一个通用按键驱动,该驱动也符合linux驱动实现模型,即driver和device分离模型.一…

毕设创新点之一:基于GD32/STM32的AI模型部署-github库

将AI模型成功部署到边缘MCU中&#xff0c;常常受限于MCU的计算峰值和内存峰值的限制&#xff0c;部署较为困难&#xff0c;目前有一个将AI算法MCU部署到GD32系列MCU中的宝藏的开源库。 项目网址&#xff1a;HomiKetalys/gd32ai-modelzoo: Provide deployable deep learning mo…

Vue.js 模板语法详解:插值表达式与指令使用指南

Vue.js 模板语法详解&#xff1a;插值表达式与指令使用指南 引言 简要介绍主题&#xff1a; Vue.js 是一个现代化的 JavaScript 框架&#xff0c;用于构建用户界面。Vue 的模板语法提供了直观且功能强大的工具&#xff0c;用于将数据与 DOM 绑定。本文将深入探讨 Vue.js 的两个…

Training language models to follow instructionswith human feedback

Abstract 将语言模型做得更大并不会自动提高它们遵循用户意图的能力。例如&#xff0c;大型语言模型可能会生成不真实、有毒或对用户不有帮助的输出。换句话说&#xff0c;这些模型并未与用户对齐&#xff08;aligned&#xff09;。本文展示了一种通过人类反馈来对齐语言模型与…

2024实战指南:四款全免费的数据恢复工具盘点!

在这个数字化的时代里&#xff0c;数据的安全至关重要。如果一不小心删除或丢失了重要数据应该怎么办呢&#xff1f;这几个全免费的数据恢复工具可以帮你解决问题&#xff0c;亲测好用哦&#xff01; 第一款&#xff1a;福昕数据恢复 直达链接&#xff1a;www.pdf365.cn/foxi…

【并发编程】从AQS机制到同步工具类

AQS机制 Java 中常用的锁主要有两类&#xff0c;一种是 Synchronized 修饰的锁&#xff0c;被称为 Java 内置锁或监视器锁。另一种就是在 JUC 包中的各类同步器&#xff0c;包括 ReentrantLock&#xff08;可重入锁&#xff09;、Semaphore&#xff08;信号量&#xff09;、Co…

Android13 Launcher3 客制化Workspace页面指示器

需求&#xff1a;原生态的workspace页面指示器是个长条&#xff0c;不大好看&#xff0c;需要进行客制化 实现效果如图&#xff1a; 实现原理&#xff1a; 代码实现在WorkspacePageIndicator.java 布局在launcher.xml里 实现在WorkspacePageIndicator.java通过重写onDraw函数…

顺序循环队列

顺序循环队列 队头插入元素&#xff0c;队尾删除元素 本来应该判空和判断是否存满的条件都是&#xff1a;队头 队尾&#xff0c;但这样就没办法区分了&#xff0c;所以&#xff0c;就牺牲一个空间&#xff08;比如长度为10&#xff0c;但只能存9个&#xff09;&#xff0c;这…

auto的使用场景

auto的两面性 合理使用auto 不仅可以减少代码量, 也会大大提高代码的可读性. 但是事情总有它的两面性 如果滥用auto, 则会让代码失去可读性 推荐写法 这里推荐两种情况下使用auto 一眼就能看出声明变量的初始化类型的时候 比如迭代器的循环, 用例如下 #include <iostre…

利用autoDecoder工具在数据包加密+签名验证站点流畅测试

站点是个靶场 https://github.com/0ctDay/encrypt-decrypt-vuls 演示地址http://39.98.108.20:8085/ 不是仅登录位置暴力破解的那种场景&#xff0c;使用autoDecoder&#xff08;https://github.com/f0ng/autoDecoder&#xff09;的好处就是每个请求自动加解密&#xff0c;测…

关于ThinkPHP 5 框架开启自动搜索控制器 无法访问的问题坑

假如当前有一个登陆接口功能 因为后续会有不同版本的 登陆接口 这时候 我们可以在控制器中 新建文件夹 做区分 方便管理即 新建了一个 api 模块 文件路径是 api/controller/V1/Login 正常情况下 controller 目录下 是 控制器文件 login.php 文件&#xff0c;由于我们有多个…

Qt text-align和padding属性

1. text-align属性是用来设置文本的水平对齐方式。 text-align: center 文本将居中显示text-align: left 文本将左对齐显示text-align: right 文本将右对齐显示 2. 内边距padding: 内边距是元素内容与其边框之间的空间 padding-left: 10px; 距离内左边距10个像素点padding-r…

时序预测 | 基于WTC+transformer时间序列组合预测模型(pytorch)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 WTCtransformer时间序列组合预测模型 WTC,transformer 创新点&#xff0c;超级新。先发先得&#xff0c;高精度代码。 预测主模型transformer也可以改其他WTC-former系列&#xff0c;比如WTC-informer/autoformer等等…