Teleport Kubernetes Operator 贡献指南从新增 CRD 到调试的完整实践【免费下载链接】teleportThe easiest, and most secure way to access and protect all of your infrastructure.项目地址: https://gitcode.com/gh_mirrors/tel/teleport本文基于 integrations/operator/CONTRIBUTING.md 展开面向希望为 Teleport Kubernetes Operator 增加新资源类型支持、运行集成测试并调试本地开发环境的开发者。读完本文你将掌握 CRD 生成、scheme 与 reconciler 编写、RBAC 配置的完整流程并能借助 k3d 与远程集群搭建可复现的本地调试环境。Teleport Kubernetes Operator 是一个基于 operator-sdk 的 Kubernetes Operator运行在进程内的 tbot 实例通过 MachineID 加入 Teleport 集群并利用 gRPC 客户端将 Kubernetes 自定义资源CR与 Teleport 资源进行双向调和reconcile。其架构细节可参考 integrations/operator/README.md其中包含完整的调和流程图创建/更新、删除、finalizer、所有权校验、scope 校验等。新增 Teleport 资源支持的完整工作流为 Operator 增加一种新的 Teleport 资源类型核心路径是CRD 生成 → Go 类型定义scheme→ reconciler 实现 → 注册 → RBAC 权限。整个流程中的构建目标集中在 integrations/operator/Makefile 中建议先通读该文件以理解各目标之间的依赖关系。第一步确保现有 CRD 已是最新状态在干净的仓库中、尚未做任何改动之前先运行make generategenerate目标由两部分组成参见 Makefile 中generate: generate-types crdgenerate-types调用controller-gen当前锁定版本为v0.20.0为apis/下的类型生成DeepCopy、DeepCopyInto、DeepCopyObject方法crd依次执行crd-docs与crd-manifests生成 CRD 清单与文档。如果此前用于生成 CRD 的.proto文件发生变化这一步会产生 diff。检查输出是否合理并提交相关变更确保后续工作建立在干净的基础上。第二步生成新的 CRD注册资源类型在 integrations/operator/crdgen/handlerequest.go 的resources列表中将新类型的名称加入generateSchema函数内的资源数组。该文件是整个 CRD 生成器的核心HandleCRDRequest与HandleDocsRequest分别处理 CRD 清单与文档输出generateSchema则遍历resources列表为每个资源调用generator.addResource并最终产出CustomResourceDefinition。列表中每种资源可以携带多个resourceSchemaOption常用选项包括withVersionOverride当类型名中不含版本号时强制指定版本例如LoginRule被显式覆盖为types.V1withNameOverride覆盖 Kubernetes Kind 名称例如ServerV2同时生成OpenSSHServer与OpenSSHEICEServer两个 KindwithAdditionalColumns为kubectl get增加自定义列如UserV2的 Roles 列、ProvisionTokenV2的 Join Method 与 System Roles 列withCustomSpecFields当 proto 消息没有独立spec字段时强制将根级字段纳入 CRD 的 spec如LoginRule的priority、traits_expression、traits_mapwithScope标记资源为 scoped 资源如ServerV2、Bot、AccessList、ScopedToken等withSingletonName单例资源如RetrievalModel使用types.MetaNameRetrievalModellegacyWithoutVersionInKindOverride兼容旧版本Kind 中不携带版本号。添加 proto 文件如果新资源的 proto 文件不在 integrations/operator/Makefile 的PROTOS列表中当前包含 loginrule、accesslist、legacy types、bot、workloadidentity、autoupdate、summarizer、accessmonitoringrules、scopes 等请将其加入。该列表同时驱动crd-manifests与crd-docs两个目标的protoc调用。运行差异检查make crd-manifests-diff该目标会用 crdgen 插件在临时目录重新渲染 CRD再与config/crd/bases目录逐文件diff。预期输出是新 CRD 文件或差异内容并以返回码 1 退出表示存在差异。仔细检查输出只应生成你新增的资源 CRD。如果其他 CRD 也被改动需要查明原因并针对受影响的资源规划额外测试或者撤销非本意修改。生成 CRD 与文档make crdcrd会调用crd-docs输出到docs/pages/reference/infrastructure-as-code/operator-resources/和crd-manifests输出到config/crd/bases并同步拷贝到examples/chart/teleport-cluster/charts/teleport-operator/operator-crds供 Helm chart 使用。再次运行差异检查make crd-manifests-diff此时应始终无差异、无错误退出。第三步创建与 CRD 匹配的 Go 类型scheme在apis/resources/version目录下为新资源添加类型定义。参考该目录下既有类型的写法例如 integrations/operator/apis/resources/v1/groupversion_info.go 与各类*_types.go文件。当前仓库中已有 v1、v2、v3、v5 四个版本目录分别承载不同类型的资源。若当前版本目录尚不存在需新建并必须从既有版本目录复制一份groupversion_info.go将版本号改为正确值不要遗漏//kubebuilder注释如//kubebuilder:object:roottrue、//kubebuilder:subresource:status等这些是 controller-gen 生成 DeepCopy 方法与 CRD 结构的关键标记添加资源后运行make generate生成DeepCopy*方法产物会落到各版本的zz_generated.deepcopy.go中。第四步创建新资源类型的 reconciler在 integrations/operator/controllers/resources 下创建 reconciler。优先复用泛型的TeleportResourceReconciler此时只需为新资源实现 CRUD 方法即可无需编写完整调和循环。泛型 reconciler 的底层实现在 integrations/operator/controllers/reconcilers/generic.goresourceClient[T]接口定义了Get、Create、Update、Delete四个 CRUD 方法实现该接口即可接入通用调和流程可选实现resourceMutator[T]接口Mutate(ctx, new, existing, crKey)在创建前或基于现有资源更新前对资源做修改Reconcile方法实现标准流程读取 CR → 检查teleport.dev/ignore注解 → 删除事件走 finalizerresources.teleport.dev/deletion→ 添加 finalizer → 调用Upsert调和Upsert内部会执行结构校验、scope 校验checkScope、所有权校验checkOwnership基于kubernetesOrigin 标签与 operator ID 标签并通过status.conditions报告每一步的结果Delete会先校验 scope 与所有权仅删除确由本 operator 管理的资源避免误删其他来源的资源。编写单元测试时尽量使用测试库 integrations/operator/controllers/resources/testlib 中提供的泛型测试辅助函数获取基线覆盖ResourceCreationTest验证资源创建路径ResourceDeletionDriftTest验证删除与漂移场景ResourceUpdateTest验证更新路径。此外在controllers/resources/testlib/env.go的defaultTeleportServiceConfig函数中为默认的 Teleport 角色补充新资源所需的权限该函数构建测试用 Teleport 实例并为其配置 operator 角色。第五步注册 reconciler 与 scheme在 integrations/operator/controllers/resources/setup.go 中实例化你的 controller并加入supportedReconcilers列表一个ReconcilerFactory切片每个工厂函数接收 Kube client、Teleport client 与OperatorMetadata仿照既有资源调用 reconciler 的SetupWithManager(mgr)方法将控制器注册到 controller-runtime manager。SetupAllControllers在启动时会通过filterEnabledReconcilers对每个候选 reconciler 做三重过滤CRD 是否已部署通过 Discovery API 查询gvkCache做了按 GroupVersion 的惰性缓存支持新版 operator 运行在旧 CRD 集群上的场景scoped 模式operator 处于 scoped 模式时跳过非 scoped 的 reconciler集群特性通过CheckFeatures检查 Teleport 集群广播的特性如 OSS 集群上不启动企业版资源的 reconciler。若新增了apis/resources/下的新版本目录还需要确保该版本的 scheme 被注册到根scheme在init()函数中调用类似resourcesvX.AddToScheme(scheme)的代码。第六步为新资源类型添加 RBAC 权限Operator 需要同时具备 Kubernetes 侧与 Teleport 侧的访问权限需修改三处Kubernetes RBACexamples/chart/teleport-cluster/charts/teleport-operator/templates/role.yaml —— 授予 operator 访问新 Kubernetes 资源的权限Teleport RBACexamples/chart/teleport-cluster/templates/auth/config.yaml —— 授予 operator 访问对应 Teleport 资源的权限调试角色integrations/operator/hack/fixture-operator-role.yaml —— 更新调试用 operator 角色的权限。调试角色是后续本地调试的基础fixture-operator-role.yaml定义名为operator的 Teleport 角色允许对role、user、auth_connector、lock、token、access_list、node、trusted_cluster、bot、workload_identity、app、db等资源执行增删改查integrations/operator/hack/fixture-operator-bot.yaml 则创建bot-operator角色与用户通过impersonate.roles: [operator]让 bot 以 operator 身份工作这是 MachineID bot 的典型最小权限模式。测试策略使用 k3d 与已发布 Teleport 镜像快速测试前提条件已安装 k3dDocker 处于运行状态。操作步骤# 创建 k3d 集群 k3d cluster create k3s-default # 构建 operator 并部署整套环境 make k3d-deploymake k3d-deploy的默认行为见 integrations/operator/Makefile默认使用已发布的镜像TELEPORT_IMAGE_DEFAULT : public.ecr.aws/gravitational/teleport-distroless与TELEPORT_IMAGE_VERSION ? 18.8.1构建 operator 镜像后通过k3d image import导入集群用 Helm 在test命名空间部署teleport-clusterchartoperator.enabledtrue、clusterNametest设置TELEPORT_UNSTABLE_SCOPESyes环境变量启用 scoped 资源支持可以通过追加--set extraEnv[N].name...的方式注入额外的特性开关。使用本地 Teleport 构建测试当需要验证未发布功能或 feature-flag 变更时通过覆盖TELEPORT_IMAGE与TELEPORT_IMAGE_VERSION切换到本地构建。Makefile 会自动检测当TELEPORT_IMAGE与默认 registry 镜像不同时即视为本地构建并将本地镜像导入 k3d。构建 Teleport 镜像在仓库根目录执行会在 Docker buildbox 内编译全部二进制并产出本地镜像# 仓库根目录 make image产物形如teleport:19.0.0-dev-arm64架构后缀随本机GOARCH变化。如果本地存在e/目录企业版代码部署 Teleport Pod 时通常还需要附带 license。本地镜像构建排障构建缓存异常时执行docker builder prune -af清理缓存buildbox 过期如 Go/Rust 版本不匹配时先重建 buildboxmake -C build.assets buildbox-centos7确保e的 ref 是最新的OSS 中已移除的内容可能在e/中仍有引用遇到 Rust 相关问题可执行rustup override unset或运行make ensure-wasm-bindgen FORCEtrue。创建 k3d 集群若尚未创建k3d cluster create k3s-default使用本地镜像部署企业版构建需先创建 license secretexport KUBECONFIG$(k3d kubeconfig write k3s-default) kubectl create namespace test kubectl -n test create secret generic license \ --from-filelicense.pemyour-path-to-license-file然后执行部署注意在integrations/operator目录下运行cd integrations/operator # 企业版本地构建同时设置 ENTERPRISE1 make k3d-deploy \ ENTERPRISE1 \ TELEPORT_IMAGEteleport \ TELEPORT_IMAGE_VERSION19.0.0-dev-arm64设置ENTERPRISE1后部署流程会额外把 license secret 注入test命名空间并在 Helm 中开启enterprisetrue与enterpriseImage。调试技巧在单元测试中调试设置环境变量OPERATOR_TEST_TELEPORT_ADDR后controller 测试将不再创建临时 Teleport 实例而是连接一个真实运行中的 Teleport 集群。测试使用本地tsh凭据进行认证因此请确保当前登录用户具备足够权限测试中的 operator 会以该用户身份对资源执行 CRUD。针对远程 Kubernetes 与 Teleport 集群调试Operator 天然支持同时对接远程的 Kubernetes 集群与 Teleport 集群。你需要一个已安装 CRD 的 Kubernetes 集群一个 Teleport 集群。搭建步骤部署 CRD若集群中尚未安装 CRD通过 Helm 安装--set enabledfalse表示不部署 operator 本身仅安装 CRDhelm install crds ../../examples/chart/teleport-cluster/charts/teleport-operator/ --set enabledfalse --set installCRDsalways代理 Kube API参照 kube-agent-updater 的 DEBUG 指南以你自己身份打开通往 Kube API 的代理即让 operator 进程以你的身份鉴权访问 Kube API。创建 Teleport operator 角色tctl create -f ./hack/fixture-operator-role.yaml即 integrations/operator/hack/fixture-operator-role.yaml该角色授予 operator 对各类 Teleport 资源的管理权限。创建 Teleport bot 角色与用户tctl create -f ./hack/fixture-operator-bot.yaml即 integrations/operator/hack/fixture-operator-bot.yaml内含bot-operator角色与用户角色通过impersonate获得operator角色的权限并只读访问cert_authority。创建 Teleport bot tokentctl create -f ./hack/fixture-operator-token.yaml警告该静态 token 在首次使用后即被消耗。若重启 operator必须重新创建 token并删除 bot 用户上的证书生成标签。此 join 方式仅适用于开发调试严禁在生产环境使用。运行 operator例如make build ./bin/manager \ -join-method token \ -token operator-token \ -auth-server TELEPORT_ADDR \ -kubeconfig PATH_TO_TEMP_KUBECONFIG \ -namespace NAMESPACE_WHERE_CRS_ARE其中make build由 integrations/operator/Makefile 定义会先执行generate再用go build -trimpath产出bin/manager二进制编译入口为 integrations/operator/main.gooperator 启动时先初始化日志再绑定operatorConfig与embeddedtbot.BotConfig的命令行参数-join-method token与-token operator-token指定 operator bot 的 join 方式仅限调试的静态 token-auth-server指向 Teleport 集群地址-kubeconfig指向临时 Kubeconfig即第 2 步代理生成的凭证文件-namespace指定 CR 所在的命名空间。至此一次完整的新增资源 → 生成 CRD → 实现 reconciler → 注册 → 配权限 → 测试 → 调试的 Operator 开发闭环即可跑通。理解 controllers/reconcilers/generic.go 中的泛型调和循环finalizer 管理、所有权与 scope 校验、状态上报是后续为任意新资源类型编写 controller 的关键基础。【免费下载链接】teleportThe easiest, and most secure way to access and protect all of your infrastructure.项目地址: https://gitcode.com/gh_mirrors/tel/teleport创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
武大研究生数理统计期末复盘:核心知识模块与备考避坑指南 武汉大学研究生阶段的数理统计,算得上理工科和不少文社科专业研究生的必修硬课。2021-2022学年这门课的期末考试,覆盖范围广、题型稳定但也暗藏陷阱,很多学弟学妹考完直呼“平时听课都懂,一上考场就懵”。我复盘了这份试卷的考查脉… · 2026/9/20 23:10:01
CTF实战:如何精准判断Vigenère密钥长度并自动化解密 CTF圈里做过古典密码题的,基本绕不开 Vigenre 这个坎。攻防世界(XCTF 免费题库)里这道 “how_many_Vigenre” 乍看是个入门级的维吉尼亚密码题,但真正上手之后你会发现,它考的不是“会不会用工具解 Vigenre”ÿ… · 2026/9/20 23:09:01
RK3588上编译eglinfo:Mali GPU调试与Meson构建避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:10:45
2026年开发者必备的7个Claude Code技能解析 1. 2026年开发者必备的7个Claude Code技能解析作为一名长期使用AI辅助编程的开发者,我深刻理解在项目初期与AI协作时的痛点。每次新项目启动,我们都要重复解释技术栈、架构设计和编码规范,而Claude往往在几次对话后就忘记了这些关键信息。这种… · 2026/9/21 2:10:45
通达信量价共振选股指标源码解析与实战应用 简介:通达信平台的自用选股指标公式源码文档,面向有一定技术分析基础的股票投资者,用于快速筛选满足多重条件的高潜力个股。文档完整呈现胜率宣称80%以上的选股公式,涵盖20日均线、加权平均价、5日指数移动平均、60日高点回撤位及… · 2026/9/21 2:10:45
拆解Caffeine源码:BoundedLocalCache如何用环形缓冲与双端队列实现高并发 拆解Caffeine源码:BoundedLocalCache如何用环形缓冲与双端队列实现高并发 【免费下载链接】caffeine A high performance caching library for Java 项目地址: https://gitcode.com/gh_mirrors/ca/caffeine
Caffeine 是 Java 生态中性能最强的高性能缓存库之… · 2026/9/21 2:10:45
Watch Your Step 图注意力嵌入模型:论文复现、环境搭建与源码级参数解析 人工智能深度学习NLP计算机视觉强化学习 【免费下载链接】google-research Google Research 项目地址: https://gitcode.com/gh_mirrors/go/google-research 点击查看 免费下载 导读
本文围绕 Google Research 开源仓库中 graph_embedding/watch_your_step 目录下… · 2026/9/21 2:10:45
OpenClaw实战:AI代理部署与Skills开发全指南 最近一个月,OpenClaw(社区里也叫Clawdbot)的热度有点猛,技术群、自动化圈子、甚至一些做私域运营的朋友都在讨论它。我抽空把计算巢一键部署、云服务器Docker跑、本地WSL2三套方案都实测了一遍,还把Skills集成和开发流… · 2026/9/21 2:09:45
Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化 直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡… · 2026/9/21 0:02:39
Word表格编号全攻略:从列表编号到题注交叉引用 写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技… · 2026/9/21 0:02:39
从第一个站到第二个站:独立开发者的静态网站选型与落地实践 1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&… · 2026/9/20 0:00:41
agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and … · 2026/9/21 0:00:18
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,… · 2026/9/21 0:00:18