k8s的架构是用户使用kubectl工具对虚拟机资源进行各种各样的控制和定制。

而kubectl本身并不包含对其核心资源的访问与控制。而是通过http通信与api-server进行交互实现资源的管理。

而api-server的核心其实就是etcd数据库,它将各种资源的管理通过对etcd中的数据进行更改实现。这篇文章简要分析一下kubectl对

api-server发起访问的过程。

以kubectl create 指令为例,其指令的相关代码在kubernetes/pkg/kubectl/cmd/create.go这个文件中。

一,参数的构造

稍加分析不难看出,其创建资源的核心函数是func RunCreate()。

          r := builder.
Schema(schema).
ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &options.FilenameOptions).
SelectorParam(options.Selector).
Flatten().
Do()

这段代码调用了builder的一串函数,最后生成一个Result类型的变量r。(Result 定义在 kubernetes/pkg/kubectl/resource/result.go)

这里builder的作用是将之前解析得到的各种参数进行各种分析后填充到builder中,最后再生成一个Result类型的变量r。

此时r中最关键的数据是visitor,这个visitor中包含了多个资源,也就是说一个visitor包含了一个对象(此处存疑)。

接着以一个函数func为参数调用r的Visit函数。经过分析我们可以知道这是一个调用链函数,其中继续对参数进行各种分析,处理。

r.Visit(func(info *resource.Info, err error) error {
.....
})

大致的调用顺序为

Result.Visit()
ContinueOnError.Visit()
Decorated.Visit()
FlattenList.Visit()
EagerVisitorList.Visit()
FileVisitor.Visit()
StreamVisitor.Visit()
在StreamVisitor之前,都是对数据的各种处理,并不会调用func函数,在StreamVisitor.Visit()中一个关键的处理是生成一个临时变量Info。

info, err := v.InfoForData(ext.Raw, v.Source)

这里的ext.Raw和v.Source都是之前对用户的输入进行解析的结果。

ext.Raw是byte[]类型,v.Source是String类型,打印出来:

