使用 ClusterResourceSet 为 Cluster API 集群自动安装 CNI 插件

news2024/12/26 22:44:17

1 什么是 Cluster API

Cluster API[1] 是一个 Kubernetes 子项目,它将声明式、Kubernetes 风格的 API 引入到集群的创建、配置和管理中。Cluster API 支持在 AWS, Azure, GCP, vSphere, KubeVirt 等多种环境中创建和管理 Kuberenetes 集群,并负责提供部署集群所需的基础设施(例如 VPC, 虚拟机, 负载均衡等等)。此外 Cluster API 也支持在本地以 Kind(Kubernetes in Docker) 的方式快速创建用于测试的集群。

在 Cluster API 中主要有两种集群:

  • 管理集群(Management cluster): 在集群中部署 Cluster API 相关的管理组件。
  • 工作负载集群(Workload cluster):通过 Cluster API 创建出来的集群。

2 ClusterResourceSet 有什么用

Cluster API 创建的集群仅包含最基本的功能。例如,它们没有 Pod 到 Pod 网络所需的容器网络接口 (CNI),也没有动态持久卷配置所需的 StorageClass。当前用户必须手动将这些组件安装到他们创建的每一个集群中。

因此,Cluster API 引入了 ClusterResourceSet CRD,ClusterResourceSet Controller 会自动将用户在 ClusterResourceSet 中定义的一组资源配置应用到相应的集群中(通过 label selectors 根据标签选择集群),使得 Cluster API 创建的集群从一开始就为工作负载做好准备,而无需额外的用户干预。

在本文中,我们将会通过 ClusterResourceSet 来自动为工作负载集群安装 Cilium CNI 插件,所有使用到的资源文件可以在下面的 Github 链接中获取。

https://github.com/cr7258/hands-on-lab/tree/main/cluster-api/clusterresourceset

3 前提准备

  • kind[2] 可以用来在本地运行和测试 Kubernetes 集群,它使用 Docker 容器来作为 Kubernetes 的节点。
  • kubectl[3]是用于管理 Kubernetes 的命令行工具。
  • clusterctl[4]是用于管理 Cluster API 集群的生命周期的命令行工具。

4 创建管理集群

首先,我们通过 Kind 创建一个管理集群。Kind 的配置文件如下,在本文中我们将使用 Cluster API 的 Docker Provider 来创建工作负载集群,因此我们要让 Kind 集群能够访问到主机上的 Docker 进程。

apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
name: manage-cluster
nodes:
- role: control-plane
  extraMounts:
    - hostPath: /var/run/docker.sock
      containerPath: /var/run/docker.sock

使用上述文件创建管理集群。

kind create cluster --config kind.yaml

5 安装 Cluster API 组件

使用 clusterctl init 命令在管理集群中安装 Cluster API 组件。使用 --infrastructure 参数指定使用 Docker 作为基础设施的 Provider。

export EXP_CLUSTER_RESOURCE_SET=true
export CLUSTER_TOPOLOGY=true
clusterctl init --infrastructure docker

6 创建安装 Cilium 使用的 Configmap

要使用 ClusterResourceSet 来安装资源,我们需要提供资源所需的 YAML 文件。Cilium 支持使用 Helm 的方式来安装,使用 helm template 命令在本地渲染出 YAML 资源文件。你可以根据需要在 helm template 命令中通过 --set <key>=<value> 指定其他选项或者值,以适应特定的环境或要求。

helm repo add cilium https://helm.cilium.io
helm repo update
helm template cilium cilium/cilium --version 1.12.5 \
--namespace kube-system > cilium-1.12.5.yaml

根据 Cilium 资源文件创建 ClusterResourceSet 需要的 ConfigMap。

kubectl create configmap cilium-crs-cm --from-file=cilium-1.12.5.yaml

7 创建 ClusterResourceSet

创建 ClusterResourceSet 引用上一步创建的包含 Cilium 安装资源的 ConfigMap,使用 clusterSelector 参数指定根据 cni=cilium 的 Label 选择目标集群。

