概念

聚合APIServer以下简称为AA

操作etcd的代码在k8s.io\apiserver\pkg\storage\etcd3\store.go中,而不是在生成的代码中。。。。。
使用Aggregated APIServer的方式构建自己的API Service源码分析 - 图1

选择请求:
image.png

一切都从webservice中来:
image.png

报404:
image.png
namespace资源为true,cluster资源为false

image.png
此时就正常了:
image.png
expected pointer, but got invalid kind

  1. "{\"kind\":\"Status\",\"apiVersion\":\"v1\",\"metadata\":{},\"status\":\"Failure\",\"message\":\"expected pointer, but got invalid kind\",\"code\":500}\n"

image.png
这是因为create返回值必须实现runtime.Object接口,直接返回nil会导致上面的错误。返回入参中的结构体即可。

  1. func (m *MiddlewareServerStorage) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) {
  2. reNode := obj.(*v1alpha1.RemoveNode)
  3. klog.Infof("create removeNode: %+v, namespace: %v", reNode, reNode.Namespace)
  4. return reNode, nil
  5. }

请求过滤

AA使用

metrics-server的readyz接口探针报403,报错没权限。但healthz接口不报错,middleware-server也一样:
image.png
image.png
难道readyz和healthz接口的授权方式不一样?其实APIServer也一样:v1.13.2集群测试
image.png
但在v1.17.3集群测试时ok的:
image.png
说明APIServer在升级过程中修改过readyz授权这块。

但是middleware-server在重构代码之前(也就是在生成代码的基础上修改后的版本readyz是可以的),按照metrics-server、ippool-server重构过之后就出这个问题。
image.png
image.png
是这个参数导致的,之前在启动参数里置为了false,所以不报错。
image.png
代码生成框架apiserver-builder-alpha专门加了这个参数用来去认证授权的。