kubernetes-client分析(三)-dynamicClient-v1.5.2
之前在”RESTClient,DynamicClient和ClientSet Demo”分享过DynamicClient的用法。本次分析就介绍dynamicClient是如何实现的。
dynamicClient定义
在使用RESTClient时,需要用户自己设置很多的参数,如下所示:
之前在”RESTClient,DynamicClient和ClientSet Demo”分享过DynamicClient的用法。本次分析就介绍dynamicClient是如何实现的。
在使用RESTClient时,需要用户自己设置很多的参数,如下所示:
Config中含有apiserver相关的信息,可以生成RESTClient,定义在/pkg/client/restclient/config.go中:
接下来,开始分析kubernetes的client相关代码。之前有篇”RESTClient,DynamicClient和ClientSet Demo”( https://fankangbest.github.io/2017/07/15/RESTClient-DynamicClient%E5%92%8CClientSet-Demo/ )的分析介绍三种client的用法,三种client都使用下面代码生成config:
(整理自https://studygolang.com/articles/4367)
func NewReaderSize(rd io.Reader, size int) *Reader
NewReadSize()将rd封装成一个拥有size大小缓存的bufio.Reader对象。func NewReader(rd io.Reader) *Reader
NewReader()相当于NewReaderSize(rd, 4096)。
之前在kubectl printer中已经分析过kubectl是如何以YAML格式打印内容的,本次分析将介绍kubectl是如何从YAML格式文件输入内容并做转换的。
我们在使用kubectl create -f时,可以从文件创建资源,文件的格式可以为JSON格式或YAML格式。其中YAML格式支持”—“分割符,可以把多个YAML写在一个文件中。读取文件的操作通过FileVisitor进行,FileVisitor定义在/pkg/kubectl/resource/visitor.go中:
本次将分析kube-scheduler的核心——scheduler,来看下是如何生成scheduler,及如何对Pod进行调度的。
ConfigFactory可以生成Scheduler Config。先来看如何生成一个ConfigFactory,生成函数字义在/plugin/pkg/scheduler/factory/factory.go中:
kube-scheduler在Kubernetes中负责Pods的调度,其主要流程是获取未被调度的pod,然后根据pod的信息过滤出符合要求的nodes,接着对这些符合要求的nodes进行打分,最后把得分最高的node作为pod的调度结果。所以,在kube-scheduler中有两类算法,一种是用来过滤nodes的算法,称为predicate类;另一种是来用打分的算法,称为priority类。本次分析,就是介绍kube-scheduler是如何对算法进行管理的。
本次分析只介绍userspace模式。
Proxysocket相关的内容定义在/pkg/proxy/userspace/proxysocket.go中:
Kube-proxy在Kubernetes中负责把service的流量导入到具体的pod上。所以kube-proxy需要从apiserver获取service及endpoint信息,而这些信息的获取就是通过config来管理的。该处的config和配置不同,应该理解为对信息来源的管理。Kube-proxy只支持从apiserver获取信息;而kubelet可以从apiserver,file和http三种渠道获取信息。本次分析将介绍kube-proxy的config,即kube-proxy是如何从apiserver中获取service及endpoint的变化,是如何把这种变化交给处理函数的。
在kube-proxy中有ServiceConfig和EndpointConfig,我们以ServiceConfig为例子。
ServiceConfig是kube-proxy从各渠道收集services信息,然后经mux merge()后,把各渠道的信息汇总到ServiceStore对应的source key下。最后通过BroadCaster先合并所有source下的services,并交给注册好的handler处理。
先来看两个概念:Mux和Broadcaster。