体验过chatgpt,豆包,Qwen,和Gemini的深度研究之后,个人感觉Gemini是最好的。 首先会生成研究方向,搜索关键字,然后可能是通过tool call的方式抓取相关内容,生成的结果可以用来创建到Web Page(可交互),Infographic,Quiz和音频。
当 kube-apiserver 处理 LIST 请求时,它会一次性将数据序列化为 JSON 或 Protobuf 格式,然后交由底层的 Go/http 处理。根据标准的 encoding/json 库实现,kube-apiserver 需要分配一大块内存来存放完整的序列化结果。更严重的是,这块内存要等到数据的最后一个字节被传输完毕后才会释放,容易导致高峰时的内存占用激增。
解决这个问题的关键在于引入 流式处理 来序列化数据。KEP-5116 根据 LIST 响应的结构特点,可以依次序列化 TypeMeta、ListMeta,然后逐项序列化 Items,避免一次性分配和持有大块内存,从而降低内存占用。
Streaming JSON/Protobuf in Kubernetes
k8s 中 prometheus的 token 是如何访问经过认证的kube-controller-manager的/metrics的?
答案是:证书验证(TLS)和Token授权(RBAC)是两个独立但连续的步骤。kube-controller-manager自己处理TLS握手,但会将授权决策委托给kube-apiserver。
认证 (Authentication) - 使用 TokenReview:
kube-controller-manager接收到Token后,它会创建一个TokenReview对象。这个对象包含了它从Prometheus收到的原始Token。 它向kube-apiserver的/apis/authentication.k8s.io/v1/tokenreviews端点发起一个请求,内容就是这个TokenReview对象。 kube-apiserver收到请求后,会验证这个Token的签名和有效性。如果Token有效,kube-apiserver会在TokenReview对象的状态(status)字段中填充该Token对应的用户信息(用户名、UID、所属组等),并返回给kube-controller-manager。 现在,kube-controller-manager知道了这个请求的发起者是谁(例如,system:serviceaccount:monitoring:prometheus-k8s)。 授权 (Authorization) - 使用 SubjectAccessReview:
在知道了请求者的身份后,kube-controller-manager需要确认这个身份是否有权限执行请求的操作(即对/metrics路径进行GET操作)。 它会创建一个SubjectAccessReview对象。这个对象里包含了上一步获取到的用户信息以及本次请求试图执行的操作(verb: "get", nonResourceURL: "/metrics")。 它向kube-apiserver的/apis/authorization.k8s.io/v1/subjectaccessreviews端点发起请求。 kube-apiserver收到请求后,会查询集群中所有的RBAC规则(Role, ClusterRole, RoleBinding, ClusterRoleBinding),判断这个用户是否有权限执行该操作。 kube-apiserver将检查结果(允许或拒绝)填充到SubjectAccessReview对象的状态字段中,并返回给kube-controller-manager。 最终决策:
kube-controller-manager收到SubjectAccessReview的响应后,如果结果是“允许”,它就会向Prometheus返回/metrics的数据。 如果结果是“拒绝”,它会向Prometheus返回403 Forbidden错误。 这保证了整个集群的认证授权策略是统一和集中的,避免了每个组件各自为政带来的安全风险和管理复杂性。
k8s 为什么要设计service/proxy的子资源?
AI生成了4个理由,我觉得唯一有点说服力的也就第三条。
...