K8S的client-go与Informer机制

这篇具有很好参考价值的文章主要介绍了K8S的client-go与Informer机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

K8S的client-go与Informer机制

一、介绍

client-go是一个包含KubernetesAPI的SDK,它在整个k8s源码中发挥着不可或缺的作用。

二、KubernetesAPIs

2.1 规范

2.1.1 RESTful

REST,即Representational State Transfer的缩写。这个词组可以翻译为"表现层状态转化"。

  1. 每一个URI代表一种资源;
  2. 客户端和服务器之间,传递这种资源的某种表现层;
  3. 客户端通过五个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
    提问:注册登录场景的相关API如何用RESTful的方式设计?
2.1.2 GVK®

apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
namespace: default
spec:
replicas: 1

  • apiVersion ≈ apiGroupVersion = Group/Version
  • GVK = Group Version Kind
  • GVR = Group Version Resources

提问:Resource和Kind有什么区别?
答:Resource是一个对象,Kind是一个对象的类型名称

提问:一个标准的K8S资源的API长什么样?
K8S的client-go与Informer机制,kubernetes,golang,容器

2.2 实战调用

2.2.1 跳过鉴权

因为本次分享的API只是个引子,我们就不讲鉴权了。kubectl有个proxy的子命令可以实现在本地搭建一个具备kubectl同等权限的代理。这里我们通过这种方式跳过鉴权。
kubectl proxy --port=6443

2.2.2 几个例子
  • 获取当前版本信息
    • http://localhost:6443/version
  • 获取APIServer支持的所有APIGroup
    • http://localhost:6443/apis
  • 获取全部命名空间的Deployment列表
    • http://localhost:6443/apis/apps/v1/deployments
  • 获取命名空间default下的Deployment列表
    • http://localhost:6443/apis/apps/v1/namespaces/default/deployments
  • 获取命名空间default下的一个Deployment对象
    • http://localhost:6443/apis/apps/v1/namespaces/default/deployments/httpbin
  • 获取Pod列表
    • http://localhost:6443/api/v1/namespaces/default/pods
      提问:获取rollout列表的接口是什么样
      http://localhost:6443/apis/argoproj.io/v1alpha1/rollouts

三、client-go源码

3.1 实战调用

clientset

clientset.AppsV1().Deployments(apiv1.NamespaceDefault).Create(context.TODO(), deployment, metav1.CreateOptions{})

dynamic

deploymentRes := schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}
dynamicClient.Resource(deploymentRes).Namespace(namespace).Create(context.TODO(), deployment, metav1.CreateOptions{})

restclient

c.client.Post().
   Namespace(c.ns).
   Resource("deployments").
   VersionedParams(&opts, scheme.ParameterCodec).
   Body(deployment).
   Do(ctx).
   Into(result)

https://github.com/kubernetes/client-go/tree/master/examples

3.2 Package介绍

K8S的client-go与Informer机制,kubernetes,golang,容器

client-go源码目录结构

  • discovery:用于发现APIs的相关资源
  • kubernetes(clientset):基于rest封装的包含所有k8s内置资源的client集合
  • informers:基于clientset实现了一个资源缓存池,封装了所有资源的list和get操作
  • dynamic:基于rest实现了一个动态的client,支持所有类型的资源进行操作
  • dynamic/dynamicinformer:为dynamic实现的informer
  • tools/cache:informer的底层实现
  • tools/watch:informer的watch实现,使用它可以watch到informer的资源变化
  • transport:用作初始化一个http连接,AA也是在这里完成的

3.3 核心Package走读

3.3.1 kubernetes(clientset)

K8S的client-go与Informer机制,kubernetes,golang,容器

3.3.2 dynamic

K8S的client-go与Informer机制,kubernetes,golang,容器

3.3.3 transport

K8S的client-go与Informer机制,kubernetes,golang,容器

3.4 Informer

informer实际上是为controller服务的,所以这里我们先了解下k8s的controller的设计理念。

3.4.1 控制循环

K8S的client-go与Informer机制,kubernetes,golang,容器
控制论图解
K8S的client-go与Informer机制,kubernetes,golang,容器

Kubernetes中的控制循环
通常,控制环路如下所示:

  1. 阅读资源的状态
  2. 更改群集或群集外部世界中对象的状态
  3. 通过etcd中的API服务器更新步骤1中的资源状态
  4. 重复循环;返回步骤1。

提问:在控制循环中要求近乎实时的获取资源状态,如何实现?
K8S的client-go与Informer机制,kubernetes,golang,容器

边沿触发与电平触发
提问:事件驱动如何保证不丢数据?
K8S的client-go与Informer机制,kubernetes,golang,容器

这张图里展示了三种策略:

  1. edge-driven-only,错过了第二状态改变
  2. edge-triggered,不依赖事件的数据而是自行获取数据
  3. edge-triggered with resync,在上一个策略的基础上增加resync

3.4.2 ListWatch

list-watch,顾名思义由list和watch组成。list调用资源的list API获取所有资源,watch调用资源的watch API监听资源变更事件。
K8S的client-go与Informer机制,kubernetes,golang,容器

提问:如何实现watch?

  • 方案1:短轮训
  • 方案2:长轮训
  • 方案3:chunked

普通HTTP响应体

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 25
Mozilla Developer Network         ——> body 数据内容,大小为25字节

chunked的HTTP响应体


