ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Argo CD `argocd proj create` 命令详解:从零创建与管理 AppProject

2026/9/14 5:36:11 拓冰建站 浏览量
Argo CD `argocd proj create` 命令详解:从零创建与管理 AppProject Argo CDargocd proj create命令详解从零创建与管理 AppProject【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd本篇技术指南以 Argo CD CLI 的argocd proj create命令为对象系统讲解如何在 Argo CD 中通过命令行创建 AppProject应用项目覆盖命令语法、全部参数含义、从文件/URL 创建项目、底层实现原理与实战示例。读完本文你将掌握用一条命令快速圈定允许的 Git 仓库、允许部署的目标集群与命名空间、允许/禁止部署的资源类型从而为多团队场景建立清晰的应用隔离边界。命令概览argocd proj create用于在 Argo CD 中创建 AppProject 资源。AppProject 是 Argo CD 对 Application 进行逻辑分组的核心资源CRD 为argoproj.io/v1alpha1下的AppProject它负责管控四类约束见 app_project_types.go 中的类型注释允许部署到哪目标集群cluster whitelist与命名空间白名单允许部署什么Git 源仓库白名单、集群/命名空间级资源白名单与黑名单谁能访问这些应用项目角色、OIDC group 绑定他们能做什么项目级 RBAC 策略与自动化使用的 JWT 令牌。命令基本语法argocd proj create PROJECT [flags]其中PROJECT是项目名称也是创建的 AppProject 的metadata.name。命令的两种基本用法与命令内置帮助一致见 cmd/argocd/commands/project.go# 通过命令行参数创建一个名为 PROJECT 的项目 argocd proj create PROJECT # 从本地文件或远程 URL 的 Kubernetes Manifest 创建项目 argocd proj create PROJECT -f FILE|URL方式一命令行参数直接创建最常见的做法是用-d/--dest指定允许部署的目标用-s/--src指定允许的 Git 源仓库。官方用户指南 projects.md 给出了一个经典示例创建项目myproject允许把应用部署到集群https://kubernetes.default.svc的mynamespace命名空间并且只允许从https://github.com/argoproj/argocd-example-apps.git拉取清单argocd proj create myproject \ -d https://kubernetes.default.svc,mynamespace \ -s https://github.com/argoproj/argocd-example-apps.git值得说明的是-d的值是服务器地址,命名空间两个字段以逗号拼接而成。源码在 cmd/util/project.go 的GetDestinations()中严格按逗号切分要求必须恰好两段server,namespace否则会直接报错退出parts : strings.Split(destStr, ,) if len(parts) ! 2 { log.Fatalf(Expected destination of the form: server,namespace. Received: %s, destStr) }目标集群既可以用 server URL如https://192.168.99.100:8443也可以用集群 name命名空间支持通配符如default、team1-*、*并支持以!前缀做否定如!kube-system表示禁止部署到 kube-system。-s指定允许的源仓库 URL同样支持*、**等 glob 通配符与!否定规则详见 projects.md。方式二从文件或 URL 创建-f-f, --file允许从 Kubernetes ManifestYAML/JSON创建项目路径可以是本地文件或http(s)URL。该标志在 cmd/argocd/commands/project.go 中注册并自动配置了 bash 补全只提示json、yaml、yml三种扩展名。# 从本地文件创建 argocd proj create PROJECT -f /path/to/project.yaml # 从远程 URL 拉取 Manifest 创建 argocd proj create PROJECT -f https://example.com/project.yaml # 从标准输入读取- 代表 stdin cat project.yaml | argocd proj create PROJECT -f -一个标准的 AppProject Manifest 如下对应 default 项目最宽松的形态见 projects.mdapiVersion: argoproj.io/v1alpha1 kind: AppProject metadata: name: myproject namespace: argocd spec: sourceRepos: - * destinations: - namespace: * server: * clusterResourceWhitelist: - group: * kind: *从文件创建时有一个重要约束-f指定的 Manifest 中metadata.name必须与命令行传入的PROJECT一致否则创建会被拒绝。该校验实现在 cmd/util/project.goif len(args) 1 args[0] ! proj.Name { return nil, fmt.Errorf(project name %s does not match project spec metadata.name %s, args[0], proj.Name) }从文件/URL/标准输入读取后命令行上的其他参数如-d、-s仍然会被合并应用到该项目 spec 上。完整参数参考命令专属参数参数类型说明--allow-cluster-resource stringArray数组允许的集群级资源列表可选带 group 与 name如ClusterRole、apiextensions.k8s.io/CustomResourceDefinition、/Namespace/team1-*--allow-namespaced-resource stringArray数组允许的命名空间级资源列表--deny-cluster-resource stringArray数组拒绝的集群级资源列表可选带 group 与 name如ClusterRole、apiextensions.k8s.io/CustomResourceDefinition、/Namespace/kube-*--deny-namespaced-resource stringArray数组拒绝的命名空间级资源列表--description string字符串项目描述-d, --dest stringArray数组允许的目标服务器与命名空间如https://192.168.99.100:8443,default--dest-service-accounts stringArray数组目标服务器、命名空间与目标 ServiceAccount如https://192.168.99.100:8443,default,default-sa-f, --file string字符串项目 Manifest 的文件名或 URL-h, --help布尔显示 create 子命令帮助--orphaned-resources布尔启用孤儿资源监控--orphaned-resources-warn布尔检测到孤儿资源时应用是否应带有 warning 状态--signature-keys strings数组用于提交签名校验的 GnuPG 公钥 ID已废弃见下文--source-namespaces strings数组允许创建 Application 资源的源命名空间列表-s, --src stringArray数组允许的源仓库 URL--upsert布尔允许覆盖同名项目即使提供的 spec 与现有 spec 不同注意--dest、--src等数组参数可重复多次stringArray类型例如argocd proj create myproject \ -d https://cluster1.example.com,ns1 \ -d https://cluster1.example.com,ns2 \ -s https://github.com/argoproj/argocd-example-apps.git \ -s https://github.com/example-org/another-app.git继承的全局参数argocd proj create同样继承argocd proj的父级参数用于控制服务器连接、认证与输出行为参数说明--argocd-context string使用的 Argo CD 服务器 context 名称--auth-token string认证令牌也可通过环境变量ARGOCD_AUTH_TOKEN设置--client-crt string/--client-crt-key string客户端证书文件与私钥文件--config stringArgo CD 配置文件路径默认/home/user/.config/argocd/config--controller-name stringApplication controller 名称默认argocd-application-controller可被ARGOCD_APPLICATION_CONTROLLER_NAME覆盖例如通过 Helm chart 安装且名称 label 不同时使用--core为 true 时 CLI 直接与 Kubernetes 通信而不经过 Argo CD API server--grpc-web启用 gRPC-web 协议Argo CD server 位于不支持 HTTP2 的代理之后时有用--grpc-web-root-path string在 gRPC-web 基础上设置 web 根路径-H, --header strings为所有 CLI 请求附加额外 header可重复也支持逗号分隔--http-retry-max int与 Argo CD server 建立 HTTP 连接的最大重试次数--insecure跳过服务器证书与域名校验--kube-context string指定使用的 kube-context--logformat string日志格式json或text默认json--loglevel string日志级别debug、info、warn或error默认info--plaintext禁用 TLS--port-forward通过端口转发连接到一个随机的 argocd-server 端口--port-forward-namespace string端口转发使用的命名空间--prompts-enabled强制启用/禁用交互提示未指定时使用本地配置默认 false--redis-compress stringapplication controller 启用了 redis 压缩时开启可选值gzip、none默认gzip--redis-haproxy-name stringRedis HA Proxy 名称默认argocd-redis-ha-haproxy--redis-name stringRedis Deployment 名称默认argocd-redis--repo-server-name stringRepo server 名称默认argocd-repo-server--server stringArgo CD 服务器地址--server-crt string服务器证书文件--server-name stringArgo CD API server 名称默认argocd-server关键参数深度解析资源白名单与黑名单集群级 / 命名空间级Argo CD 对两类资源采用不同的默认策略详见 projects.md命名空间级资源默认通过不需要白名单使用黑名单限制集群级资源默认拒绝必须显式加入白名单使用白名单放行。命令行参数的解析逻辑在 cmd/util/project.gogetGroupKindList()处理命名空间级资源接受Group/Kind如apiextensions.k8s.io/CustomResourceDefinition或仅Kind如ClusterRoleGroup 为空两种形式getClusterResourceRestrictionItemList()处理集群级资源额外支持三段式Group/Kind/Name用于按名称精确放行或拒绝特定集群级资源。例如只允许部署team1-开头的 Namespaceargocd proj create myproject \ --allow-cluster-resource /Namespace/team1-* \ -d https://kubernetes.default.svc,*又例如拒绝部署到kube-*命名空间前缀的资源argocd proj create myproject \ --deny-namespaced-resource */kube-*这些参数在内部被映射为 AppProject spec 的四个字段cmd/util/project.go命令行参数映射的 spec 字段--allow-cluster-resourceclusterResourceWhitelist--deny-cluster-resourceclusterResourceBlacklist--allow-namespaced-resourcenamespaceResourceWhitelist--deny-namespaced-resourcenamespaceResourceBlacklist孤儿资源监控--orphaned-resources/--orphaned-resources-warn启用后Argo CD 会监控命名空间内不属于任何 Application 的资源即孤儿资源。--orphaned-resources开启监控--orphaned-resources-warn决定检测到孤儿资源时应用是处于 warning 状态还是 error 状态。源码实现见 cmd/util/project.go只要设置了--orphaned-resources或显式修改了--orphaned-resources-warn就会生成OrphanedResourcesMonitorSettings其中Warn字段仅在用户显式指定 warn 标志时才写入其余情况由控制器按默认策略处理。argocd proj create myproject \ --orphaned-resources \ --orphaned-resources-warn \ -d https://kubernetes.default.svc,*源命名空间--source-namespacessourceNamespaces限制了Application 资源本身可以创建在哪些 Kubernetes 命名空间区别于目标部署命名空间。从源码看该字段用于校验 Application 所在命名空间是否被允许app_project_types.go安装命名空间中的 Application 始终被允许其余命名空间需要匹配SourceNamespaces中的 glob/正则规则。argocd proj create myproject \ --source-namespaces team-a,team-b \ -d https://kubernetes.default.svc,*目标 ServiceAccount--dest-service-accounts格式为server,namespace,defaultServiceAccount三段如https://192.168.99.100:8443,default,default-sa用于指定部署到该目标时默认使用的 ServiceAccount。解析逻辑在 cmd/util/project.go要求恰好三段否则报错。对应字段destinationServiceAccounts中的 server/namespace 支持 glob 模式且默认 ServiceAccount 不能为空、不能包含!*[]{}\/等非法字符app_project_types.go。GnuPG 签名密钥--signature-keys--signature-keys用于提交签名校验但已废弃CLI 在设置该参数时会打印警告提示改用 Source Integrity 功能cmd/util/project.goWarning: --signature-keys option is deprecated. Configure Source Integrity instead with: argocd proj source-integrity git policies ...GnuPG 密钥 ID 会经过 sourceintegrity 的KeyID()规范化后写入spec.signatureKeys。新项目建议直接使用argocd proj source-integrity git policies ...子命令配置 Source Integrity。--upsert覆盖语义--upsert允许在项目已存在且 spec 与现有 spec 不同的情况下强制覆盖更新。它在 cmd/argocd/commands/project.go 注册并通过ProjectCreateRequest{Upsert: upsert}传给服务端由 API server 决定是新建还是覆盖。源码级实现原理argocd proj create的执行链路非常清晰从 cmd/argocd/commands/project.go 可以还原完整流程构造 AppProject 对象调用cmdutil.ConstructAppProj(fileURL, args, opts, c)。该函数cmd/util/project.go按三种输入来源分支处理-f -从标准输入读取 Manifest-f FILE|URL从本地文件或 HTTP(S) URL 读取 Manifest并校验名称一致性未提供-f直接用命令行参数构造PROJECT即metadata.name。合并参数到 specSetProjSpecOptions(c.Flags(), proj.Spec, opts)遍历实际传入的 flags将每个参数映射到对应的 spec 字段cmd/util/project.go。建立 gRPC 连接并调用headless.NewClientOrDie(...).NewProjectClientOrDieWithContext(ctx)创建 ProjectService gRPC 客户端然后调用Create(ctx, projectpkg.ProjectCreateRequest{Project: proj, Upsert: upsert})cmd/argocd/commands/project.go。服务端校验AppProject 的 spec 会经过ValidateProject()的一致性校验app_project_types.go包括目的地server/namespace组合不允许重复、!*是非法通配符、源仓库不允许重复且!*非法、角色名/策略/group 必须唯一合法、同步窗口哈希唯一、destinationServiceAccounts的 server/namespace 必须能编译为合法 glob 等。由于argocd proj create走的是 Argo CD API server而非直接写 Kubernetes命令实际对服务器权限有要求当前用户需要具备项目的创建权限默认由argocd-rbac-cm中的 RBAC 策略控制。如果使用--core模式CLI 则直连 Kubernetes 集群。完整实战示例示例 1多团队隔离项目为team-a创建一个完全受控的项目只允许拉取指定组织仓库、只部署到生产集群的team-a-*命名空间、放行 Deployment/Service、拒绝特权相关资源argocd proj create team-a-prod \ -d https://prod-cluster.example.com,team-a-* \ -s https://github.com/my-org/* \ --allow-namespaced-resource apps/Deployment \ --allow-namespaced-resource /Service \ --deny-cluster-resource rbac.authorization.k8s.io/ClusterRoleBinding \ --description Team A production workloads \ --orphaned-resources示例 2以声明式 Manifest 创建并补充限制先编写team-b-project.yamlapiVersion: argoproj.io/v1alpha1 kind: AppProject metadata: name: team-b namespace: argocd spec: description: Team B project sourceRepos: - https://github.com/team-b/** destinations: - namespace: team-b-* server: https://kubernetes.default.svc再执行创建Manifest 中 name 必须为team-bargocd proj create team-b -f team-b-project.yaml --upsert示例 3验证与后续管理创建完成后用argocd proj get/argocd proj list验证argocd proj get team-a-prod argocd proj list -o wide后续如需调整可以使用同一系列命令增量修改argocd proj add-source、argocd proj add-destination、argocd proj allow-cluster-resource、argocd proj deny-namespace-resource等这些子命令实现同样位于 cmd/argocd/commands/project.go也可以直接在集群中kubectl edit appproject name修改 CR 后保存。其他相关命令的完整参考见 argocd proj 命令参考项目概念与 RBAC 配置详见 Projects 用户指南。注意事项与最佳实践default项目默认最宽松未指定项目时Application 属于default项目它默认允许任意源、任意目标与全部资源类型。建议为每个团队创建独立项目并显式收窄权限projects.md。资源默认策略相反命名空间级资源默认放行、用黑名单限制集群级资源默认拒绝、必须显式白名单放行。不要凭直觉把两类参数混用。!*是非法规则否定全部!*在源仓库与目标上都是无意义的服务端会直接拒绝。名称一致性使用-f从 Manifest 创建时命令行项目名必须与 Manifest 的metadata.name一致。--signature-keys已废弃新环境请改用 Source Integrityargocd proj source-integrity git policies ...。数组参数可重复-d、-s以及四个资源白/黑名单参数均为数组类型需要多条规则时重复传参即可。【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考