0

在我们的 Tekton 管道中,我们希望使用 ArgoCD CLI 来argocd app create动态argocd app sync地基于正在构建的应用程序。我们通过向ConfigMap添加 a来创建一个新用户,如文档中所述:accounts.tekton: apiKeyargocd-cm

kubectl patch configmap argocd-cm -n argocd -p '{"data": {"accounts.tekton": "apiKey"}}'

然后我们为用户创建了一个令牌tekton

argocd account generate-token --account tekton

有了这个令牌,password我们username tekton做了argocd login类似的事情

argocd login $(kubectl get service argocd-server -n argocd --output=jsonpath='{.status.loadBalancer.ingress[0].hostname}') --username=tekton --password="$TOKEN";

现在,在我们的 Tekton 管道中(但我们猜测对于其他所有 CI 来说都是一样的,考虑到非管理员用户的使用),如果我们运行,我们会收到以下错误argocd app create

$ argocd app create microservice-api-spring-boot --repo https://gitlab.com/jonashackt/microservice-api-spring-boot-config.git --path deployment --dest-server https://kubernetes.default.svc --dest-namespace default --revision argocd --sync-policy auto
error rpc error: code = PermissionDenied desc = permission denied: applications, create, default/microservice-api-spring-boot, sub: tekton, iat: 2022-02-03T16:36:48Z
4

1 回答 1

2

Argo 的用户帐户文档中提到了该问题:

当您创建本地用户时,这些用户中的每一个都需要设置额外的 RBAC 规则,否则他们将回退到由 argocd-rbac-cm ConfigMap 的 policy.default 字段指定的默认策略。

但是这些额外的 RBAC 规则可以使用 ArgoCDProjects最简单地设置。有了这样的AppProject你甚至不需要像tekton在 ConfigMap 中那样创建用户argocd-cm。ArgoCD 项目能够定义项目角色

项目包括一个称为角色的功能,可以自动访问项目的应用程序。这些可用于为 CI 管道提供一组受限的权限。例如,CI 系统可能只能同步单个应用程序(但不能更改其源或目标)。

有两种解决方案如何配置AppProject角色和权限,包括。角色令牌:

  1. 使用argocd命令行
  2. 使用清单 YAML 文件

1.) 使用argocdCLI 创建AppProject角色和权限,包括。角色令牌

AppProject因此,让我们动手并使用argocd名为的 CLI创建 ArgoCD apps2deploy

argocd proj create apps2deploy -d https://kubernetes.default.svc,default --src "*"

--src "*"我们使用git 存储库的通配符创建它(如此处所述)。

现在我们创建一个role名为的项目create-sync

argocd proj role create apps2deploy create-sync --description "project role to create and sync apps from a CI/CD pipeline"

您可以使用 来检查新角色是否已创建argocd proj role list apps2deploy

然后我们需要为新的项目角色创建一个令牌create-sync,可以通过以下方式创建:

argocd proj role create-token apps2deploy create-sync

此令牌需要用于argocd login我们的 Tekton / CI 管道中的命令。该命令还有一个--token-only参数,所以我们可以通过

ARGOCD_AUTH_TOKEN=$(argocd proj role create-token apps2deploy create-sync --token-only)

ARGOCD_AUTH_TOKEN将由 自动使用argo login

现在我们需要为该角色授予权限,以便它能够从 Tekton 或任何其他 CI 管道中在 ArgoCD 中创建和同步我们的应用程序。如文档中所述,我们因此使用argocdCLI 向我们的角色添加策略:

argocd proj role add-policy apps2deploy create-sync --action get --permission allow --object "*"
argocd proj role add-policy apps2deploy create-sync --action create --permission allow --object "*"
argocd proj role add-policy apps2deploy create-sync --action sync --permission allow --object "*"
argocd proj role add-policy apps2deploy create-sync --action update --permission allow --object "*"
argocd proj role add-policy apps2deploy create-sync --action delete --permission allow --object "*"

看一下角色策略argocd proj role get apps2deploy create-sync,它应该看起来像这样:

$ argocd proj role get apps2deploy create-sync
Role Name:     create-sync
Description:   project role to create and sync apps from a CI/CD pipeline
Policies:
p, proj:apps2deploy:create-sync, projects, get, apps2deploy, allow
p, proj:apps2deploy:create-sync, applications, get, apps2deploy/*, allow
p, proj:apps2deploy:create-sync, applications, create, apps2deploy/*, allow
p, proj:apps2deploy:create-sync, applications, update, apps2deploy/*, allow
p, proj:apps2deploy:create-sync, applications, delete, apps2deploy/*, allow
p, proj:apps2deploy:create-sync, applications, sync, apps2deploy/*, allow
JWT Tokens:
ID          ISSUED-AT                                EXPIRES-AT
1644166189  2022-02-06T17:49:49+01:00 (2 hours ago)  <none>

最后,我们应该已经设置好一切来做一个成功的argocd app create. 我们需要做的就是添加--project apps2deploy参数:

argocd app create microservice-api-spring-boot --repo https://gitlab.com/jonashackt/microservice-api-spring-boot-config.git --path deployment --project apps2deploy --dest-server https://kubernetes.default.svc --dest-namespace default --revision argocd --sync-policy auto

2.) 使用 manifest YAML 创建AppProject,角色和权限,包括。角色令牌

由于解决方案 1.) 中所有这些基于 CLI 的步骤非常多,我们还可以使用清单 YAML 文件。这是一个argocd-appproject-apps2deploy.yml配置与解决方案 a) 完全相同的示例:

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: apps2deploy
  namespace: argocd
spec:
  destinations:
    - namespace: default
      server: https://kubernetes.default.svc
  sourceRepos:
    - '*'
  roles:
    - description: project role to create and sync apps from a CI/CD pipeline
      name: create-sync
      policies:
      - p, proj:apps2deploy:create-sync, applications, get, apps2deploy/*, allow
      - p, proj:apps2deploy:create-sync, applications, create, apps2deploy/*, allow
      - p, proj:apps2deploy:create-sync, applications, update, apps2deploy/*, allow
      - p, proj:apps2deploy:create-sync, applications, delete, apps2deploy/*, allow
      - p, proj:apps2deploy:create-sync, applications, sync, apps2deploy/*, allow

argocd app create从 Tekton(或其他 CI 管道)中成功完成只剩下 2 个步骤。我们需要apply清单

kubectl apply -f argocd-appproject-apps2deploy.yml

而且我们需要创建一个角色token,理想情况下直接分配给ARGOCD_AUTH_TOKENforargocd login命令(后面也需要做):

ARGOCD_AUTH_TOKEN=$(argocd proj role create-token apps2deploy create-sync --token-only)

argocd app create解决方案 1.) 中提到的相同命令现在应该可以工作:

argocd app create microservice-api-spring-boot --repo https://gitlab.com/jonashackt/microservice-api-spring-boot-config.git --path deployment --project apps2deploy --dest-server https://kubernetes.default.svc --dest-namespace default --revision argocd --sync-policy auto
于 2022-02-09T15:33:01.320 回答