K8S 核心组件 api server 介绍

ApiServer 核心功能

  • 集群管理的API 入口
  • 资源配置控制入口
  • 提供完备的集群安全机制

api server 是通过kube-apiserver 进程来提供服务的. 默认情况下在本机8080端口提供 rest 服务(--insecure-port), 也可以启用HTTPS 安全端口 (--secure-port=6443)

roger@microk8s:~$ curl localhost:8080/api
{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "192.168.10.5:16443"
    }
  ]
}

可以看到API 版本是v1

使用下面的url 来查询资源

curl localhost:8080/api/v1/serivces
curl localhost:8080/api/v1/pods
curl localhost:8080/api/v1/replicaioncontrollers
curl localhost:8080/apis #查看API 分组

注意以上命令都是在master 节点执行

对外暴露REST api

  1. 方式1
kubectl proxy --reject-paths="/api/v1/replicationcontrollers" ---port=8001

以上命令在8001对外暴露 rest api, 对于/api/v1/replicationcontrollers 的API 不允许访问

  1. 方式2

也可以使用--accept-hosts 参数指定访问白名单

kubectl proxy --accept-hosts="^localhost.^127\\.0\\.0\\.1$,\\[::1\\]$" ---port=8001
  1. 方式3

通过编程方式调用api server. 这种方式一般分为两种场景

  • 运行在POD里的用户进程需要调用 api server 以获取集群信息,通常应用在分布式集群搭建目标中, 比如ES集群.
  • 开发基于K8S的管理平台.

在第一种场景中 apiserver 在K8S 集群中体现为名为 kubernetes的 service

roger@microk8s:~$ kubectl get service --all-namespaces
NAMESPACE     NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       default-http-backend   ClusterIP   10.152.183.69    <none>        80/TCP                   18d
default       http-svc               ClusterIP   10.152.183.164   <none>        80/TCP                   18d
default       kubernetes             ClusterIP   10.152.183.1     <none>        443/TCP                  87d
kube-system   heapster               ClusterIP   10.152.183.79    <none>        80/TCP                   18d
kube-system   kube-dns               ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   28d
kube-system   kubernetes-dashboard   ClusterIP   10.152.183.163   <none>        443/TCP                  18d
kube-system   monitoring-grafana     ClusterIP   10.152.183.244   <none>        80/TCP                   18d
kube-system   monitoring-influxdb    ClusterIP   10.152.183.223   <none>        8083/TCP,8086/TCP        18d

api server 架构解析

image.png
  1. api层: 主要提供对外的 rest api
  2. 访问控制层: 验证身份与鉴权,根据配置的各种资源访问许可逻辑(Adminssion control) ,判断是否允许访问
  3. 注册表层: K8S 将所有对象都保存在registry 中, 针对 registry 中的各种资源对象, 都定义对象类型, 如何创建资源对象, 如何转换不同版本, 以及如何将资源编码和解码为json 或protobuf 格式进行存储.
  4. etcd 数据库: 用于持久化存储快s 资源对象.

api server list watch 机制解析

image.png

api server 通过etcd的watch 接口监听资源的变更情况,当事件发生时 etcd 会通知 api server 比如步骤3, 为了让K8S的其他组件不依赖于etcd, api server 模仿etcd 提供了watch 机制, 当事件发生时,通知对应的组件 比如 4 8 12步骤中的实践 0 表示最开始进行watch 监控.

api server的api 版本控制

api server 针对每种资源都引入了一个相对不便的interal版本, 所有其他版本的资源对象(数据结构)只要支持能够转换为internal 就可以与其他版本的对象互换.

customer resource definition CRD

K8S 内置资源都包含了如下主要功能

  1. 资源对象的元数据(Schema)的定义: 可以将其理解为数据库的table定义,定义了资源的数据结构, 官方建议内建资源对象的元数据定义固话在源代码中.
  2. 资源对象的校验逻辑: 确保用户提交的资源对象的属性的合法性
  3. 资源对象的CRUD操作代码: 可以将其裂解为数据库表的CRUD代码.
  4. 资源对象相关的自动控制,比如deployment对象后的控制器. 这是很重要的一个功能, 用户给出期望的资源对象声明, 运行过程中择优背后的"自动控制器"负责, 确保对应的资源对象数量, 状态, 行为 都符合预期.

现在CRD 的1-3 步无序编程实现,直接写yaml 即可, 第四部, 通过调用用 api server 的api 来实现.

k8s proxy api 接口

proxy api 接口是指 api server 会把rest 请求转发到其K8S 组件, 又其他组件(比如kubelet)来响应的特殊接口.

比如node 相关的接口由kubelet响应

/api/v1/proxy/nodes/{name}/pods # 获取节点上所有pod
/api/v1/proxy/nodes/{name}/stats #获取节点的物理资源统计
/api/v1/proxy/nodes/{name}/spec #获取节点的概要信息

注意{name} 是节点的名称或者地址,这里获取的数据都来自kubelet 而非 etcd,所以两者的数据有时候会有偏差, 如果kubelet 启动时包含了 --enable--debugging-handlers=true 参数 那么proxy api 还会增加以下接口

/api/v1/proxy/nodes/{name}/run # 获取节点上运行某个容器
/api/v1/proxy/nodes/{name}/exec # 获取节点上的某个容器中运行某调命令
/api/v1/proxy/nodes/{name}/attach # 在节点上attach某个容器
/api/v1/proxy/nodes/{name}/portForwad # 实现节点上的pod 端口转发
/api/v1/proxy/nodes/{name}/log # 列出节点的个类日志信息,例如tallylog lastlog wtmp ppp/ shsm/ audit/ tuned/ 和 annaconda 等
/api/v1/proxy/nodes/{name}/metrics # 获取节点上相关的metrics信息
/api/v1/proxy/nodes/{name}/runningpods 
/api/v1/proxy/nodes/{name}/debug/pprof # 列出当前节点web服务状态包括CPU 占用和内存占用情ingkuang.

集群功能模块之间的通信

image.png

原创不易如果文章对您有所帮助

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容