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的流程就完成了。

转载于:https://www.cnblogs.com/elnino/p/7206712.html

k8s学习(一)——kubectl与api-server之间的交互核心过程相关推荐

  1. python实现api server,初学python,准备学习做个restful api server,现在有些困惑

    在网上看到个教程 from flask import Flask, jsonify app = Flask(__name__) tasks = [ { 'id': 1, 'title': u'Buy ...

  2. [k8s 学习笔记]

    摘自知乎: k8s入门及实践 一. k8s简介 K8S 是Kubernetes的全称,官方称其是: Kubernetes is an open source system for managing c ...

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

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

  4. 【EasyRL学习笔记】第二章 Markov Decision Process 马尔可夫决策过程

    文章目录 一.马尔可夫过程 1.1 马尔可夫性质 1.2 马尔可夫链 1.3 马尔可夫过程的例子 二.马尔可夫奖励过程 2.1 回报与价值函数 2.2 贝尔曼方程 2.3 计算马尔可夫奖励过程价值的迭 ...

  5. k8s 组件介绍-API Server

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

  6. k8s实践(6)--Kubernetes安全:API Server访问控制

    Kubernetes安全 安全永远是一个重大的话题,特别是云计算平台,更需要设计出一套完善的安全方案,以应对复杂的场景. Kubernetes主要使用Docker作为应用承载环境,Kubernetes ...

  7. ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

    [云原生]| 作者/Edison Zhou 这是恰童鞋骚年的第232篇原创文章 上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使用,考虑到很多团队都在使用Ocelot作为 ...

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

    " 终于可以部署ASP.NET Core到K8S中了..." 在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP ...

  9. [K8S]error execution phase preflight: couldn‘t validate the identity of the API Server

    用kubeadm工具,k8s使用kubeadm join将工作节点加入到主控节点的时候遇到如下问题,执行命令卡顿很久后报错 [root@k8s2 ~]# kubeadm join 192.168.0. ...

最新文章

  1. 基础数据结构【三】————老鼠走迷宫问题————堆栈应用
  2. 二维码检测哪家强?五大开源库测评比较
  3. 年底送点福利,包邮送55本!Python、大数据、人工智能任你挑!
  4. plotly基于dataframe数据绘制股票K线图并过滤非交易时间
  5. Java设计模式(二):观察者设计模式
  6. [leetcode]160.相交链表
  7. Vue.js过滤器概述
  8. 天天写日记争当文艺青年 2014-5-13
  9. 赠送300家门店260亿销售额的零售企业Power BI实战示例数据
  10. 简单介绍一下BSP中的dirs文件和sources文件(WinCE
  11. php 查看引入文件,include - 引入文件
  12. python编程可以做什么菜_Python 编程! 我是菜菜菜鸟 大家帮帮忙
  13. 计算机网络-名词解释整理
  14. 100 个常见的 PHP 面试题和答案分享
  15. SQL Server 遇到报错解决办法--更新中
  16. Linux释放内存的命令
  17. 计算机网络——ALOHA协议
  18. 网易2019实习生招聘编程题集合 - 题解
  19. 《使用机器视觉从照片中确定西瓜质量》论文笔记
  20. Sublime Text正确的打开方式

热门文章

  1. Http实现文件下载
  2. Yii2 behaviors中verbs access的一些理解
  3. Gridview导出到EXCEL
  4. 测试Flex代码覆盖率工具---FlexCover
  5. Linux内存之Cache
  6. ceph auth get_CPB羽梦幻境体验展来了!快来GET限量产品!
  7. Nginx之代理和负载均衡
  8. DNS IP DOMAIN 详解
  9. (10)FPGA与ASIC区别
  10. (100)Verilog HDL:UART波特率设计