完全指南:从注册原理到生产配置)
云原生CI/CDDevOps后端【免费下载链接】pipelineA cloud-native Pipeline resource.项目地址https://gitcode.com/gh_mirrors/pipelin/pipeline点击查看免费下载tektoncd/pipeline本项目 pipeline随发行版内置了多个控制器二进制controller、webhook、events、resolvers每个二进制都暴露了一组可通过yaml部署清单修改的启动参数flags与环境变量用于支撑多租户、高可用、资源限制等高级场景。本文以 docs/tekton-controller-flags.md 为骨架结合仓库内四个二进制的main()源码与真实部署清单完整梳理每个控制器支持的 flags、各参数的含义与默认值、THREADS_PER_CONTROLLER与K_THREADS_PER_CONTROLLER的区别以及如何在生产环境中修改这些参数。Flag 可用性总览并非所有 flag 在每个控制器上都可用。这些 flag 大致分为两类一类来自knative/pkg与klog由注入框架统一注册因此所有控制器都支持另一类由 Tekton 自己注册在各自的main()中可用性因控制器而异取决于该二进制是调用sharedmain.MainWithContext()还是在main()中直接注册 flag。来自knative/pkg的通用 flags所有控制器可用以下 flags 由injection.ParseAndGetRESTConfigOrDie()和klog注册在controller、webhook、events、resolvers四个二进制上全部可用Flag说明-cluster默认使用 kubeconfig 中的当前集群。-serverKubernetes API Server 地址会覆盖 kubeconfig 中的任何值仅集群外运行时需要。-kubeconfigkubeconfig 文件路径仅集群外运行时需要。-kube-api-burst客户端节流throttle的最大突发值。-kube-api-qps客户端到 API Server 的最大 QPS。-v日志级别详细度verbosity数值。-vmodule逗号分隔的patternN列表用于按文件过滤日志级别。-add_dir_header为 true 时在日志消息头部追加文件目录。-alsologtostderr同时输出日志到标准错误和文件-logtostderrtrue时无效果。-log_backtrace_at当日志命中file:N行时输出堆栈跟踪。-log_dir非空时将日志文件写入该目录-logtostderrtrue时无效果。-log_file非空时使用该日志文件-logtostderrtrue时无效果。-log_file_max_size单个日志文件的最大大小单位 MB默认 18000 表示不限-logtostderrtrue时无效果。-logtostderr输出日志到标准错误而不是文件默认 true。-one_output为 true 时仅将日志写到其原生日志级别-logtostderrtrue时无效果。-skip_headers为 true 时日志消息不加头部前缀。-skip_log_headers为 true 时打开日志文件时省略头部-logtostderrtrue时无效果。-stderrthreshold达到或超过该阈值的日志输出到 stderr默认 2-logtostderrtrue或-alsologtostderrfalse时无效果。随控制器变化的 flags 与环境变量下列 flags 和环境变量并非所有控制器都可用其可用性取决于该控制器是否调用sharedmain.MainWithContext()它会注册--disable-ha并读取K_THREADS_PER_CONTROLLER还是在自己的main()中直接注册 flagsFlag / 环境变量来源controllerwebhookeventsresolvers--disable-hasharedmain/ Tekton✔✔✔✘--threads-per-controllerTekton✔✘✘✔--namespaceTekton✔✘✘✘--resync-periodTekton✔✘✘✘THREADS_PER_CONTROLLER环境变量Tekton✔✘✘✔K_THREADS_PER_CONTROLLER环境变量sharedmain✘✔✔✘注意controller和resolvers在自己的代码中、解析 flags 之前读取不带K_前缀的THREADS_PER_CONTROLLER环境变量而webhook和events通过sharedmain.MainWithContext()读取带K_前缀的K_THREADS_PER_CONTROLLER。两个环境变量设置的是同一个底层值controller.DefaultThreadsPerController区别仅在于变量名不同。controller主控制器二进制主控制器二进制cmd/controller/main.go拥有额外的 flags 来配置自身行为。完整的 flag 清单如下-disable-ha Whether to disable high-availability functionality for this component. This flag will be deprecated and removed when we have promoted this feature to stable, so do not pass it without filing an issue upstream! -entrypoint-image string The container image containing our entrypoint binary. -namespace string Namespace to restrict informer to. Optional, defaults to all namespaces. -nop-image string The container image used to stop sidecars -resync-period duration The period between two resync run (going through all objects) (default 10h0m0s) -shell-image string The container image containing a shell -shell-image-win string The container image containing a windows shell -sidecarlogresults-image string The container image containing the binary for accessing results. -threads-per-controller int Threads (goroutines) to create per controller (default 2) -workingdirinit-image string The container image containing our working dir init binary.环境变量THREADS_PER_CONTROLLER源码中的注册顺序与底层逻辑从 cmd/controller/main.go 可以看到这些 flag 的注册顺序理解它有助于规避配置陷阱先读环境变量再注册 flagmain()首先执行os.LookupEnv(THREADS_PER_CONTROLLER)若存在则用strconv.Atoi解析并写入controller.DefaultThreadsPerController解析失败会直接log.Fatalf随后才执行flag.IntVar(..., threads-per-controller, controller.DefaultThreadsPerController, ...)把当前值作为该 flag 的默认值。这意味着环境变量与 flag 同时设置时flag 会覆盖环境变量因为 flag 解析发生在之后。--namespace只影响 informer 范围namespace : flag.String(namespace, corev1.NamespaceAll, ...)默认为所有命名空间。该值随后通过injection.WithNamespaceScope(signals.NewContext(), *namespace)注入上下文将 informer 的监听范围限制到指定命名空间——这是多租户隔离部署的核心开关。--disable-ha是过渡性参数flag.Bool(disable-ha, false, ...)帮助文本明确警告该参数会在 HA 特性推进到 stable 后被移除使用时需先在 upstream 提 issue。QPS/Burst 自动翻倍cfg.QPS 2 * cfg.QPS; cfg.Burst 2 * cfg.Burst注释FIXME(vdemeester)说明这是为了适配当前行为按所创建控制器数量翻倍。镜像类 flags 与Images.Validate()controller的 6 个镜像 flags-entrypoint-image、-sidecarlogresults-image、-nop-image、-shell-image、-shell-image-win、-workingdirinit-image被写入pipeline.Options.Images。在 pkg/apis/pipeline/images.go 中Images.Validate()会对这 6 个字段逐一检查若任一为空则返回found unset image flags: [...]错误并log.Fatal退出——所以主控制器启动时这 6 个镜像 flags必须全部提供。部署清单中的真实用法在官方部署清单 config/controller.yaml 中这些镜像 flags 以args的形式注入ko resolve会按 digest 替换镜像引用containers: - name: tekton-pipelines-controller image: ko://github.com/tektoncd/pipeline/cmd/controller args: [ -entrypoint-image, ko://github.com/tektoncd/pipeline/cmd/entrypoint, -nop-image, ko://github.com/tektoncd/pipeline/cmd/nop, -sidecarlogresults-image, ko://github.com/tektoncd/pipeline/cmd/sidecarlogresults, -workingdirinit-image, ko://github.com/tektoncd/pipeline/cmd/workingdirinit, -shell-image, cgr.dev/chainguard/busyboxsha256:19f0..., -shell-image-win, mcr.microsoft.com/powershell:nanoserversha256:b6d5..., ]注意其中的细节shell 镜像必须允许 root 以便创建目录并向 PVC 拷贝文件Windows 脚本模式需要 powershell 镜像镜像引用不带 tag 而用 digest以兼容 cri-o 等运行时。webhook准入 Webhook 二进制Webhook 二进制cmd/webhook/main.go调用sharedmain.MainWithContext()由共享框架提供-disable-ha Whether to disable high-availability functionality for this component. This flag will be deprecated and removed when we have promoted this feature to stable, so do not pass it without filing an issue upstream!环境变量K_THREADS_PER_CONTROLLER为什么webhook只有--disable-ha从 cmd/webhook/main.go 可以看到main()本身没有注册任何自定义 flag而是将工作全部委托给sharedmain.MainWithContext()因此它只获得sharedmain提供的通用参数含--disable-ha。webhook通过sharedmain的机制读取K_THREADS_PER_CONTROLLER环境变量该变量与controller/resolvers读取的THREADS_PER_CONTROLLER指向同一底层值controller.DefaultThreadsPerController。Webhook 自身的环境变量配置虽然webhook二进制不接受额外的 flag但它依赖几个重要的环境变量在 cmd/webhook/main.go 中读取均有默认值环境变量默认值用途WEBHOOK_SERVICE_NAMEtekton-pipelines-webhookWebhook Service 名称WEBHOOK_SECRET_NAMEwebhook-certsTLS 证书 Secret 名称WEBHOOK_ADMISSION_CONTROLLER_NAMEwebhook.pipeline.tekton.dev准入控制器名称WEBHOOK_PORT8443HTTPS 服务端口PROBES_PORT8080健康/就绪探针端口这些变量在部署清单 config/webhook.yaml 中显式设置。修改WEBHOOK_ADMISSION_CONTROLLER_NAME时必须同步更新 config/500-webhooks.yaml 中 Mutating/ValidatingWebhookConfiguration 的webhooks.name与资源名以及 config/200-clusterrole.yaml 中 RBAC 的resourceNames否则准入控制会失效。events事件控制器二进制事件控制器二进制cmd/events/main.go调用sharedmain.Main()提供-disable-ha Whether to disable high-availability functionality for this component. This flag will be deprecated and removed when we have promoted this feature to stable, so do not pass it without filing an issue upstream!环境变量K_THREADS_PER_CONTROLLER从 cmd/events/main.go 可以看出它通过sharedmain.Main(events-controller, ...)启动三个事件通知控制器customrun.NewController()、taskrun.NewController()、pipelinerun.NewController()对应 pkg/reconciler/notifications 下的三个子目录。由于走sharedmain.Main()路径它与webhook一样只拥有--disable-ha并读取K_THREADS_PER_CONTROLLER。同时它也在 8080 端口PROBES_PORT默认值上提供/health、/readiness探针。resolvers远程解析器二进制Resolvers 二进制cmd/resolvers/main.go拥有以下额外 flag-threads-per-controller int Threads (goroutines) to create per controller (default 2)环境变量THREADS_PER_CONTROLLER注意resolvers二进制不支持--disable-ha。它先调用injection.ParseAndGetRESTConfigOrDie()再调用sharedmain.MainWithConfig()后者不会注册--disable-haflag——这正是 cmd/resolvers/main.go 的代码路径。与controller相同的线程配置逻辑resolvers的main()采用了与controller完全相同的THREADS_PER_CONTROLLER读取模式先os.LookupEnv解析环境变量写入controller.DefaultThreadsPerController再将其作为-threads-per-controllerflag 的默认值cmd/resolvers/main.go。一次启动五个解析器控制器resolvers通过sharedmain.MainWithConfig(ctx, controller, cfg, ...)一次性注册 5 个解析器控制器cmd/resolvers/main.gogit、hub、bundle、cluster、http。这也解释了源码中cfg.QPS 5 * cfg.QPS; cfg.Burst 5 * cfg.Burst的乘数来源——按所创建的控制器数量5 个放大客户端限流参数。另外它通过TEKTON_HUB_API和ARTIFACT_HUB_API两个环境变量配置 Hub 解析器的 API 端点后者默认https://artifacthub.io/相关配置见 config/resolvers/resolvers-deployment.yaml。实战在部署清单中修改控制器参数所有 flags 都通过 Deployment 的args或容器的env注入修改后kubectl apply即可让控制器以新参数重启。以下是常见调优场景1. 限制主控制器 informer 到指定命名空间# 修改 config/controller.yaml 中 args args: [ -namespace, tekton-pipelines, # ...其他镜像 flags 保持不动 ]2. 调整并发与重同步周期# controller每个控制器使用 8 个 goroutine重同步周期改为 30 分钟 args: [ -threads-per-controller, 8, -resync-period, 30m, # ... ] # 或通过环境变量flag 会覆盖环境变量 env: - name: THREADS_PER_CONTROLLER value: 83. 关闭高可用仅controller/webhook/events支持args: [-disable-ha]resolvers不提供该参数向它传-disable-ha会因未注册而解析失败。4. 为resolvers调整并发# config/resolvers/resolvers-deployment.yaml 中 args: [-threads-per-controller, 4] # 或 env: - name: THREADS_PER_CONTROLLER value: 45. 集群外运行调试所有二进制都支持在集群外以-kubeconfig指定 kubeconfig 路径、以-server指定 API Server 地址运行便于本地联调# 以 controller 为例需补齐全部镜像 flags /ko-app/controller \ -kubeconfig /path/to/kubeconfig \ -server https://127.0.0.1:6443 \ -entrypoint-image ... -nop-image ... -shell-image ... \ -shell-image-win ... -sidecarlogresults-image ... -workingdirinit-image ...常见问题与要点速查THREADS_PER_CONTROLLER与K_THREADS_PER_CONTROLLER的区别前者由controller/resolvers在自己main()中读取后者由webhook/events经sharedmain读取二者最终都写入knative.dev/pkg/controller的DefaultThreadsPerController只是变量名不同。--disable-ha可用范围controller、webhook、events可用resolvers不可用。该 flag 是过渡性设计将在 HA 功能 stable 后移除。镜像 flags 不可缺失controller的 6 个镜像 flags 会被 pkg/apis/pipeline/images.go 的Validate()强制校验缺任一都会启动失败并打印found unset image flags。--namespace仅controller拥有它只约束 informer 的监听范围不影响 API 写入能力。--resync-period默认 10h主控制器通过controller.WithResyncPeriod(ctx, opts.ResyncPeriod)注入重同步周期cmd/controller/main.go。QPS/Burst 自动放大controller按 2 倍、resolvers按 5 倍放大客户端 QPS/Burst放大倍率对应各自内部启动的控制器数量调优时无需手工加大。修改 webhook 名称类环境变量需联动多处WEBHOOK_ADMISSION_CONTROLLER_NAME变更必须同步更新 config/500-webhooks.yaml 与 config/200-clusterrole.yaml否则集群准入规则与 RBAC 不匹配。以上参数定义、默认值与注册逻辑均可在 cmd/controller/main.go、cmd/webhook/main.go、cmd/events/main.go、cmd/resolvers/main.go 四个入口文件以及 config 目录下的部署清单中逐一验证按需修改对应 YAML 后重启 Deployment 即可生效。赞分享云原生CI/CDDevOps后端【免费下载链接】pipelineA cloud-native Pipeline resource.项目地址https://gitcode.com/gh_mirrors/pipelin/pipeline点击查看免费下载相关推荐External Secrets Operator 控制器启动参数完全指南core controller、certcontroller 与 webhook 的 Flags 与 Helm 配置External Secrets Operator 控制器启动参数完全指南core controller、certcontroller 与 webhook 的云原生运维Tekton Pipeline 任务(Task)配置完全指南Tekton Pipeline 任务 Task 配置完全指南 概述 在Tekton Pipeline中Task 任务 是构建CI/CD流程的基本执行单元。本文云原生CI/CDDevOps后端rclone 全局 Flags 完全解析从命令行参数到源码注册机制rclone 全局 Flags 完全解析从命令行参数到源码注册机制 本文以 rclone 官方文档 flags.md https://link.gitcodeCLI数据同步对象存储上一篇Gmail Cleaner免费开源的终极邮箱清理工具让你的收件箱重获新生下一篇免费高效USB启动盘制作工具Rufus完整使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考