云原生kubernetes

K8S 核心组件 api server 介绍

2019-07-16  本文已影响0人  陈sir的知识图谱

ApiServer 核心功能

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. 这种方式一般分为两种场景

在第一种场景中 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

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

上一篇下一篇

猜你喜欢

热点阅读