apiVersion: addons.cluster.x-k8s.io/v1alpha4
kind: ClusterResourceSet
metadata:
  name: cilium-crs
  namespace: default
spec:
  clusterSelector:
    matchLabels:
      cni: cilium 
  resources:
  - kind: ConfigMap
    name: cilium-crs-cm

8 部署工作负载集群

为了方便用户上手,Cluster API 提供了 clusterctl generate cluster 命令用于快速生成创建工作负载集群的 YAML 模板。

clusterctl generate cluster cluster-1 --flavor development \
  --kubernetes-version v1.25.3 \
  --control-plane-machine-count=3 \
  --worker-machine-count=3 \
  > cluster-1.yaml

我们这里先不去深究生成的资源文件,可以直接运行以下命令应用资源文件。

kubectl apply -f cluster-1.yaml

输出类似于:

clusterclass.cluster.x-k8s.io/quick-start created
dockerclustertemplate.infrastructure.cluster.x-k8s.io/quick-start-cluster created
kubeadmcontrolplanetemplate.controlplane.cluster.x-k8s.io/quick-start-control-plane created
dockermachinetemplate.infrastructure.cluster.x-k8s.io/quick-start-control-plane created
dockermachinetemplate.infrastructure.cluster.x-k8s.io/quick-start-default-worker-machinetemplate created
kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io/quick-start-default-worker-bootstraptemplate created
# 创建了一个集群
cluster.cluster.x-k8s.io/cluster-1 created

查看创建的工作负载集群,状态处于 Provisioned 说明已经部署完毕。

kubectl get cluster
NAME        PHASE         AGE     VERSION
cluster-1   Provisioned   9m19s   v1.25.3

获取工作负载集群 cluster-1 的 kubeconfig 文件。

kind get kubeconfig --name cluster-1 > cluster-1.kubeconfig

切换到 cluster-1 集群,可以看到当前集群还未安装 CNI 插件,因此所有 Node 处于 NotReady 状态,并且所有非 hostNetwork: true 的 Pod 都处于 Pending 状态。

export KUBECONFIG=cluster-1.kubeconfig
kubectl get pod -A
kubectl get node

接下来我们切换回管理集群,并给 cluster-1 集群打上 cni=cilium 的 Label。

export KUBECONFIG=~/.kube/config
kubectl label cluster cluster-1 cni=cilium

切换到 cluster-1 集群会发现此时已经开始部署 Cilium CNI 了,完成部署后 Node 的状态也会变为 Ready。

export KUBECONFIG=cluster-1.kubeconfig
kubectl get pod -A
kubectl get node

我们也可以使用以下资源文件创建一个新的集群,并加上 cni=cilium 的 Label。ClusterResourceSet Controller 将会在集群完成部署后,自动将 ConfigMap 中的配置应用到新集群中。

apiVersion: cluster.x-k8s.io/v1alpha4
kind: Cluster
metadata:
  name: cluster-2
  namespace: default
  labels:
    cni: cilium # 安装 Cilium
spec:
  topology:
    class: quick-start # ClusterClass 的名字
    version: v1.25.3
    workers:
      machineDeployments:
      - class: default-worker # ClusterClass 中定义的 machineDeployments
        name: my-cluster-2
        replicas: 3

