优化建议
Closed this issue · 11 comments
请问可以实现该APIserver通过informer机制作为真实APIserver的只读服务吗
感谢回复,场景是这样的:
目前我们碰到一个集群某些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
辛苦大佬帮忙指导~
感谢回复,场景是这样的: 目前我们碰到一个集群某些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 缓存代理吧。今天尝试写了写,这几点复杂些,你看看是不是
- mtls,客户端一般会使用 cluster CA 鉴别 apiserver 身份,所以 apiserver-proxy 需要使用 kube-apiserver 的 server cert 启动 (这意味着该 cert 需要包含 apiserver-proxy serve 的 IP 和域名 )
- 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 即可
- watch 麻烦些
- pod log/exec 之类的麻烦些
- 写请求直接穿透即可,先 invalidate 掉缓存即可
- auth 可以考虑用 impersonation
总体蛮有意思的,我这两天会提个 PR 上来,到时候可以一起看看 🧑💻
感谢,感谢🙏
有没有可能加一个简单的authz/authn功能?
有没有可能加一个简单的authz/authn功能?
具体是指?目前
authn
- authn client-CA,从客户端 x509 证书获取用户信息
- authn TokenReview,即 serviceaccount token,会委托给 kube-apiserver 处理
- authn requestheader, kube-aggregator 代理的请求,从 request headers 获取用户信息
authz
- SubjectAccessReview, 委托给 kube-apiserver 处理
先说下使用场景,因为种种原因无法在原集群上注册 CRD,所以自己实现了 APIServer,又不能通过 SubjectAcessReview
的方式来完成鉴权。
我的想法就是仿照 DefaultBuildHandlerChain
中认证授权部分的拦截器,比如 WithAuthentication
的部分,实现一个 Basic auth 就能完成的简单认证鉴权的拦截器(如果使用默认的 basic auth 或 sa的认证还得完成一部分 legcay api)
非常感谢@phosae大佬提供的解决方案,目前主体功能可以正常运行~