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. 11 JVM 垃圾回收(上)

    引用计数法和可达性分析 垃圾回收,就是将已经分配出去的,但却不在使用的内存回收回来,以便再次分配.在 Java 虚拟机语境下,垃圾指的是死亡的对象所占据的堆空间.下面就总结一下如何如何辨别一个对象是否 ...

  2. iOS属性文字NSAttributedString

    它本身是一个Foundation框架的类, 但如果要使用它主要用到了UIKit框架中的NSAttributedString中的一些常量字符串 ----------------------------- ...

  3. 个人环境搭建——搭建JDK环境

    搭建JDK环境 开始之初先提醒两点: ①java是在bash环境下面的,虽然我也在.cshrc下面添加了环境变量,好像有点问题,需要继续改进: ②查看linux版本信息命令:cat /etc/issu ...

  4. css的fix高度缺失

    这个方法是百度百科手机页面用的,先为固定定位元素设一个父元素,不设高度,不设宽度,什么都不设,他的第一个子元素是我们需要做固定定位的元素,这个按照需求写好样式,此时,父元素的高度依然是0,如何使得父元 ...

  5. Idea下maven的配置和使用

    maven的主要功能就是依赖管理,jar包仓库.和C#中的NuGet仓库差不多.另外也提供打包构建,启动插件等功能.下面主要讲一下,在使用Idea开发时,maven的配置和使用. maven的安装和配 ...

  6. LESS CSS使用方法 , CSS也能跟JS一样玩

    本文转自  http://blog.csdn.net/xuyonghong1122/article/details/51986472 在使用CSS的时候,总会有这个想法 这个属性值老是重复写好烦 这个 ...

  7. bzoj 2741 [FOTILE模拟赛] L

    Description 多个询问l,r,求所有子区间异或和中最大是多少 强制在线 Solution 分块+可持久化trie 1.对于每块的左端点L,预处理出L到任意一个i,[L,j] 间所有子区间异或 ...

  8. POJ1692 Crossed Matchings

    Time Limit: 1000MS     Memory Limit: 10000K Total Submissions: 2738   Accepted: 1777 Description The ...

  9. jquery封装的图片切换js

    原文发布时间为:2010-10-09 -- 来源于本人的百度文章 [由搬家工具导入] http://jquery.malsup.com/cycle/browser.html

  10. 组合模式Composite Pattern(转)

    什么是组合模式呢?简单来说组合模式就是将对象合成树形结构以表示“部分整体”的层次结构,组合模式使用户对单个对象和组合对象使用具有一致性. 组合模式(Composite Pattern)有时候又叫部分- ...