CI 管道(GitHub Actions、Tekton 等)中的 argocd app create 抛出“PermissionDenied desc = 权限被拒绝:应用程序、创建、默认/myapp”

jon*_*ckt 2 continuous-deployment kubernetes gitops tekton argocd

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

kubectl patch configmap argocd-cm -n argocd -p '{"data": {"accounts.tekton": "apiKey"}}'
Run Code Online (Sandbox Code Playgroud)

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

argocd account generate-token --account tekton
Run Code Online (Sandbox Code Playgroud)

将此令牌作为 the passwordusername tekton我们做了argocd login类似的事情

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

现在,在我们的 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
Run Code Online (Sandbox Code Playgroud)

jon*_*ckt 5

Argo 的 useraccounts 文档中提到了这个问题:

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

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

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

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

  1. 使用argocdCLI
  2. 使用清单 YAML 文件

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

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

argocd proj create apps2deploy -d https://kubernetes.default.svc,default --src "*"
Run Code Online (Sandbox Code Playgroud)

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

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

argocd proj role create apps2deploy create-sync --description "project role to create and sync apps from a CI/CD pipeline"
Run Code Online (Sandbox Code Playgroud)

您可以使用 查看已创建的新角色argocd proj role list apps2deploy

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

argocd proj role create-token apps2deploy create-sync
Run Code Online (Sandbox Code Playgroud)

该令牌需要用于argocd login我们的 Tekton / CI 管道内的命令。--token-only该命令还有一个参数,因此我们可以通过以下方式创建环境变量

ARGOCD_AUTH_TOKEN=$(argocd proj role create-token apps2deploy create-sync --token-only)
Run Code Online (Sandbox Code Playgroud)

ARGOCD_AUTH_TOKEN被自动使用argo login

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

argocd proj create apps2deploy -d https://kubernetes.default.svc,default --src "*"
Run Code Online (Sandbox Code Playgroud)

查看 的角色策略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>
Run Code Online (Sandbox Code Playgroud)

最后,我们应该已经设置好一切以实现成功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
Run Code Online (Sandbox Code Playgroud)

2.) 使用清单 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
Run Code Online (Sandbox Code Playgroud)

只需 2 个步骤即可在 Tekton(或其他 CI 管道)内成功完成此操作argocd app create。我们需要apply清单

kubectl apply -f argocd-appproject-apps2deploy.yml
Run Code Online (Sandbox Code Playgroud)

我们需要创建一个角色令牌,最好将其直接分配给ARGOCD_AUTH_TOKEN命令argocd login(这也需要在之后完成):

ARGOCD_AUTH_TOKEN=$(argocd proj role create-token apps2deploy create-sync --token-only)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)