9 参考资料

  • [1] Cluster API: https://cluster-api.sigs.k8s.io/introduction.html#kubernetes-cluster-apidiv-stylefloat-right-position-relative-display-inlineimg-srcimagesintroductionsvg-width160px-div
  • [2] kind: https://kind.sigs.k8s.io/docs/user/quick-start/#installation
  • [3] kubectl: https://kubernetes.io/docs/tasks/tools/
  • [4] clusterctl: https://cluster-api.sigs.k8s.io/clusterctl/overview.html#overview-of-clusterctl
  • [5] Episode 73: cluster api and flux with cilium: https://hackmd.io/@Echo-Live/073
  • [6] Installing Cilium via a ClusterResourceSet: https://blog.scottlowe.org/2021/10/07/installing-cilium-via-clusterresourceset/
  • [7] ClusterResourceSet proposal: https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20200220-cluster-resource-set.md
  • [8] Cluster API Intro and Deep Dive - Yuvaraj Balaji Rao Kakaraparthi & Vince Prignano, VMware: https://www.youtube.com/watch?v=9H8flXm_lKk
  • [9] Build Your Own Cluster API Provider the Easy Way - Anusha Hegde, VMware & Richard Case, Weaveworks: https://www.youtube.com/watch?v=HSdgmcAAXa8
  • [10] k8s 官方推荐的交付项目cluster-api使用和源码解读: https://zhuanlan.zhihu.com/p/450835027
  • [11] Cluster API - KubeAcademy: https://kube.academy/courses/cluster-api
  • [12] 一文讲透Cluster API的前世、今生与未来: https://segmentfault.com/a/1190000022650813
  • [13] How to Migrate 700 Kubernetes Clusters to Cluster API with Zero Down Time: https://www.youtube.com/watch?v=KzYV-fJ_wH0

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单例(Singleton)设计模式

一、单例(Singleton)设计模式说明 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱&#xff0c;不同的棋局&#xff0c;我们用不同的棋谱&#xff0c;"套路"所谓类…

WebView以及使用HTTP访问访问网络

文章目录使用网络技术WebView的用法使用HTTP访问网络使用HttpURLConnection使用OkHttp使用网络技术 在Android开发当中,我们应该合理的使用网络编写出更加出色的应用程序,下面学习以下如何在手机端使用HTTP和服务器进行网络交互,并对服务器返回的数据进行解析,这也是在Android…

爽啊,这么多有趣好玩强大的 Python 库

Python语言简洁、易读以及可扩展&#xff0c;在国内外用 Python 做研究的非常多。 Python 语言向来以丰富的第三方库而闻名。这么多有趣好玩且强大&#xff0c;靠一个人去寻找太难了。 最近粉丝群小伙伴们又罗列了一些&#xff0c;分享给大家。喜欢记得点个赞&#xff0c;加入…

OpenHarmony#深入浅出学习eTs#(三)UI布局

本项目Gitee仓地址&#xff1a;深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、ArkUI介绍 框架介绍 方舟开发框架&#xff08;简称&#xff1a;ArkUI&#xff09;&#xff0c;是一套UI开发框架&#xff0c;提供开发者进行应用UI开发时所必需的能力。 基本概念 组…

力扣sql入门篇(二)

力扣sql入门篇(二) 1 计算特殊奖金 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT employee_id, case when employee_id%21 AND name not like "M%" then salary else 0 end bonus FROM Employees ORDER BY employee_id;1.3 运行…

【软件测试】测试人的一份“漂亮“的年终总结报告......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 不管这一年&#xf…

举一反三-自建zabbix监控mysql

之前写过2篇zabbix监控redis的文章。 本篇针对的是mysql。除了描述如何创建mysql监控的步骤,本篇另一个目的是描述创建任意一个监控对象的基本原理,未来面对其它监控对象时,可以举一反三。 zabbix监控的最基本的部件时zabbix server和zabbix agent. zabbix server负责汇总…

c++primer 第4章 表达式

文章目录第4章 表达式4.1 基础4.1.1 基础概念4.1.2 优先级与结合律4.1.3 求值顺序4.2 算术运算符4.3 逻辑和关系运算符4.4 赋值运算符4.5 递增和递减运算符4.6 成员访问运算符4.7 条件运算符4.8 位运算符4.9 sizeof运算符4.10 逗号运算符4.11 类型转换4.11.1 算术转换4.11.2 其…

ES6-ES11笔记(1)

