前言
最近由于工作需要,重新系统回顾 Kubernetes 的编程。发现《Programming Kubernetes》这书写得比较系统。于是边学,边记录一些重点。
Controller
Controller Loop
来源:[Programming Kubernetes]
- Informers:CRD 资源变化通知者。通过
watch
API 监听 - Work queues: 记录失败/推后的操作,以方便后面重试
CRD and CR
Kubernetes API Basics
Kubernetes architecture overview —— 来源:[Programming Kubernetes]
HTTP Interface of the API Server
HTTP verbs:
- The HTTP
GET
verb is used for retrieving the data with a specific resource (such as a certain pod) or a collection or list of resources (for example, all pods in a namespace). - The HTTP
POST
verb is used for creating a resource, such as a service or a deployment. - The HTTP
PUT
verb is used for updating an existing resource—for example, changing the container image of a pod. - The HTTP
PATCH
verb is used for partial updates of existing resources
API 术语
- Kind - 基本对象。一个
Kind
对应一个 GO 对象定义 - List - 集合对象,如
kubectl get pods
时获取的对象 - API group : 相关的 Kind 的集合。如
Job
和ScheduledJob
均在batch API group
- Version:每个
API Group
在开发迭代过程中会产生多个版本,如 v1alpha1 -> v1beta1 -> v1。API Server 需要兼容这多版本。对于一个对象,返回什么版本由 API 调用者决定(即实时转换) - Resource:表现为一个 URL Path,如
xxx/pods
、xxx/pods/nginx
。
Resource
主Resource
支持CRUD
操作,在它之下,还有Subresources
。如.../pod/nginx/port-forward
,.../pod/nginx/logs
,它们一般走 WebSockets
。
Resource 的URL Pattern:
Resource 可以以 GroupVersionResource (or GVR) 作为标识。另外有一种标识是用 GroupVersionKind (GVK)。他们之间可转换,由 Golang 中的 RESTMappers
完成。
全局看,API 可以用以下树表示:
由于历史原因,k8s核心的api 在
api/v1
下,而不是用 api group 分类的/apis/core/v1
下。
声明式的状态管理
大部分 API 对象的定义(specification)分为两部分:
- 期望的状态(desired state)
- 现实的状态(status)
期望的状态一般会被持久化,一般是保存在 etcd 中。
在命令行中调用 API
|
|
正如你看到的,v1beta1 有一个未放入正式版本中的 cronjobs
如果你想列出所有资源:
|
|
如果想知道系统支持的 api group:
|
|
API Server 处理请求的流程
这个调用链定义在源码(link),
参考
[Programming Kubernetes]