K8S的API和API资源对象

通过前面几节的学习,我们已经知道k8s集群中控制平面节点(control-plane)上的核心组件时kube-apiserver。 kube-apiserver是集群控制管理、资源配置、安全机制的入口,提供了HTTP API服务,以供终端用户、集群内部的组件和服务、集群外部组件相互通信。

使用Kubernetes API可以查询和操纵Kubernetes API中的资源对象。那么有哪些API资源对象呢?之前的内容中已经提及到了两个分别是组成集群的Node和k8s将多个容器组成一个逻辑单元的Pod。Node和Pod就是两个K8S API对象,关于更多的API对象后边再展开学习。

总结一下,位于K8S集群外部或内部的K8S API的客户端(kubectl, dashboard, 集群内部的其他组件服务)通过K8S API查询和操作K8S API对象。 我们也可以编写程序来访问K8S API,K8S的文档页https://kubernetes.io/zh/docs/reference/using-api/client-libraries/给出了常用编程语言使用K8S API的客户端库。

K8S API的组和版本

K8S API遵循OpenAPI规范(https://www.openapis.org/),并以端点/openapi/v2提供API规范。

K8S API随着K8S的迭代发展而不断变化和发展,例如新的API对象和对象字段可以被频繁的加入,同时也会删除某些API对象和字段,为了保持在一定时间内对旧版本客户端的兼容性,K8S还制定了"API废弃策略"。K8S API实际上是一个API集合,每个集合称为一个API组(API Group),每个组下有多个API对象。K8S的API版本管理是面向组的。目前API的版本有三类分别是:

  • v1 表示正式发布(GA Generally available稳定版)
  • v1beta1 预发布(Beta)
  • v1alpha1 试验特性Alpha

API版本分类和API组是多对多的关系,即每个组可以包含多个版本的API。更多内容可以去查看k8s弃用策略文档中的弃用API部分。(https://kubernetes.io/zh/docs/reference/using-api/deprecation-policy/)

API资源对象之间靠apiVersion(API组)、kind(资源类型)、namespace(名字空间)、name(名称)来相互区分。 例如下面的是用yaml描述的两个API资源对象。第一个资源对象的API组是核心组v1版本,资源类型是Pod,命名空间是default,名称是curl。 第二个资源对象的API组是networking.k8s.io组的v1版本,资源类型是Ingress,命名空间是kube-system,名称是kubernetes-dashboard。

1
2
3
4
5
6
kind: Pod
apiVersion: v1
metadata:
  namespace: default
  name: curl
...
1
2
3
4
5
6
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
...

另外还要知道核心组的REST API路径是/api/v1,特定组名$GROUP_NAME的REST路径是/apis/$GROUP_NAME/$VERSION,例如上面例子中的networking.k8s.io/v1

参考链接