Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

优化建议 #2

Closed
jacky68147527 opened this issue Jul 24, 2023 · 11 comments
Closed

优化建议 #2

jacky68147527 opened this issue Jul 24, 2023 · 11 comments

Comments

@jacky68147527
Copy link

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

@phosae
Copy link
Owner

phosae commented Jul 24, 2023

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

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

可以来个 mermaid 流程图

@jacky68147527
Copy link
Author

jacky68147527 commented Jul 24, 2023

感谢回复,场景是这样的:
目前我们碰到一个集群某些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
Copy link
Owner

phosae commented Jul 25, 2023

感谢回复,场景是这样的: 目前我们碰到一个集群某些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 上来,到时候可以一起看看 🧑‍💻

@jacky68147527
Copy link
Author

感谢,感谢🙏

@phosae
Copy link
Owner

phosae commented Jul 29, 2023

@jacky68147527

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

使用姿势啥的都写在 README

可以看看一下

@yeahx
Copy link

yeahx commented Aug 1, 2023

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

@phosae
Copy link
Owner

phosae commented Aug 1, 2023

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

具体是指?目前
authn

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

authz

  • SubjectAccessReview, 委托给 kube-apiserver 处理

@yeahx
Copy link

yeahx commented Aug 1, 2023

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

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

@phosae
Copy link
Owner

phosae commented Aug 1, 2023

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

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

@phosae phosae closed this as completed Aug 4, 2023
@jacky68147527
Copy link
Author

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

@phosae
Copy link
Owner

phosae commented Aug 7, 2023

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants