a go client for operating istio in k8s cluster
步骤如下:
- 在 pkg/apis/{API Group}/{version} 下编写 crd 定义
- 增加合适的代码生成标签,参考
- 利用 code-generator 生成 clientset、informer 等代码
如果是需要操作别人已经预先定义好的 crd,可以直接在定义 crd 时进行引用。 以 istio 的 virtual service 为例,只需引入 istio.io/api/networking/v1alpha3/VirtualService 即可。
# 代码生成的工作目录,也就是我们的项目路径
ROOT_PACKAGE="github.com/RuiWang14/k8s-istio-client"
# 安装 k8s.io/code-generator
go get -u k8s.io/code-generator/...
cd $GOPATH/src/k8s.io/code-generator
# 执行代码自动生成,其中 pkg/client 是生成目标目录,pkg/apis 是类型定义目录
./generate-groups.sh all "$ROOT_PACKAGE/pkg/client" "$ROOT_PACKAGE/pkg/apis" "authentication:v1alpha1 networking:v1alpha3"
Informer 有两个作用:
- 通过 listWatch 机制与 kube api server 同步,更新维护本地缓存;
- 根据增量事件类型触发 event handler;
每经过 resyncPeriod 事件,Informer 维护的本地缓存都会使用最近一次 LIST 返回的结果强制更新一次,从而保证缓存的有效性。
WorkQueue 作用:
- 同步 Informer 和 控制循环之间的数据;
control loop 控制循环:
- 从 WorkQueue 出队一个成员;
- 从本地缓存拿到该成员对应的对象;
- 对比“期望状态”和“实际状态”,做相关操作;
- “期望状态”:APIServer 里保存的,用户提交到 APIServer 里的信息(已经缓存在了本地);
- “实际状态”:集群/业务实际的状态;