phosae/x-kubernetes

优化建议

Closed this issue · 11 comments

请问可以实现该APIserver通过informer机制作为真实APIserver的只读服务吗

phosae commented

请问可以实现该APIserver通过informer机制作为真实APIserver的只读服务吗

没太看懂意思,可以展开讲讲吗

可以来个 mermaid 流程图

感谢回复,场景是这样的:
目前我们碰到一个集群某些workload的pods非常多,查询时会造成APIServer压力很大,虽然我们已经加上resourceVersion=0,但还是会有卡顿的情况(k8s集群是云厂商托管的),因此我们想在中间加一层只读的APIServer,暂时命名为CustomAPIServer。
CustomAPIServer 通过informer机制与k8s集群进行数据同步,这样既可以支持client-go或kubectl查询k8s APIServer的请求,也降低了k8s APIServer的压力,CustomAPIServer也可以分摊很大的读压力,并且可以自定义的进行横向扩容。
大致的调用流程如下:
client-go/kubectl --> x-kubernetes --> k8s APIServer

辛苦大佬帮忙指导~

phosae commented

感谢回复,场景是这样的: 目前我们碰到一个集群某些workload的pods非常多,查询时会造成APIServer压力很大,虽然我们已经加上resourceVersion=0,但还是会有卡顿的情况(k8s集群是云厂商托管的),因此我们想在中间加一层只读的APIServer,暂时命名为CustomAPIServer。 CustomAPIServer 通过informer机制与k8s集群进行数据同步,这样既可以支持client-go或kubectl查询k8s APIServer的请求,也降低了k8s APIServer的压力,CustomAPIServer也可以分摊很大的读压力,并且可以自定义的进行横向扩容。 大致的调用流程如下: client-go/kubectl --> x-kubernetes --> k8s APIServer

辛苦大佬帮忙指导~

其实是要实现 apiserver 缓存代理吧。今天尝试写了写,这几点复杂些,你看看是不是

  1. mtls,客户端一般会使用 cluster CA 鉴别 apiserver 身份,所以 apiserver-proxy 需要使用 kube-apiserver 的 server cert 启动 (这意味着该 cert 需要包含 apiserver-proxy serve 的 IP 和域名 )
  2. authn,client-go 一般走 in cluster config,就是 token 认证,这个通过 token review 委托给 kube-apiserver 处理,然后缓存 auth 结果即可。麻烦的在于 kubectl 一般用 x509 cert 认证,这个不能委托 kube-apiserver 处理。3rd-apiserver 需要使用 cluster CA 鉴别 kubectl 的客户端证书,做完 authn 之后,走 front proxy 协议请求 kube-apiserver 即可
  3. watch 麻烦些
  4. pod log/exec 之类的麻烦些
  5. 写请求直接穿透即可,先 invalidate 掉缓存即可
  6. auth 可以考虑用 impersonation

总体蛮有意思的,我这两天会提个 PR 上来,到时候可以一起看看 🧑‍💻

感谢,感谢🙏

phosae commented

@jacky68147527

写了一个基本可用的实现 #3

使用姿势啥的都写在 README

可以看看一下

yeahx commented

有没有可能加一个简单的authz/authn功能?

phosae commented

有没有可能加一个简单的authz/authn功能?

具体是指?目前
authn

  • authn client-CA,从客户端 x509 证书获取用户信息
  • authn TokenReview,即 serviceaccount token,会委托给 kube-apiserver 处理
  • authn requestheader, kube-aggregator 代理的请求,从 request headers 获取用户信息

authz

  • SubjectAccessReview, 委托给 kube-apiserver 处理
yeahx commented

先说下使用场景,因为种种原因无法在原集群上注册 CRD,所以自己实现了 APIServer,又不能通过 SubjectAcessReview 的方式来完成鉴权。

我的想法就是仿照 DefaultBuildHandlerChain 中认证授权部分的拦截器,比如 WithAuthentication 的部分,实现一个 Basic auth 就能完成的简单认证鉴权的拦截器(如果使用默认的 basic auth 或 sa的认证还得完成一部分 legcay api)

phosae commented

看起来是缺 authz
在你们的 APIServer 里面实现一个 ABAC 是不是就行?
这样 authn 还是可以走 TokenReview 复用 kube-apiserver 的用户

ABAC实现代码 非常简单,很好移植

非常感谢@phosae大佬提供的解决方案,目前主体功能可以正常运行~

phosae commented

非常感谢@phosae大佬提供的解决方案,目前主体功能可以正常运行~

客气哈,我也有所收获
后续可以 PR 一起改进 👻