ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Argo CD `argocd proj remove-destination-service-account` 命令详解:移除 AppProject 中的同步模拟服务账户

Argo CD `argocd proj remove-destination-service-account` 命令详解:移除 AppProject 中的同步模拟服务账户 Argo CDargocd proj remove-destination-service-account命令详解移除 AppProject 中的同步模拟服务账户【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cdargocd proj remove-destination-service-account是 Argo CD CLI 中用于从AppProject项目中删除目的地默认服务账户destination service account的命令配合同步模拟impersonation机制实现对 Application 同步操作所用 Kubernetes 服务账户的精细化管控。本文以该命令参考文档为主体结合仓库中 cmd/argocd/commands/project.go 的源码实现、pkg/apis/application/v1alpha1/types.go 的数据模型以及 docs/operator-manual/app-sync-using-impersonation.md 的功能文档完整讲解命令语法、底层匹配逻辑、相关配置与最佳实践。命令概览命令用途argocd proj remove-destination-service-account PROJECT SERVER NAMESPACE SERVICE_ACCOUNT [flags]该命令用于从指定的AppProjectPROJECT中移除与指定目的地SERVER 与 NAMESPACE 组合绑定的默认服务账户SERVICE_ACCOUNT。移除后该目的地将不再匹配到该服务账户后续 Application 同步时若依赖该映射将可能回退到控制器服务账户或直接报错取决于 enforcement 配置详见下文。官方示例# Remove the destination service account (SERVICE_ACCOUNT) from the specified destination (SERVER and NAMESPACE combination) on the project with name PROJECT argocd proj remove-destination-service-account PROJECT SERVER NAMESPACE SERVICE_ACCOUNT一个贴合真实环境的例子移除in-cluster上guestbook命名空间绑定的guestbook-saargocd proj remove-destination-service-account my-project https://kubernetes.default.svc guestbook guestbook-sa命令选项该命令本身只暴露一个帮助选项选项说明-h, --help显示remove-destination-service-account的帮助信息注意命令参考中的用法是PROJECT SERVER NAMESPACE SERVICE_ACCOUNT四个位置参数。实际使用中四个参数缺一不可——源码中通过len(args) ! 4进行严格校验见下文源码级实现参数不足会直接打印帮助并退出。因此在执行时务必带上 SERVICE_ACCOUNT 参数避免与旧文档中省略该参数的示例混淆。功能背景应用同步模拟Impersonation机制要理解remove-destination-service-account的用途需要先了解它服务的核心功能——Application 同步模拟sync impersonation。Argo CD 在默认情况下应用同步与 Argo CD 控制平面共享同一套权限即控制平面服务账户的权限。在多租户场景中这意味着控制平面权限必须与权限需求最高的租户对齐存在安全风险。自 v3.5.0 起Argo CD 引入了 beta 质量的同步模拟特性详见 docs/operator-manual/app-sync-using-impersonation.md允许将应用同步所用服务账户与控制平面服务账户解耦每个 AppProject 通过.spec.destinationServiceAccounts为目的地server namespace映射一个更小权限的服务账户Argo CD 在同步时以该服务账户的身份通过 Kubernetes impersonation 头创建、更新和清理资源。该功能默认关闭需要管理员在argocd-cmConfigMap 中显式开启data: application.sync.impersonation.enabled: true并可进一步控制强制执行行为默认严格强制未匹配到服务账户则同步失败设为false则回退到控制器服务账户data: application.sync.impersonation.enabled: true application.sync.impersonation.enforced: false这一安全模型正是argocd proj add-destination-service-account与argocd proj remove-destination-service-account这对命令存在的意义它们是通过 CLI 管理.spec.destinationServiceAccounts映射的官方入口。底层数据模型服务账户与目的地如何绑定在 API 层面目的地服务账户由ApplicationDestinationServiceAccount结构体描述定义于 pkg/apis/application/v1alpha1/types.go// ApplicationDestinationServiceAccount holds information about the service account to be impersonated for the application sync operation. type ApplicationDestinationServiceAccount struct { // Server specifies the URL of the target clusters Kubernetes control plane API. Server string json:server protobuf:bytes,1,opt,nameserver // Namespace specifies the target namespace for the applications resources. Namespace string json:namespace,omitempty protobuf:bytes,2,opt,namenamespace // DefaultServiceAccount to be used for impersonation during the sync operation DefaultServiceAccount string json:defaultServiceAccount protobuf:bytes,3,opt,namedefaultServiceAccount }server目标集群 Kubernetes 控制面 API 的 URL例如https://kubernetes.default.svc即in-cluster。namespace目标命名空间支持通配符*作为 catch-all 兜底配置。defaultServiceAccount同步操作时被模拟impersonate的默认服务账户名也可以写成命名空间:服务账户的格式如tenant1-ns:guestbook-deployer此时服务账户位于指定命名空间而不是默认使用 Application 的目标命名空间。这些条目聚合在 AppProject 的spec.destinationServiceAccounts字段中pkg/apis/application/v1alpha1/types.go// DestinationServiceAccounts holds information about the service accounts to be impersonated for the application sync operation for each destination. DestinationServiceAccounts []ApplicationDestinationServiceAccount json:destinationServiceAccounts,omitempty protobuf:bytes,14,namedestinationServiceAccounts在 CRD 清单manifests/crds/appproject-crd.yaml以及生成的 OpenAPI 与 Swagger 定义assets/swagger.json中均有对应字段声明。remove-destination-service-account命令执行的操作本质就是对 AppProject 中该字段的精确条目删除。源码级实现命令的内部执行逻辑命令定义于 cmd/argocd/commands/project.go其核心逻辑如下func NewProjectRemoveDestinationServiceAccountCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command { command : cobra.Command{ Use: remove-destination-service-account PROJECT SERVER NAMESPACE SERVICE_ACCOUNT, Short: Remove default destination service account from the project, ... Run: cli.WithSignalContext(func(c *cobra.Command, args []string, _ context.CancelFunc) { ... if len(args) ! 4 { c.HelpFunc()(c, args) os.Exit(1) } projName : args[0] server : args[1] namespace : args[2] serviceAccount : args[3] ... proj, err : projIf.Get(ctx, projectpkg.ProjectQuery{Name: projName}) errors.CheckError(err) originalLength : len(proj.Spec.DestinationServiceAccounts) proj.Spec.DestinationServiceAccounts slices.DeleteFunc(proj.Spec.DestinationServiceAccounts, func(destServiceAccount v1alpha1.ApplicationDestinationServiceAccount) bool { return destServiceAccount.Namespace namespace destServiceAccount.Server server destServiceAccount.DefaultServiceAccount serviceAccount }, ) if originalLength len(proj.Spec.DestinationServiceAccounts) { log.Fatal(Specified destination service account does not exist in project) } _, err projIf.Update(ctx, projectpkg.ProjectUpdateRequest{Project: proj}) errors.CheckError(err) }), } return command }从源码可以确认以下行为细节参数强校验位置参数必须是 4 个PROJECT、SERVER、NAMESPACE、SERVICE_ACCOUNT否则打印帮助并os.Exit(1)。读取-修改-写回先通过 ProjectServiceClient 的Get拉取最新项目对象在本地切片上执行删除再通过Update提交回服务器cmd/util/project.go 中提供对应的客户端封装。精确三元组匹配删除条件是namespace、server、defaultServiceAccount三者同时相等区别于add命令对server/defaultServiceAccount空串的宽松判断。这意味着同一 server namespace 下绑定的不同服务账户是相互独立的条目删除其中一个不会影响其他服务账户条目。删除目标不存在即报错如果删除前后DestinationServiceAccounts切片长度不变即没有匹配到任何条目命令会以Specified destination service account does not exist in project直接log.Fatal终止而不是静默成功。这一设计有助于及早发现配置笔误。与之对应添加命令定义在同一文件中cmd/argocd/commands/project.go支持--service-account-namespace标志指定服务账户所在命名空间并会拒绝包含*通配符的服务账户名与命名空间。e2e 测试test/e2e/project_management_test.go覆盖了带命名空间/不带命名空间等服务账户映射的添加场景测试辅助函数见 test/e2e/fixture/project/actions.go。完整使用场景添加、验证与移除一个典型的管理闭环如下。1. 添加目的地服务账户argocd proj add-destination-service-account# 为 in-cluster 的 guestbook 命名空间绑定 guestbook-sa argocd proj add-destination-service-account my-project https://kubernetes.default.svc guestbook guestbook-sa # 为 in-cluster 的 guestbook 命名空间绑定位于 tenant1-ns 命名空间中的服务账户 argocd proj add-destination-service-account my-project https://kubernetes.default.svc guestbook guestbook-deployer --service-account-namespace tenant1-ns2. 查看项目状态确认绑定可通过kubectl get appproject my-project -o yaml检查spec.destinationServiceAccounts或使用argocd proj get my-project查看项目整体配置。3. 移除目的地服务账户本文主题命令# 移除 in-cluster 的 guestbook 命名空间下绑定的 guestbook-sa argocd proj remove-destination-service-account my-project https://kubernetes.default.svc guestbook guestbook-sa4. 移除 catch-all 兜底条目服务账户为空/为通配符场景的典型用法# 移除命名空间为 * 的 catch-all 条目defaultServiceAccount 为 default argocd proj remove-destination-service-account my-project https://kubernetes.default.svc * default注意在 shell 中传递*时建议加引号*避免被 shell 展开成文件列表。继承自父命令的全局选项remove-destination-service-account作为argocd proj的子命令自动继承argocdCLI 的全部全局选项与argocd proj其他子命令一致父命令参考见 docs/user-guide/commands/argocd_proj.md。常用项整理如下选项说明--argocd-context string要使用的 Argo CD 服务器上下文名称--auth-token string认证令牌也可通过ARGOCD_AUTH_TOKEN环境变量设置--client-crt string/--client-crt-key string客户端证书文件及其私钥文件--config stringArgo CD 配置文件路径默认/home/user/.config/argocd/config--controller-name stringApplication 控制器名称与ARGOCD_APPLICATION_CONTROLLER_NAME环境变量等价默认argocd-application-controller--core设为 true 时 CLI 直接与 Kubernetes 交互而非经由 Argo CD API server--grpc-web/--grpc-web-root-path string启用 gRPC-web 协议适用于不支持 HTTP2 的反向代理场景-H, --header strings为所有 Argo CD CLI 请求附加额外请求头可重复指定也支持逗号分隔--http-retry-max int与 Argo CD 服务器建立 HTTP 连接的最大重试次数--insecure跳过服务器证书与域名校验--kube-context string将命令定向到指定的 kube-context--logformat string日志格式json或text默认json--loglevel string日志级别debug、info、warn、error默认info--plaintext禁用 TLS--port-forward/--port-forward-namespace string通过端口转发连接到随机 argocd-server 端口及指定命名空间--prompts-enabled强制启用/禁用可选的交互式提示覆盖本地配置本地默认 false--redis-compress string当 application controller 启用了 redis 压缩时开启可选gzip、none默认gzip--redis-haproxy-name string/--redis-name stringRedis HA Proxy / Redis 部署名称与ARGOCD_REDIS_HAPROXY_NAME、ARGOCD_REDIS_NAME环境变量等价--repo-server-name stringRepo server 名称与ARGOCD_REPO_SERVER_NAME环境变量等价默认argocd-repo-server--server stringArgo CD 服务器地址--server-crt string/--server-name string服务器证书文件 / API server 名称默认argocd-server例如在未使用argocd login保存上下文的场景下可直接通过认证令牌指定服务器执行argocd proj remove-destination-service-account my-project https://kubernetes.default.svc guestbook guestbook-sa \ --server argocd.example.com:443 \ --auth-token $ARGOCD_AUTH_TOKEN声明式 YAML 的等价管理方式remove-destination-service-account是命令式的操作方式同样的映射管理也可以完全声明式地完成。通过kubectl apply一个包含destinationServiceAccounts的 AppProject 清单即可示例参见 docs/operator-manual/app-sync-using-impersonation.md 的 Using declarative yaml 章节apiVersion: argoproj.io/v1alpha1 kind: AppProject metadata: name: my-project namespace: argocd spec: sourceRepos: - * destinations: - * destinationServiceAccounts: - server: https://kubernetes.default.svc namespace: guestbook defaultServiceAccount: guestbook-deployer - server: https://kubernetes.default.svc # catch-all 兜底配置 namespace: * defaultServiceAccount: default移除条目时只需从 YAML 中删除对应条目并重新kubectl apply或使用kubectl edit appproject my-project。CLI 命令与声明式清单都可以管理同一份spec.destinationServiceAccounts文档中明确指出该字段可以通过声明式方式或 Argo CD APICLI、Web UI、REST API 等创建和管理。注意事项与最佳实践移除前确认 enforcement 策略如果application.sync.impersonation.enforced为true默认严格模式移除某目的地唯一匹配的服务账户后指向该目的地的 Application 同步会因找不到匹配而报错若 enforcement 为false则会回退到控制器服务账户。生产环境移除前应确认是否有其他条目如 catch-all能够承接该目的地。精确匹配语义删除采用namespaceserverdefaultServiceAccount三元组精确匹配目标不存在会log.Fatal报错。若需要整体移除某个 server/namespace 下的全部服务账户需要逐条执行本命令。catch-all 与优先级namespace: *可作为兜底配置且文档建议将其保持在列表低优先级位置。注意本命令的删除匹配并不特殊处理*——要删除 catch-all 条目需要显式传入*作为 NAMESPACE 参数shell 中注意引号转义。服务账户命名空间格式defaultServiceAccount支持命名空间:服务账户格式添加命令通过--service-account-namespace生成。删除时必须使用与添加时完全一致的字符串含:前缀才能精确命中条目。系统级开关impersonation 功能只能在整个系统层面argocd-cmConfigMap启用/禁用对所有 Application 生效单条目的地服务账户的增删则通过本命令按项目粒度管理。安全性提示该功能为 betav3.5.0 起配置不当可能带来安全风险。请仔细阅读 docs/operator-manual/app-sync-using-impersonation.md 全文后再在生产环境启用。相关资源父命令参考argocd proj功能文档Application Sync using impersonation命令行实现cmd/argocd/commands/project.go数据模型定义pkg/apis/application/v1alpha1/types.goAppProject CRD 清单manifests/crds/appproject-crd.yaml端到端测试test/e2e/project_management_test.go、test/e2e/fixture/project/actions.go【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表