关于这个视频的笔记 (https://www.bilibili.com/video/BV1uK411H7on?p29&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 1.ES6 1.1let的一些注意点 let a; let b,c,d; let e 100; let f"你好",g101;// 变量名不能重复声明 // let testDepulicate 123456 // …

无信息变量消除法研究及实现(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 波长变量筛选的方法主要有相关系数法&#xff0c;逐步回归法&#xff0c;无信息变量消除法(UVE)&#xff0c;遗传算法(genetic …

python圣诞树词云

一、前言 圣诞节虽然是西方节日&#xff0c;但是个人还是比较喜欢的&#xff08;没有崇洋媚外的意思&#xff0c;中国的春节也超级棒&#xff09;&#xff0c;一个是圣诞节的氛围&#xff0c;圣诞节的圣诞老人等象征、雪花麋鹿等元素&#xff0c;都充满了浪漫的氛围。我想这也是…

Linux的文件系统编程(1)

What makes the desert beautiful is that somewhere it hides a well. 沙漠之所以美丽,是因为在它的某个角落隐藏着一口井. Linux的文件系统编程&#xff08;1&#xff09;运行过程框架标准IO和文件IO标准IO文件IO(主要学)open函数两个参数三个参数close函数read函数write函数…

Python基础语法(二)

Python基础语法&#xff08;二&#xff09; 函数 编程中的函数和数学中的函数有一定的相似之处. 数学上的函数, 比如 y sin x , x 取不同的值, y 就会得到不同的结果. 编程中的函数, 是一段 可以被重复使用的代码片段 . 代码示例: 求数列的和, 不使用函数 # 1. 求 1 - 100 …

树Tree【代码笔记】

树【Tree】 树是n&#xff08;n>0&#xff09;个结点的有限集。当n 0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 有且仅有一个特定的称为根的结点。当n>1时&#xff0c;其余节点可分为m&#xff08;m>0&#xff09;个互不相交的有限集T1,T2,……

OpenHarmony#深入浅出学习eTs#(六)编写eTs第一个控件

本项目Gitee仓地址&#xff1a;深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、控件基本属性 在使用第一个控件前&#xff0c;我们需要了解一些控件都有哪些基础属性&#xff0c;比如说我们在Super Visual中使用过的长宽和字体大小等等&#xff0c;通用属性有以下这…

Retrofit的使用

文章目录Retrofit的使用最好用的网络库: RetrofitRetrofit的基本用法处理复杂接口的地址类型Retrofit构建器的最佳写法Retrofit的使用 最好用的网络库: Retrofit Retrofit是一款由Square公司开发的网络库,但是它和OkHttp定位完全不同,OkHttp的侧重点是底层通信的实现,而Retro…

Java集合类——LinkedList(单链表及双链表)

一&#xff0c;ArrayList的缺陷 1.空间浪费 在之前的博客中&#xff0c;我利用源码详细的讲解了ArrayList这个集合类&#xff08;尤其是扩容机制&#xff09;&#xff0c;可以知道ArrayList的底层主要是一个动态的可变数组&#xff0c;容量满的时候需要进行1.5倍扩容。但是我…

第二十讲:神州路由器静态路由的配置

实验拓扑图如下所示 设备 端口 IP 子网掩码 网关 Router-A G0/0 120.83.200.55 255.255.255.0 无 G0/3 192.168.0.1 255.255.255.0 无 Router-B G0/0 120.83.200.56 255.255.255.0 无 G0/3 192.168.1.1 255.255.255.0 无 PC1 192.168.0.2 255.255.255…

jQuery 的基本使用

1、jQuery 介绍 1.1、JavaScript 库 JavaScript库&#xff1a;即 library&#xff0c;是一个封装好的特定的集合&#xff08;方法和函数&#xff09;。从封装一大堆函数的角度理解库&#xff0c;就是在这个库中&#xff0c;封装了很多预先定义好的函数在里面&#xff0c;比如动…

【C++】const关键字

【C】const关键字 0x1 常量 C定义常量有两种方式 #define 宏常量&#xff1a;#define 常量名 常量值 通常在文件上方定义&#xff0c;表示一个常量宏常量不可以修改 // 宏常量 #define MAX 999int main() {return 0; }const修饰的变量&#xff1a; const 数据类型 常量名 …