Kubernetes组件核心 - client-go

Prepare Introduction 从2016年8月起,Kubernetes官方提取了与Kubernetes相关的核心源代码,形成了一个独立的项目,即client-go,作为官方提供的go客户端。Kubernetes的部分代码也是基于这个项目的。 client-go 是kubernetes中广义的客户端基础库,在Kubernetes各个组件中或多或少都有使用其功能。。也就是说,client-go可以在kubernetes集群中添加、删除和查询资源对象(包括deployment、service、pod、ns等)。 在了解client-go前,还需要掌握一些概念 在客户端验证 API 使用证书和使用令牌,来验证客户端 kubernetes集群的访问模式 使用证书和令牌来验证客户端 在访问apiserver时,会对访问者进行鉴权,因为是https请求,在请求时是需要ca的,也可以使用 -k 使用insecure模式 text 1 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 $ curl --cacert /etc/kubernetes/pki/ca.crt https://10.0.0.4:6443/version \{ "major": "1", "minor": "18+", "gitVersion": "v1.18.20-dirty", "gitCommit": "1f3e19b7beb1cc0110255668c4238ed63dadb7ad", "gitTreeState": "dirty", "buildDate": "2022-05-17T12:45:14Z", "goVersion": "go1.16.15", "compiler": "gc", "platform": "linux/amd64" } $ curl -k https://10....

 ·  · 

如何通过源码编译Kubernetes

本地构建 选择要构建的版本 text 1 git checkout tags/v1.19.5 将依赖包复制到对应路径下 text 1 cp staging/src/k8s.io vendor/ 调整makefile 在windows上编译的克隆下可能文件编码变了,需要手动修改下文件编码。比如说出现 \r not found 类似关键词时 这里转换编码使用了 dos2unix,需要提前安装下 text 1 apt install dos2unix 转换原因是因为对于bash 脚本执行识别不了windows的换行 text 1 find . -name '*.sh' -exec dos2unix {} \; 然后将 build/root/ 的文件复制到项目根目录 text 1 cp build/root/Makefile* ./ 编译 查看帮助 make help 编译 make all WHAT=cmd/kube-apiserver GOFLAGS=-v WHAT=cmd/kube-apiserver 为仅编译单一组件,all 为所有的组件 还可以增加其他的一些环境变量 KUBE_BUILD_PLATFORMS= 如编译的平台 更多的可以 make help 查看帮助 编译中问题 Makefile:93: recipe for target ‘all’ failed...

 ·  · 

深入理解kubernetes API

APIServer 在kubernetes架构概念层面上,Kubernetes由一些具有不同角色的服务节点组成。而master的控制平面由 Apiserver Controller-manager 和 Scheduler 组成。 Apiserver 从概念上理解可以分为 api 和 object 的集合,api 可以理解为,处理读写请求来修改相应 object 的组件;而 object 可以表示为 kubernetes 对象,如 Pod, Deployment 等 。 基于声明式的API 在命令式 API 中,会直接发送要执行的命令,例如:运行、停止 等命令。在声明式API 中,将声明希望系统执行的操作,系统将不断将自身状态朝希望状态改变。 为什么使用声明式 在分布式系统中,任何组件随时都可能发生故障,当组件故障恢复时,需要明白自己需要做什么。在使用命令式时,出现故障的组件可能在异常时错过调用,并且在恢复时需要其他外部组件进行干预。而声明式仅需要在恢复时确定当前状态以确定他需要做什么。 External APIs 在kubernetes中,控制平面是透明的,及没有internal APIs。这就意味着Kubernetes组件间使用相同的API交互。这里通过一个例子来说明外部APIs与声明式的关系。 例如,创建一个Pod对象,Scheduler 会监听 API来完成创建,创建完成后,调度程序不会命令被分配节点启动Pod。而在kubelet端,发现pod具有与自己相同的一些信息时,会监听pod状态。如改变kubelet则修改状态,如果删除掉Pod(对象资源不存在与API中),那么kubelet则将终止他。 为什么不使用Internal API 使用External API可以使kubernetes组件都使用相同的API,使得kubernetes具有可扩展性和可组合性。对于kubernetes中任何默认组件,如不足满足需求时,都可以更换为使用相同API的组件。 另外,外部API还可轻松的使用公共API来扩展kubernetes的功能 API资源 从广义上讲,kubernetes对象可以用任何数据结构来表示,如:资源实例、配置(审计策略)或持久化实体(Pod);在使用中,常见到的就是对应YAML的资源清单。转换出来就是RESTful地址,那么应该怎么理解这个呢?即,对资源的动作(操作)如图所示。但如果需要了解Kubernetes API需要掌握一些概念才可继续。 Group 出于对kubernetes扩展性的原因,将资源类型分为了API组进行独立管理,可以通过 kubectl api-resources查看。在代码部分为 vendor/k8s.io/api 也可以通过 kubectl xxx -v 6 来查看 kubectl 命令进行了那些API调用 text 1 2 3 4 5 6 7 8 9 10 11 $ kubectl get pods -v 6 I0513 21:54:33....

 ·  · 

