声明式API介绍
所谓“声明式” 指的就是我只需要提交一个定义好的API对象来“声明”,我所期望的状态是什么样子
“声明式 API”允许有多个 API写端,以PATCH的方式对API对象进行修改而无需关心本地原始YAML文件的内容.自动对多个写进行Merge操作
有了上述两个能力Kubernetes才可以基于对 API 对象的增、删、改、查.在完全无需外界干预的情况下完成对“实际状态”和“期望状态”的调谐(Reconcile)过程
声明式 API才是 Kubernetes项目编排能力“赖以生存”的核心所在
APIServer介绍
k8s的API对象的组织方式是一个层层递进的方式来组织的 api组/api版本/资源类型
把一个YAML 文件提交给Kubernetes之后创建出一个API对象的流程:
1. Kubernetes 会匹配 API对象的组
2. Kubernetes 会进一步匹配到 API对象的版本号
3. Kubernetes 会匹配 API 对象的资源类型
4. kubernetes匹配到正确的资源类型后,就可以开始创建API对象.APIServer执行流程如下:
1.APIServer首先过滤这个请求并完成一些前置性工作. 如:授权,超时处理,审计
2.然后请求进入MUX和Routers流程.这个步骤是APIServer完成URL和Handler绑定的场所.APIServer的Handler的功能就是找到用户提交资源对应的类型定义
3.API根据对应的类型定义配合用户提交的YAML文件里的字段.在内存中创建出一个相应的对象.在创建的过程中APIServer会进行一个Convert操作,把用户提交的YAML文件转换成一个叫Super Version的对象.它是该API资源类型所有版本字段的全集.这样用户提交不同的版本的YAML文件就都可以使用Super Version对象来处理
4.APIServer会对内存中的对象进行Admission()操作,如Admission Controller和Initializer步骤都属于Admission阶段
5.APIServer会把对象进行Validation操作,它负责验证这个对象里的各个字段是否合法.验证通过后的API对象都会保存到APIServer中一个叫 Registry的数据结构中
6.APIServer会把验证过的Super API对象转换用户最初提交的版本进行序列化操作并保存到Etcd中.至此整个API对象创建完毕
APIServer要同时要兼顾性能、API 完备性、版本化、向后兼容等很多工程化指标
Custom Resource Definition(CRD)定义
它指的就是允许用户在Kubernetes中添加一个跟Pod、Node 类似的、新的 API 资源类型 即:自定义 API 资源
使用code-generator生成代码的时候跟宿主机安装的go版本有很大的关系 如在go1.12和go1.13执行go build的时候对代码的要求就不一样
go1.13上引入mod的名称不是标准的域名也会报错。而在go1.12版本上就不会报错
解决办法:
1.修改code-generator项目下的go.mod
k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry => /root/gopath/src/k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry
// This is a generated file. Do not edit directly. go 1.13 require ( github.com/emicklei/go-restful v2.11.2+incompatible // indirect github.com/go-openapi/jsonreference v0.19.3 // indirect github.com/spf13/pflag v1.0.5 github.com/stretchr/objx v0.2.0 // indirect golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect golang.org/x/net v0.0.0-20200226121028-0de0cce0169b // indirect golang.org/x/tools v0.0.0-20200226224502-204d844ad48d // indirect k8s.io/apimachinery v0.17.3 // indirect k8s.io/gengo v0.0.0-20200205140755-e0e292d8aa12 k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry v0.0.0-00010101000000-000000000000 // indirect k8s.io/klog v1.0.0 k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe sigs.k8s.io/yaml v1.2.0 // indirect ) replace ( golang.org/x/sys => golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a // pinned to release-branch.go1.13 golang.org/x/tools => golang.org/x/tools v0.0.0-20190821162956-65e3620a7ae7 // pinned to release-branch.go1.13 //告诉go不要使用去远程服务器下载 直接使用本地目录 k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry => /root/gopath/src/k8s.io/k8s_customize_controller/pkg/apis/bolingcavalry )