尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Vector `kubernetes_logs` 迁移至 kube-rs:Kubernetes API 集成重构与 RBAC 变更

Vector `kubernetes_logs` 迁移至 kube-rs:Kubernetes API 集成重构与 RBAC 变更 Vectorkubernetes_logs迁移至 kube-rsKubernetes API 集成重构与 RBAC 变更【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector本篇技术文章解析 Vector0.21.0版本中kubernetes_logs数据源的一次关键重构底层 Kubernetes API 集成从自研代码切换为 CNCF Sandbox 项目kube-rs库。读完本文你将理解这次迁移对 RBAC 权限ClusterRole 需要新增listverb与代理配置proxy全局选项不再作用于该源带来的两处用户可见变更并能结合当前仓库源码验证 kube-rs 在 reflector、watcher 与元数据缓存中的实际用法。迁移背景为什么选择 kube-rsVector 的kubernetes_logs源运行在集群内的 DaemonSet 中负责消费 kubelet 在各 Node 上/var/log/pods目录保留的 Pod 日志文件见 src/sources/kubernetes_logs/mod.rs 开头的模块说明。为了让每条日志都能附带 Pod、Namespace、Node 的元数据该源必须持续与 Kubernetes API 交互。Vector 团队将该集成的基础替换为kube-rs——一个 CNCF Sandbox 项目也是许多 Kubernetes API 客户端应用的基础。迁移的核心动机有两条提升可靠性与稳定性复用社区经过验证的 Kubernetes 客户端实现减少自研集成中的边界问题跟踪 Kubernetes API 的演进由 kube-rs 库负责跟随 API 版本变化保证 Vector 与 Kubernetes API 的长期兼容性。在当前仓库中可以直接确认这一依赖Cargo.toml 声明了kube { version 3.0.1, default-features false, features [client, openssl-tls, runtime], optional true }启用的client、openssl-tls与runtime三个 feature 分别对应 API 客户端、TLS 传输与 reflector/watcher 运行时组件与下文源码分析完全吻合。变更一ClusterRole 必须授予listverb这次更新对用户的第一个可见影响是Vector 在集群中的 ClusterRole 现在需要listverb 权限。原因在于 kube-rs 的 reflector 机制——它在初始化时会先对资源执行一次完整的list把现存对象全量拉取进本地 store随后切换到watch增量接收变更没有list权限reflector 无法完成初始同步。仓库内由 Helm 模板生成的 Kustomize 清单 distribution/kubernetes/vector-agent/rbac.yaml 展示了当前形态apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: vector rules: - apiGroups: - resources: - namespaces - nodes - pods verbs: - list - watch官方要求的最小集是pods与namespaces资源同时具备list和watch两个 verb。从源码结构看当前清单还包含了nodes——这是因为后续版本为该源增加了 Node 级别的元数据标注见 src/sources/kubernetes_logs/node_metadata_annotator.rs如果你的集群要启用完整的节点标注能力建议与仓库清单保持一致。各部署通道的落地版本如下以原文档发布说明为准vector Helm chart自0.7.0起已包含新的listverb本仓库的 Kustomize 清单distribution/kubernetes/下随 Vector0.21.0发布更新make generate-kubernetes-manifests可重新生成自行管理清单的用户需要手动确认 Vector 使用的 ClusterRole 对pods和namespaces同时授予list与watch。reflector 的运行逻辑可以在 src/kubernetes/reflector.rs 中验证custom_reflector函数消费kube::runtime::watcher()产生的事件流对InitApply/Apply事件立即写入本地 store而对Delete事件通过DelayQueue延迟应用——这是为了防止 Pod 刚删除时日志文件尚未读完导致元数据过早丢失也是 kube-rs 事件模型之上的一层工程化封装。变更二proxy全局选项不再用于 API 客户端第二个用户可见变更是全局配置中的proxy选项不再作用于kubernetes_logs源构建的 Kubernetes API 客户端。过去该源会通过proxy选项让 API 请求经由内部代理转发迁移到 kube-rs 后客户端配置交由 kube-rs 自身的 config 机制管理。如果你的环境需要通过内部代理访问 Kubernetes API官方给出的做法是通过自定义kubeconfig来配置例如在 kubeconfig 中指向代理端点而不是继续依赖已失效的proxy选项。从源码结构看这一行为对应 src/sources/kubernetes_logs/mod.rs 顶部引入的kube::config::{self, KubeConfigOptions}——客户端由 kube-rs 的ClientConfig构建不再经过 Vector 全局proxy的 HTTP 代理路径。实现细节kube-rs 在源码中的落点为便于检索和验证这里汇总 kube-rs 与kubernetes_logs集成的关键代码位置位置作用src/sources/kubernetes_logs/mod.rs源配置与build逻辑引入kube::{Client, Config, api::Api}及runtime::{reflector, watcher}src/kubernetes/reflector.rs封装 kube 的watcher事件流延迟处理删除事件避免元数据提前失效src/kubernetes/meta_cache.rs基于kube::core::ObjectMeta的对象缓存跟踪 (name, namespace) 的存在性src/sources/kubernetes_logs/pod_metadata_annotator.rs基于 Pod 元数据缓存为日志事件补充 Pod 字段src/sources/kubernetes_logs/namespace_metadata_annotator.rs为日志事件补充 Namespace 字段可用insert_namespace_fields关闭以降低 apiserver 负载distribution/kubernetes/vector-agent/rbac.yaml当前推荐的 ClusterRole 清单listwatch元数据标注的可靠性由MetaCache保证其存储、删除与存在性检查语义在 src/kubernetes/meta_cache.rs 中配有完整的单元测试cache_should_store_data、cache_should_delete_data、cache_should_check_active可作为理解 kube-rsObjectMeta与 Vector 缓存交互方式的参考。升级检查清单如果你正在从 Vector0.21.0之前的版本升级且kubernetes_logs源已在生产环境运行建议按以下顺序核对确认 Vector 使用的 ServiceAccount 对应 ClusterRole 已包含listwatch资源至少覆盖pods与namespaces如果 API 访问依赖代理将代理配置迁移到自定义kubeconfig中并移除对该源proxy选项的依赖使用 Helm 部署的用户升级到0.7.0以上的 vector chart使用仓库 Kustomize 清单的用户直接采用0.21.0及以上版本的distribution/kubernetes/清单两者都已内置新权限。完成以上核对后kubernetes_logs源即可基于 kube-rs 提供的 reflector/watcher 机制稳定运行并获得跟随 Kubernetes API 演进的长期兼容性保障。【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表