k8s权威指南笔记:开发指南

Posted by keys961 on April 8, 2022

1. Kubernetes API

可通过HTTP REST接口,与api-server交互,从而实现对k8s集群资源的控制。

1.1. API Groups

包括:

  1. 核心API/api/v1:常用资源对象(如Container、Pod、Endpoint、Service、ConfigMap等)都定义在这里

  2. 分组信息API:/apis/$GROUP_NAME/$VERSION

    • apps/v1:与应用发布有关,如Deployment、ReplicaSet等)

    • extensions/$VERSION:扩展API组,如DaemonSet、ReplicaSet、Ingress

    • batch/$VERSION:批处理相关,如Job

    • autoscaling/$VERSION:HPA相关

    • certificates.k8s.io/$VERSION:集群证书操作相关

    • rbac.authorization.k8s.io/$VERSION:RBAC鉴权相关

    • policy/$VERSION:Pod安全性相关

1.2. REST API操作资源对象

提供了GET、PUT、DELETE、POST、PATCH等接口操作资源对象,格式基本都是JSON。

此外,还增加了Watch的API接口(GET /watch/$RESOURCES),配合List接口,可实现资源信息同步。信息也支持分页传输,降低数据传输压力。

对于响应,出了通过HTTP状态码显示初步结果,也会在body处返回Status Kind说明详细原因。

2. Fabric8访问Kubernetes API

Fabric8是k8s的客户端实现之一,实际上对Kubernets REST API做了封装。

具体例子可参考: https://github.com/fabric8io/kubernetes-client/tree/master/kubernetes-examples/src/main/java/io/fabric8/kubernetes/examples

而其它也有对应客户端库,例如:

  • 官方的k8s库

  • 其它第三方的:[客户端库 Kubernetes](https://kubernetes.io/zh/docs/reference/using-api/client-libraries/)

3. Kubernetes API扩展

2种方式:

  1. CRD:复用api-server,只需定义CRD,并提供CRD控制器即可,但需要CRD对象符合api-server管理规范

  2. API聚合:编写额外的api-server,以进行更细粒度的控制

3.1. CRD扩展

操作简略步骤:

  1. 创建CRD定义,主要包括

    • group:API所属的组

    • scope:API生效范围(例如Namespace、Cluster等)

    • versions:支持的版本

    • names:CRD名称,包括单数、复数、kind、所属组等名称

  2. 根据CRD的names.kind,创建自定义资源对象,并在spec设置参数(需根据CRD开发手册进行自定义配置)

    • 具体业务需要在CRD控制器中处理

另外还有些高级特性,例如:

  • subresources子资源:status和scale类

  • CRD校验

  • 自定义查看CRD时需显示的列

  • Finalizer:CRD删除前的钩子

  • CRD多版本

具体可参考:[定制资源 Kubernetes](https://kubernetes.io/zh/docs/concepts/extend-kubernetes/api-extension/custom-resources/)

3.2. API聚合

k8s引入API聚合层,用户自行编写一个api-server,注册到Master的api-server,仍可以通过HTTP REST访问服务。

操作简略步骤:

  1. Master的api-server启用API聚合

  2. 创建自定义的APIService资源,以注册到Master上

  3. 实现和部署自定义到API Server,常规步骤如下

    1. 确认Master启用API聚合

    2. 创建RBAC规则,允许添加APIService资源对象

    3. 创建新的namespace,用于运行扩展的API Server

    4. 创建CA证书,用于HTTPS访问签名

    5. 创建服务端证书和密钥,用于HTTPS访问

    6. 新namespace下,用服务端证书和密钥创建Secret对象

    7. 部署API Server实例,可以用Deployment

    8. 挂载Secret到容器内部

    9. 在新的namespace创建ServiceAccount

    10. 创建ClusterRole用于自定义API资源进行操作

    11. ServiceAccount与ClusterRole绑定一个ClusterRolebinding

    12. ServiceAccount与系统ClusterRole“system:auth-delegator”创建ClusterRolebinding,以将认证决策代理转发到Master

    13. ServiceAccount与系统ClusterRole“extension- apiserver-authentication-reader”创建ClusterRolebinding,允许自定义API Server访问名为“extension-apiserver-authentication”的系统ConfigMap

    14. 创建APIService对象

    15. 验证APIService的API是否工作

一个例子:带你玩转kubernetes-k8s(第54篇-Kubernetes之使用API聚合机制扩展API资源)_坚持的道路注定孤独的博客-CSDN博客_k8s 聚合api