K8S学习笔录 - Kubernetes API Server简介

原文连接git

在以前的学习过程当中,都是在Master节点上使用 kubectl 命令与相应的配置文件对集群资源进行操做。 实际上真正操做集群资源的是 Kubernetes API Serverkubeclt 工具也是经过该服务提供的接口对资源进行操做的。github

什么是API Server

Kubernetes API Server 是运行在Master节点上的kube-apiserver进程提供的服务。 该服务是集群内各个功能模块之间数据交互和通讯的中心枢纽,是整个系统的数据总线和数据中心。数据库

因为API Server承担了系统内关键的数据通讯部分,因此API Server的性能高低决定了集群性能的高低。api

API Server架构与设计

API Server的架构从上到下能够分为四层bash

  1. API层。提供针对资源CRUD的和监控的接口和健康检查、日志、性能指标等运维相关接口。markdown

  2. 访问控制层。当客户端访问API的时候,负责对用户的权限作验证,根据配置的的各类资源访问权限判断是否能够访问。网络

  3. 注册表层。Kubernetes把全部资源对象都保存在注册表中,针对注册表中的各类资源对象定义了相关数据类型和建立、转换、编码的方法。架构

  4. ETCD数据库层。用于持久化存储资源对象的。K8S使用etcd的watch API接口设计了 List-Watch 高性能资源同步机制,使得系统能够管理大规模的集群和快速及时的处理集群中的各类事件。app

apiserver-struct

List Watch机制

首先 kube-apiserver 借助etcd的watch API接口,能够监听到在etcd上发生的数据操做事件,例如Pod的建立、更新、删除等。运维

而后,为了避免让除了 kube-apiserver 以外的组件一样访问到底层数据库, kube-apiserver 也实现了一套与etcd监听类似的接口提供给上层业务,使得其余业务能够不访问底层数据库就监听到数据的变化。 例如上图中虚线框 List-Watch 2kube-scheduler 组件经过监听即便得到了 kube-controller-manager 发起的建立Pod的事件,对新建Pod进行调度等操做。

最后,在数据同步上客户端先获取到了调用API Server的接口获取到全量数据,而后经过goroutine监听列表数据变化异步写入内存,实现高性能的数据同步。

apiserver-workflow

API升级带来的数据转化问题

在经过godoc学习编写配置文件的时候,咱们看到了实际上K8S在同一个类型的资源有不少版本,例如 app/v1app/v1beta1app/v1beta2 。 另外经过网上的一些博客文章也能够发现以前有些资源是在 v1beta 中的,而如今已经迁移到 v1 中了。

经过版本号能够解决接口版本兼容问题,可是还有一个版本之间数据转化的问题。好比数据对象经历了 v1beta1v1beta2 ... v1betaN-1 最终变为 v1 版本。

此时该数据对象就存在N个版本,若是这N个版本之间的数据两两直接转换,就存在不少种逻辑组合,变成一种典型的网状网络。 另外每增长一个新的版本,就须要增长N份相应的转化配置。

因而API Server引入了一个中间版本(internal),全部的版本最终都会转为此版本进行使用,以此减小互相转化的成本。

apiserver-vc-internal

如何调用Kubernetes API Server

在Master节点上该服务能够经过本地接口来访问,端口经过kube-apiserver启动参数 --insecure-port=8080--secure-port=6443 进行配置。

进程的启动参数能够经过 ps -o cmd -C kube-apiserver 来查看。

不过在我使用 kubeadm 初始化集群的时候, kube-apiserver 其实是以集群中Pod的形式启动的。

$ kubectl get pod -n kube-system
NAME                          READY   STATUS    RESTARTS   AGE
...
kube-apiserver-ali            1/1     Running   0          39m
...
复制代码

因此我能够经过修改 /etc/kubernetes/manifests/kube-apiserver.yaml 的Pod配置文件来修改端口。 具体的参数意义能够在官网查阅 kube-apiserver

在上述工做作好以后,经过 curl localhost:8080 即可以访问到API Server提供的服务

$ curl localhost:8080
{
  "paths": [
    "/api",
    ...
  ]
}
复制代码

举个例子,例如要查看指定pod的状态,即可以经过以下方式进行调用

$ curl localhost:8080/api/v1/namespaces/default/pods/<pod-name>
{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    ...
  },
  "spec": {
    ...
  },
  "status": {
    ...
  }
}
复制代码

除了curl之外,也能够经过k8s的api库来调用,例如 github.com/kubernetes/…

篇幅限制,就不贴他们的实例代码了,有兴趣的能够在这里看 github.com/kubernetes/…

相关文章
相关标签/搜索