理解kubernetes listwatch机制原理

overview kubernetes的设计里面大致上分为3部分: API驱动型的特点 (API-driven) 控制循环(control loops)与 条件触发 (Level Trigger) API的可延伸性 而正因为这些设计特性,才使得kubernetes工作非常稳定。 什么是Level Trigger与 Edge trigger 看到网上有资料是这么解释两个属于的: 条件触发(level-trigger,也被称为水平触发)LT指: 只要满足条件,就触发一个事件(只要有数据没有被获取,就不断通知)。 边缘触发(edge-trigger)ET: 每当状态变化时,触发一个事件。 通过查询了一些资料,实际上也不明白这些究竟属于哪门科学中的理论,但是具体解释起来看的很明白。 LEVEL TRIGGERING:当电流有两个级别,VH 和 VL。代表了两个触发事件的级别。如果将VH 设置为LED在正时钟。当电压为VH时,LED可以在该时间线任何时刻点亮。这称为LEVEL TRIGGERING,每当遇到VH 时间线就会触发事件。事件是在时间内的任何时刻开始,直到满足条件。 Edge TRIGGERING: 如图所示,会看到上升线与下降线,当事件在上升/下降边缘触发时(两个状态的交点),称为边缘触发(Edge TRIGGERING:)。 如果需要打开LED灯,则当时钟从VL转换到VH时才会亮起,而不是一家处在对应的时钟线上,仅仅是在过渡时亮起。 为什么kubernetes使用Level Trigger而不使用Edge trigger 如图所述,两种不同的设计模式,随着时间形状进行相应,当系统在由高转低,或由低转高时,系统处在关闭或者不可控的异常状态下,应如何触发对应的事件呢。 换一种方式来来解释,比如说通过 加法运算,如下,i=3,当给I+4作为一个操作触发事件。 text 1 2 3 4 5 # let i=3 # let i+=4 # let i # echo $i 7 当为Edge trigger时操作的情况下,将看到 i+4 ,而在 level trigger 时看到的是 i=7。这里将会从``i+4` 一直到下一个信号的触发。 信号的干扰 通常情况下,两者是没有区别的,但在大规模分布式网络环境中,有很多因素的影响下,任何都是不可靠的,在这种情况下会改变了我们对事件信号的感知。 如图所示,图为Level Trigger与Edge trigger 的信号发生模拟,在理想情况下,两者间并没有什么不同。...

 ·  · 

理解kubernetes schema

什么是schema schema一词起源于希腊语中的form或figure,但具体应该如何定义schema取决于应用环境的上下文。schema有不同的类型,其含义与数据科学、教育、营销和SEO以及心理学等领域密切相关。 在维基百科中将schema解释为,图式,在心里学中主要描述一种思维或行为类型,用来组织资讯的类别,以及资讯之间的关系。它也可以被描述为先入为主思想的心理结构,表示世界某些观点的框架,或是用于组织和感知新资讯的系统。 但在计算机科学中,从很多地方都可以看到 schema 这个名词,例如 database,openldap,programing language等的。这里可以简单的吧schema 理解为 元数据集合 (metadata component)数据模型,主要包含元素及属性的声明,与其他数据结构组成。 数据库中的schema 在数据库中,schema 就像一个骨架结构,代表整个数据库的逻辑视图。它设计了应用于特定数据库中数据的所有约束。当在数据建模时,就会产生一个schema。在谈到关系数据库]和面向对象数据库时经常使用schema。有时也指将结构或文本的描述。 数据库中schema描述数据的形状以及它与其他模型、表和库之间的关系。在这种情况下,数据库条目是schema的一个实例,包含schema中描述的所有属性。 数据库schema通常分为两类:定义数据文件实际存储方式的**物理数据库schema ;和逻辑数据库schema **,它描述了应用于存储数据的所有逻辑约束,包括完整性、表和视图。常见包括 星型模式(star schema) 雪花模式(snowflake schema) 事实星座模型(fact constellation schema 或 galaxy schema) 星型模式是类似于一个简单的数据仓库图,包括一对多的事实表和维度表。它使用非规范化数据。 雪花模式是更为复杂的一种流行的数据库模式,在该模式下,维度表是规范化的,可以节省存储空间并最大限度地减少数据冗余。 事实星座模式远比星型模式和雪花模式复杂得多。它拥有多个共享多个维度表的事实表。 Kubernetes中的schema 通过上面的阐述,大概上可以明白 schema究竟是什么东西了,在Kubernetes中也有schema的概念,通过对kubernetes中资源(GVK)的规范定义、相互关系间的映射等,schema即k8s资源对象元数据。 而kubernetes中资源对象即 Group Version Kind 这些被定义在 staging/src/k8s.io/api/type.go中,即平时所操作的yaml文件,例如 yaml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 apiVersion: apps/v1 kind: Deployment metadata: name: ngx namespace: default spec: selector: matchLabels: app: ngx template: metadata: labels: app: nginx spec: containers: - name: ngx-schema image: nginx ports: - containerPort: 80 而对应的的即为TypeMeta 、ObjectMeta 和 DeploymentSpec,...

 ·  ·