ext.Raw={
"apiVersion":"v1",
"kind":"Pod",
"metadata":
{"name":"with-node-affinity-2"},
"spec":
{"affinity":
{"nodeAffinity":{"preferredDuringSchedulingIgnoredDuringExecution":[{"preference":{"matchExpressions":[{"key":"another-node-label-key","operator":"In","values":["another-node-label-value"]}]},
"weight":1}],
"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"kubernetes.io/e2e-az-name","operator":"In","values":["e2e-az1","e2e-az2"]}]}]}}},
"containers":[{"image":"gcr.io/google_containers/pause:2.0","name":"with-node-affinity"}]}}, v.Source=/home/wlh/mywork/yaml_file/pod-with-node-affinity.yaml

可以看到其中存储了生成的资源的各种特性,有了这个info之后执行func(info)。

二,访问api-server

得到了info这个数据结构后,调用func()函数对api-server发起访问请求。

if !dryRun {
if err := createAndRefresh(info); err != nil {
return cmdutil.AddSourceToErr("creating", info.Source, err)
}
}

这个dryRun标志位的意思是,只打印出将要创建的资源的各种特性,而不会真正去创建他。

而createAndRefresh函数中的核心调用是

obj, err := resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, true, info.Object)

这里创建了一个Helper类型的对象,仔细分析后不难发现Info.Client中定义了访问动作,而info.Mapping中定义了这些动作所要访问的资源。

此时Helper中已经包含了发起一个对api-server请求的所有资源,接着调用Create函数,它创建一个具体去执行这些请求的Request对象。(定义在kubernetes/vendor/k8s.io/client-go/rest/request.go中)

Requeste发起对api-server的请求,并且将访问存储在ResutInfo中,与此同时返回一个Runtime.Object对象。

这样一次完整的访问api-server的流程就完成了。

k8s学习(一)——kubectl与api-server之间的交互核心过程的更多相关文章

  1. Kubernetes源码之旅:从kubectl到API Server

    概述: Kubernetes项目目前依然延续着之前爆炸式的扩张.急需能够理解Kubernetes原理并且贡献代码的软件开发者.学习Kubernetes源码并不容易.Kubernetes是使用相对年轻的 ...

  2. PyQt学习随笔:Model和View之间的数据互动过程

    在<PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系>中介绍了,Model用于存储数据,View用于展 ...

  3. 028.核心组件-API Server

    一 Kubernetes API Server原理 1.1 API Server功能 Kubernetes API Server的核心功能是提供Kubernetes各类资源对象(如Pod.RC.Ser ...

  4. 033.Kubernetes集群安全-API Server认证及授权

    一 Kubernetes集群安全 1.1 安全机制 Kubernetes通过一系列机制来实现集群的安全控制,其中包括API Server的认证授权.准入控制机制及保护敏感信息的Secret机制等.集群 ...

  5. AngularJs-指令和指令之间的交互(动感超人)

    前言: 上节我们学习到了指令和控制器之间的交互,通过给指令添加动作,调用了控制器中的方法.本节我们学习指令和指令之间是如何交互的,我们通过一个小游戏来和大家一起学习,听大漠老师说这是国外的人写的dem ...

  6. k8s学习 - API

    k8s学习 - API 之前对k8s并没有很深入的了解,最近想把手头一个项目全部放到k8s上,以方便部署,需要研究.这里记录一下自己研究过程中头脑中的理解. k8s 和 docker 首先,需要先理解 ...

  7. k8s 组件介绍-API Server

    API Server简介 k8s API Server提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心. kub ...

  8. K8S Api Server认证

    目录 认证类型 基于CA证书的双向认证 apiserver端配置 生成客户端私钥和证书 master核心组件与apiserver的认证方式 HTTP Token认证 HTTP Basic认证 kube ...

  9. ASP.NET Core on K8S学习初探(3)部署API到K8S

    在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...

随机推荐

  1. sklearn快速入门

    原创博文,转载请注明出处. (为了节约空间,打印结果常用"..."表示省略) 一.加载数据集 1. 加载sklearn自带的数据集 scikit-learn有一些自带的标准数据集, ...

  2. Linux 的日常 tools

    Linux基础命令里的就不再赘述了. Table of Contents 一.下载(命令行工具,只给出常用的命令说明) wget/cURL(一般系统自带) aria2/axel多线程下载 1. ari ...

  3. 冒泡排序(Bubble Sort)及优化

    原理介绍 冒泡排序算法的原理如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有 ...

  4. 在数组中寻找出现次数大于N/K的数

    给定一个int[]数组,给定一个整数k,打印所有出现次数大于N/k的数,没有的话,给出提示信息. === 核心思想:一次在数组中删除K个不同的数,不停的删除,直到剩下的数的种类不足K就停止删除,那么如 ...

  5. pip更新产生的问题及其解决方法?

    运行 pip3 install --upgrade pip 发生错误: from pip import main ImportError: cannot import name 'main' 将以下代 ...

  6. 查找jar包中.class文件关键字(变量名,字符串)

    有时查看日志,常常会发现由框架底层打印的错误日志.要修改这个错误的时候,如果不是对框架特别熟悉,就需要按照可能产生这个错误日志的流程一步一步找,一时半会不一定能找到.比如本人最近对smartfoxse ...

  7. 翻译MDN里js的一些方法属性

    TypeError The TypeError object represents an error when a value is not of the expected type. [TypeEr ...

  8. spring IOC注解方式详解

    本文分为三个部分:概述.使用注解进行属性注入.使用注解进行Bean的自动定义. 一,概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以 ...

  9. C#从大图中截取一部分图片

    #region 从大图中截取一部分图片 /// <summary> /// 从大图中截取一部分图片 /// </summary> /// <param name=&quo ...

  10. webpack命令

    webpack // 执行一次开发的编译 webpack -p // 针对发布环境编译(压缩代码) webpack -w(或--watch) // 进行开发过程持续的增量编译(飞快地!) webpac ...