ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Argo CD `argocd proj allow-cluster-resource` 命令详解:集群级资源白名单管理实战

Argo CD `argocd proj allow-cluster-resource` 命令详解:集群级资源白名单管理实战 Argo CDargocd proj allow-cluster-resource命令详解集群级资源白名单管理实战【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cdArgo CD 通过 AppProject应用项目对 Application 可操作的 Kubernetes 资源进行细粒度约束其中集群级cluster-scoped资源采用白名单allow list优先、黑名单deny list兜底的管控模型。本文聚焦argocd proj allow-cluster-resource命令完整讲解其语法、参数、底层实现与典型应用场景如按名称白名单 Namespace、CRD帮助你精确掌握项目资源权限的配置方法。读完本文你将能够熟练使用该命令及其姊妹命令管理集群级资源的白名单/黑名单并理解其与ClusterResourceRestrictionItem数据模型、项目校验逻辑之间的关联。一、命令定位集群级资源的白名单机制在 Argo CD 的项目模型中资源权限分为两类管理思路命名空间级namespaced资源默认全部允许通过黑名单deny list进行限制对应命令为argocd proj allow-namespace-resource与argocd proj deny-namespace-resource集群级cluster-scoped资源默认全部禁止通过白名单allow list进行放行对应命令为argocd proj allow-cluster-resource与argocd proj deny-cluster-resource。这一结论在官方文档中有明确表述namespaced-scoped resources are restricted via a deny list, whereas cluster-scoped resources are restricted via allow list见 docs/user-guide/projects.md。argocd proj allow-cluster-resource的作用正如其命令描述所言将一个集群级 API 资源加入项目的 allow list白名单并同时将其从 deny list黑名单中移除见 cmd/argocd/commands/project.go 中NewProjectAllowClusterResourceCommand的定义。需要注意的是以上命令参考文档原文位于 docs/user-guide/commands/argocd_proj_allow-cluster-resource.md本文以其为主体骨架展开。二、命令语法与示例2.1 基本语法argocd proj allow-cluster-resource PROJECT GROUP KIND [NAME] [flags]四个位置参数的含义如下参数必填说明PROJECT是AppProject 名称GROUP是API 资源组Group核心组如 Namespace、Node使用空字符串或KIND是API 资源类型Kind如Namespace、CustomResourceDefinitionNAME否资源名称或名称模式支持 glob省略时匹配该 Group/Kind 下的全部资源2.2 官方示例# 将指定 GROUP 和 KIND 的集群级 API 资源加入白名单并从黑名单移除 argocd proj allow-cluster-resource PROJECT GROUP KIND # 将指定 GROUP、KIND 以及 NAME 模式的集群级 API 资源加入白名单并从黑名单移除 argocd proj allow-cluster-resource PROJECT GROUP KIND NAME2.3 参数个数校验从源码实现看modifyResourceListCmd对集群级资源命令的参数个数做了严格校验集群级命令必须接收3 或 4 个参数PROJECT GROUP KIND或PROJECT GROUP KIND NAME其中第 4 个NAME为可选若参数个数不合法命令会直接打印帮助信息并退出见 cmd/argocd/commands/project.goif !namespacedList (len(args) 3 || len(args) 4) { // Cluster-scoped resource command can have an optional NAME argument. c.HelpFunc()(c, args) os.Exit(1) }三、Flags 选项全解析3.1 本命令专属选项-h, --help help for allow-cluster-resource -l, --list string Use deny list or allow list. This can only be allow or deny (default allow)-l, --list指定操作的目标列表。默认值为allow即默认写入白名单。可取值仅为allow或deny。当指定--list deny时命令的行为变为加入黑名单实际上等同于deny-cluster-resource的效果。源码中通过如下分支决定操作目标见 cmd/argocd/commands/project.goif (listType allow) || (listType white) { list allowList clusterList clusterAllowList listAction allowed add allow } else { list denyList clusterList clusterDenyList listAction denied add !allow }其中listType由 flag 解析得到allow由命令类型allow-cluster-resource为true决定。从代码可以看出listType还向后兼容了white/black的旧式取值。另外值得注意的是集群级命令的--list默认值为allow而命名空间级命令的--list默认值为deny见 cmd/argocd/commands/project.go这与集群级默认禁止、命名空间级默认允许的模型完全一致。3.2 继承自父命令的通用选项argocd proj allow-cluster-resource是argocd proj的子命令因此继承其全部父级选项常见的有选项说明--server stringArgo CD server 地址--argocd-context string使用的 Argo CD server 上下文名称--auth-token string认证令牌也可通过环境变量ARGOCD_AUTH_TOKEN提供--core若为 true则 CLI 直接与 Kubernetes API 通信而非 Argo CD API server--config stringArgo CD 配置文件路径默认~/.config/argocd/config--port-forward通过端口转发连接随机的 argocd-server 端口--port-forward-namespace string端口转发使用的命名空间--grpc-web启用 gRPC-web 协议适用于代理不支持 HTTP2 的场景--grpc-web-root-path stringgRPC-web 的 web root 路径--insecure跳过服务器证书与域名校验--plaintext禁用 TLS--client-crt string/--client-crt-key string客户端证书文件及其密钥文件--server-crt string服务器证书文件--kube-context string指定 kube-context-H, --header strings为所有请求附加额外的 header可重复指定--http-retry-max int建立 HTTP 连接的最大重试次数--logformat string日志格式json或text默认json--loglevel string日志级别debug、info、warn、error默认info--controller-name stringApplication controller 名称默认argocd-application-controller可配环境变量ARGOCD_APPLICATION_CONTROLLER_NAME--repo-server-name stringRepo server 名称默认argocd-repo-server--server-name stringAPI server 名称默认argocd-server--redis-name string/--redis-haproxy-name string/--redis-compress stringRedis 相关配置名称、HA Proxy 名称、压缩方式gzip/none默认gzip--prompts-enabled强制启用或禁用可选交互式提示覆盖本地配置默认 false这些通用选项的完整列表见 cmd/argocd/commands/project.go 中项目命令族的父命令定义以及参考文档 docs/user-guide/commands/argocd_proj_allow-cluster-resource.md 的 Options inherited from parent commands 一节。四、底层实现白名单/黑名单的数据结构与修改逻辑4.1 数据模型ClusterResourceRestrictionItem集群级资源的白名单与黑名单在AppProjectSpec中分别对应ClusterResourceWhitelist与ClusterResourceBlacklist两个字段其元素类型为ClusterResourceRestrictionItem定义如下见 pkg/apis/application/v1alpha1/types.go// ClusterResourceRestrictionItem is a cluster resource that is restricted by the projects whitelist or blacklist type ClusterResourceRestrictionItem struct { Group string json:group protobuf:bytes,1,opt,namegroup Kind string json:kind protobuf:bytes,2,opt,namekind // Name is the name of the restricted resource. Glob patterns using Gos filepath.Match syntax are supported. // Unlike the group and kind fields, if no name is specified, all resources of the specified group/kind are matched. Name string json:name,omitempty protobuf:bytes,3,opt,namename }要点Group、Kind组合标识一类资源Name字段可选omitempty支持使用 Gofilepath.Match语法的 glob 模式当Name未指定时匹配该 Group/Kind 下的所有资源当指定了Name则仅匹配名称匹配的资源。4.2 修改逻辑modifyClusterResourcesList命令的核心修改逻辑由modifyClusterResourcesList函数完成见 cmd/argocd/commands/project.gofunc modifyClusterResourcesList(list *[]v1alpha1.ClusterResourceRestrictionItem, add bool, listAction string, group string, kind string, name string) (bool, string) { if add { for _, item : range *list { if item.Group group item.Kind kind item.Name name { return false, fmt.Sprintf(Group %s, kind %s, and name %s is already present in %s cluster resources, group, kind, name, listAction) } } *list append(*list, v1alpha1.ClusterResourceRestrictionItem{Group: group, Kind: kind, Name: name}) return true, fmt.Sprintf(Group %s, kind %s, and name %s is added to %s cluster resources, group, kind, name, listAction) } // ... remove 分支按 Group/Kind/Name 三者完全匹配定位并移除 }该函数的运行行为可以总结为加入add遍历列表若已存在GroupKindName完全相同的条目则提示already present且不重复写入否则追加新条目并提示 added移除remove按GroupKindName三者精确匹配定位条目并删除若不存在则提示 not in ...匹配时三个字段必须全部一致例如列表中只有{apps, Deployment, }时试图移除{apps, Deployment, example-deployment}会失败该行为被 cmd/argocd/commands/project_test.go 中的 Attempt to remove item with name but only group and kind exist 用例明确验证。4.3 完整执行流程从modifyResourceListCmd的执行体可以看出命令的完整调用链见 cmd/argocd/commands/project.go通过getProjIf创建 ProjectService gRPC 客户端headless 客户端会依据--core等选项决定直连 Kubernetes 还是 API server调用projIf.Get拉取目标项目的当前AppProject对象根据namespacedList选择操作ClusterResourceWhitelist/ClusterResourceBlacklist或命名空间级列表根据--list值选择 allow list 或 deny list并确定add方向调用modifyClusterResourcesList修改内存中的列表若列表确实被修改返回true打印提示信息并调用projIf.Update将更新后的项目对象提交回 API server。4.4 测试佐证仓库中的单元测试覆盖了该命令的核心行为见 cmd/argocd/commands/project_test.goTestAllowClusterResourceCommandL30-L78mock 项目的Get/Update以参数test-project apps Deployment example-deployment执行命令断言最终写入ClusterResourceWhitelist的条目为{Group: apps, Kind: Deployment, Name: example-deployment}且输出包含 Group apps, kind Deployment, and name example-deployment is added to allowed cluster resourcesTest_modifyAllowClusterResourceListL150-L262表驱动测试覆盖空列表新增、重复条目、按名称新增/移除、移除不存在的条目等多种边界情况。五、实战场景按名称限制集群级资源5.1 场景一仅允许特定前缀的 Namespace由于 Namespace、CRD 等集群级资源的名称具有特殊意义实践中常按名称精细化放行。例如只允许以team1-开头的命名空间可直接使用命令argocd proj allow-cluster-resource myproject Namespace team1-*等价于直接编辑 AppProject 清单见 docs/user-guide/projects.mdapiVersion: argoproj.io/v1alpha1 kind: AppProject spec: clusterResourceWhitelist: - group: kind: Namespace name: team1-*注意核心组的GROUP在 YAML 中写为空字符串在命令行中传入空串即可。5.2 场景二按名称拒绝特定前缀的 Namespace--list deny可以让你用同一条命令往黑名单写入条目。例如拒绝所有kube-*前缀的 Namespaceargocd proj allow-cluster-resource myproject Namespace kube-* --list deny其等价 YAML 为见 docs/user-guide/projects.mdapiVersion: argoproj.io/v1alpha1 kind: AppProject spec: clusterResourceBlacklist: - group: kind: Namespace name: kube-*5.3 场景三放行特定 CRD当 Application 需要管理某个自定义资源的 CRD集群级资源时可以这样放行argocd proj allow-cluster-resource myproject argoproj.io CustomResourceDefinition如果只想放行某个具体名称的 CRD例如applications.argoproj.io所对应的 CRD 实例名追加第四个参数argocd proj allow-cluster-resource myproject apiextensions.k8s.io CustomResourceDefinition applications.argoproj.io5.4 反向操作撤销白名单argocd proj deny-cluster-resource PROJECT GROUP KIND [NAME]从 allow list 移除并加入 deny list查看项目当前的白名单/黑名单argocd proj get PROJECT其输出表格中包含CLUSTER-RESOURCE-WHITELIST等列见 cmd/argocd/commands/project.go。六、与其他项目命令的联动argocd proj allow-cluster-resource归属于argocd proj项目命令族完整的族命令可查看 docs/user-guide/commands/argocd_proj.md。与资源白名单直接相关的配套命令还包括argocd proj allow-namespace-resource PROJECT GROUP KIND [NAME] argocd proj deny-cluster-resource PROJECT GROUP KIND argocd proj deny-namespace-resource PROJECT GROUP KIND [NAME]它们与allow-cluster-resource共用同一个modifyResourceListCmd工厂函数见 cmd/argocd/commands/project.go只是通过allow与namespacedList两个布尔参数区分方向与作用域命令allownamespacedList默认 --list作用allow-cluster-resourcetruefalseallow加白名单/移出黑名单集群级deny-cluster-resourcefalsefalseallow移出白名单/加入黑名单集群级allow-namespace-resourcetruetruedeny移出黑名单/加入白名单命名空间级deny-namespace-resourcefalsetruedeny加黑名单/移出白名单命名空间级另外项目中还有命令式方式与声明式方式两种管理路径本文的命令是对 AppProject 的ClusterResourceWhitelist/ClusterResourceBlacklist字段的增删操作同时你也可以直接以 Kubernetes 声明式方式kubectl apply上述 YAML 清单两种方式最终都作用于AppProject.spec的同一批字段效果一致。七、注意事项与最佳实践默认项目default projectArgo CD 默认创建的default项目最为宽松其clusterResourceWhitelist为{group: *, kind: *}即允许所有集群级资源见 docs/user-guide/projects.md。生产环境建议创建专用项目并显式收紧白名单。默认拒绝原则集群级资源采用白名单模型未列入白名单即被拒绝命名空间级资源采用黑名单模型未列入黑名单即被允许。理解这一非对称模型是正确配置的前提。NAME 匹配语义Name支持 Gofilepath.Match语法的 glob 模式未指定时匹配全部同名 Group/Kind 资源指定后仅匹配名称相符的资源见 pkg/apis/application/v1alpha1/types.go。原子性命令会先Get整个项目对象、修改列表、再Update提交。在并发修改同一项目时应注意读-改-写竞态的可能。权限要求执行命令需要当前用户具备对目标项目进行更新的 RBAC 权限命令本身不会给出项目存在与否以外的更多校验提示若项目不存在Get会直接报错退出。八、总结argocd proj allow-cluster-resource是 Argo CD 管理集群级资源访问权限的标准化入口它通过一行命令即可完成写入白名单 移出黑名单的复合操作支持可选的NAMEglob 模式实现按名称的精细化管控并可通过--list切换操作目标列表。结合源码 cmd/argocd/commands/project.go 中的modifyResourceListCmd与modifyClusterResourcesList以及 pkg/apis/application/v1alpha1/types.go 中的ClusterResourceRestrictionItem数据模型读者可以在掌握命令行操作的同时深入理解其在项目资源权限模型中的底层机制进而在多租户、多团队的 Argo CD 生产环境中设计出安全、可控的资源白名单策略。【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进