```bash
HTTP/1.1 206 OK
Content-Type: text/plain
Transfer-Encoding: chunked

7                            ——> 第一个chunk块,大小为7字节
Mozilla                      ——> 第一个chunk块内容
9                            ——> 第二个chunk块,大小为9字节
Developer                    ——> 第二个chunk块内容
7                            ——> 第三个chunk块,大小为7字节
Network                      ——> 第三个chunk块内容
0                            ——> 标记性终止块,大小为0字节

普通HTTP请求响应处理
K8S的client-go与Informer机制,kubernetes,golang,容器
chunked的HTTP请求处理
K8S的client-go与Informer机制,kubernetes,golang,容器
informer中的chunk
K8S的client-go与Informer机制,kubernetes,golang,容器

抓包观察watch机制

3.4.3 核心代码走读
K8S的client-go与Informer机制,kubernetes,golang,容器

Informer组件:

  • Controller
  • Reflector:通过Kubernetes Watch API监听resource下的所有事件
  • Lister:用来被调用List/Get方法
  • Processor:记录并触发回调函数
  • DeltaFIFO
  • LocalStore
    K8S的client-go与Informer机制,kubernetes,golang,容器
    K8S的client-go与Informer机制,kubernetes,golang,容器

四、实现一个简单的Controller

K8S的client-go与Informer机制,kubernetes,golang,容器
参考文档
https://github.com/kubernetes/client-go
https://qiankunli.github.io/2020/07/20/client_go.html
https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E8%AE%BA
深入理解k8s中的list-watch机制文章来源地址https://www.toymoban.com/news/detail-831290.html

到了这里,关于K8S的client-go与Informer机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • client-go初级篇,从操作kubernetes到编写单元测试

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 尽管长篇系列《client-go实战》的内容足够丰富,然而内容太多每个知识点也有一定深度,对于打算快速学习并开始kubernetes开发的新手并不友好,因此本篇的目标读者就是

    2024年02月12日
    浏览(31)
  • 【博客686】k8s informer list-watch机制中的re-list与resync

    client-go中的reflector模块首先会list apiserver获取某个资源的全量信息,然后根据list到的resourceversion来watch资源的增量信息。且希望使用client-go编写的控制器组件在与apiserver发生连接异常时,尽量的re-watch资源而不是re-list 场景一:very short watch reflector与api建立watch连接,但apiserve

    2024年02月14日
    浏览(30)
  • Kubernetes(k8s)安全机制

    目录 一、kubernetes安全机制 二、Authentication认证 1、用户分类 1.1、需要被认证的访问类型 1.2、安全性说明 1.3、证书颁发 1.4、Service Account 1.5、Secret 与 SA 的关系 1.6、Service Account (SA)中包含三个部分  2、kubeconfig文件 三、Authorization授权 3.1、RBAC 3.2、示例 3.3、Resources 四、准入

    2024年02月15日
    浏览(35)
  • 云原生Kubernetes:K8S安全机制

    目录 一、理论 1.K8S安全机制 2.Authentication认证 3.Authorization授权 4.Admission Control准入控制 5.User访问案例 6.ServiceAccount访问案例 二、实验 1.Admission Control准入控制 2.User访问案例 3.ServiceAccount访问案例 三、问题 1.生成资源报错 2.镜像拉取失败 四、总结 (1)概念 Kubernetes 作为一个分

    2024年02月07日
    浏览(46)
  • SpringBoot集成kubernetes-client升级k8s后初始化失败问题

    SpringBoot集成kubernetes-client升级k8s后初始化失败问题 1.问题描述 程序以前使用的k8s版本是1.16,fabric8.kubernetes-client的版本是4.10.2,springboot版本是2.3.5。由于环境切换,这次需要升级k8s的版本,现在将k8s版本升级到了1.26,程序中使用了新配置的certificate-authority-data,client-certific

    2024年02月10日
    浏览(36)
  • 【kubernetes】k8s中的选主机制

    1 为什么需要leader-election? 在集群中存在某种业务场景,一批相同功能的进程同时运行,但是同一时刻,只能有一个工作,只有当正在工作的进程异常时,才会由另一个进程进行接管。这种业务逻辑通常用于实现一主多从。 如果有人认为,传统应用需要部署多个通常是为了容

    2024年02月07日
    浏览(36)
  • Kubernetes基础(二十一)-k8s的服务发现机制

    Kubernetes(K8s)是一个强大的容器编排平台,提供了丰富的功能来简化容器化应用的管理。其中之一重要的特性就是服务发现机制,它使得应用程序能够在K8s集群中动态地发现和访问其他服务。本文将深入研究K8s中的服务发现机制,探讨其原理、使用方法以及通过详细的示例演

    2024年02月20日
    浏览(36)
  • Kubernetes技术--k8s核心技术集群的安全机制RBAC

    1.引入 我们在访问k8s的集群的时候,需要经过一下几个步骤: -a: 认证    -1 ). 传输安全:对外是不暴露端口:8080,只能够在内部访问,对外使用的是6443端口。    -2). 客户端认证的常用几种方式: -https 证书 基于ca证书 -https token 认证 通过token识别用户 -https

    2024年02月10日
    浏览(31)
  • client-go架构与原理介绍

    个人博客 client-go 库中的各种组件架构如下图所示: client-go 是用 Golang 语言编写的官方编程式交互客户端库,提供对 Kubernetes API server 服务的交互访问。 其源码目录结构如下: 2.1 RESTClient 客户端 RESTful Client 是最基础的客户端,它主要是对 HTTP 请求进行了封装,并且支持 JSO

    2024年02月07日
    浏览(25)
  • client-go源码结构及客户端对象

    G  Goup 资源组,包含一组资源操作的集合 V Version 资源版本,用于区分不同API的稳定程度及兼容性 R Resource 资源信息,用于区分不同的资源API K Kind 资源对象类型,每个资源对象都需要Kind来区分它自身代表的资源类型 (1)通过 GVR 可以构造 REST Api  进行接口调用,而 GVK 可以

    2024年04月26日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包