ArgoCD に argocd-vault-plugin を initContainer と sidecar で構成する

argocd-vault-plugin を initContainer と sidecar で構成する Helm を紹介します。
Helm chart version: 6.7.3
App vercion: v2.10.4

経緯

ConfigMap plugin 構成で argocd-vault-plugin を利用していたが非推奨となったので、 Sidecar plugin 構成に変更した。
https://argo-cd.readthedocs.io/en/release-2.6/operator-manual/config-management-plugins/#installing-a-config-management-plugin

構築

Secret

vault と連携するための secret を作成します。

kind: Secret
apiVersion: v1
metadata:
  name: argocd-vault-plugin-credentials
  namespace: argocd
stringData:
  AVP_AUTH_TYPE: "k8s" 
  AVP_K8S_ROLE: "argocd"
  AVP_TYPE: "vault"
  VAULT_ADDR: "http://vault.vault.svc.cluster.local:8200"

Helm values.yaml

configs.cmp.plugins にある argocd-vault-pugin-helm の名前で cmp の ファイルが作成される。そのため sidecar でマウントする subPath 名は helm の場合だと argocd-vault-plugin-helm.yaml となります。
initContainer で argocd-vault-plugin をインストールし、operator が sidecar を介して repo-server へ plugin を構成してくれます。

以下の values.yaml では initContainer で argocd-vault-plugin をインストールする URLが ARM64 となっているので環境に合わせて ENV を修正してください。
ポイントは automountServiceAccountToken: true を設定することです。
https://argocd-vault-plugin.readthedocs.io/en/stable/backends/#kubernetes-authentication

この設定を行うことで argocd のサービスアカウントのトークンが /var/run/secrets/kubernetes.io/serviceaccount/token に配置されるため、vault のセットアップで kubernetes 認証(token_reviewer_jwt)を設定する際に同様のパスを設定することで認証が行えるようになります。
https://developer.hashicorp.com/vault/docs/auth/kubernetes#configuring-kubernetes

上記の設定については以下の kubernetes 認証のところに記載しています。
https://www.aimhighergg.com/vault-argocd-vault-plugin/

global:
  logging:
    level: info
configs:
  cmp:
    create: true
    plugins:
      argocd-vault-plugin-helm:
        allowConcurrency: true
        discover:
          find:
            command:
              - sh
              - "-c"
              - "find . -name 'Chart.yaml' && find . -name 'values.yaml'"
        generate:
          command:
            - sh
            - "-c"
            - |
              helm template $ARGOCD_APP_NAME -n $ARGOCD_APP_NAMESPACE ${ARGOCD_ENV_HELM_ARGS} . |
              argocd-vault-plugin generate -s argocd:argocd-vault-plugin-credentials -
        lockRepo: false
      argocd-vault-plugin-kustomize:
        discover:
          find:
            command:
              - sh
              - "-c"
              - "find . -name '*.yaml' | xargs -I {} grep \"<path\\|avp\\.kubernetes\\.io\" {} | grep ."
        generate:
          command:
            - sh
            - "-c"
            - "kustomize build . | argocd-vault-plugin generate -s argocd:argocd-vault-plugin-credentials -"
        lockRepo: false
repoServer:
  name: repo-server
  replicas: 2
  serviceAccount:
    automountServiceAccountToken: true
  rbac:
    - verbs:
        - get
        - list
        - watch
      apiGroups:
        - ''
      resources:
        - secrets
        - configmaps
  envFrom: 
   - secretRef:
       name: argocd-vault-plugin-credentials
  initContainers:
    - name: download-tools
      image: alpine:3.19.1
      env:
        - name: AVP_VERSION
          value: "1.17.0"
        - name: CPU_ARCHITECTURE
          value: "linux_arm64"
      command: [sh, -c]
      args:
        - >-
          wget -O argocd-vault-plugin https://github.com/argoproj-labs/argocd-vault-plugin/releases/download/v${AVP_VERSION}/argocd-vault-plugin_${AVP_VERSION}_${CPU_ARCHITECTURE} &&
          chmod +x argocd-vault-plugin &&
          mv argocd-vault-plugin custom-tools/
      volumeMounts:
        - mountPath: /custom-tools
          name: custom-tools
  extraContainers:
    - name: avp-helm
      command: [/var/run/argocd/argocd-cmp-server]
      image: quay.io/argoproj/argocd:v2.10.4
      securityContext:
        runAsNonRoot: true
        runAsUser: 999
      volumeMounts:
        - name: var-files
          mountPath: /var/run/argocd
        - name: plugins
          mountPath: /home/argocd/cmp-server/plugins
        - name: argocd-cmp-cm
          mountPath: /home/argocd/cmp-server/config/plugin.yaml
          subPath: argocd-vault-plugin-helm.yaml
        - name: custom-tools
          mountPath: /usr/local/bin/argocd-vault-plugin
          subPath: argocd-vault-plugin
    - name: avp-kustomize
      command: [/var/run/argocd/argocd-cmp-server]
      image: quay.io/argoproj/argocd:v2.10.4
      securityContext:
        runAsNonRoot: true
        runAsUser: 999
      volumeMounts:
        - name: var-files
          mountPath: /var/run/argocd
        - name: plugins
          mountPath: /home/argocd/cmp-server/plugins
        - name: argocd-cmp-cm
          mountPath: /home/argocd/cmp-server/config/plugin.yaml
          subPath: argocd-vault-plugin-kustomize.yaml
        - name: custom-tools
          mountPath: /usr/local/bin/argocd-vault-plugin
          subPath: argocd-vault-plugin
  volumes:
    - name: argocd-cmp-cm
      configMap:
        name: argocd-cmp-cm
    - name: cmp-tmp
      emptyDir: {}
    - name: custom-tools
      emptyDir: {}
  volumeMounts:
    - name: argocd-cmp-cm
      mountPath: /home/argocd/cmp-server/config
    - name: custom-tools
      mountPath: /usr/local/bin/argocd-vault-plugin
      subPath: argocd-vault-plugin

Application

ConfigMap plugin 構成では cmp に generate のみ定義し Application で plugin を指定して実行していた。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: www-aimhighergg-com
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    repoURL: https://github.com/AbeYuki/aimhighergg-com.git
    targetRevision: HEAD
    path: overlay/prod/
    plugin: ### ここで plugin を指定
      name: argocd-vault-plugin 
  destination:
    server: https://kubernetes.default.svc
    namespace: www-aimhighergg-com
  syncPolicy:
    automated:
      prune: true
      selfHeal: false
    syncOptions:
    - CreateNamespace=true

Sidecar plugin 構成 から cmp に discover.find を定義することで、リポジトリに argocd-vault-plugin を利用する secret が存在すれば、argocd-vault-plugin が実行されるようにしています。
そのため Application では plugin を指定していません。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: www-aimhighergg-com
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    repoURL: https://github.com/AbeYuki/aimhighergg-com.git
    targetRevision: HEAD
    path: overlay/prod/
  destination:
    server: https://kubernetes.default.svc
    namespace: www-aimhighergg-com
  syncPolicy:
    automated:
      prune: true
      selfHeal: false
    syncOptions:
    - CreateNamespace=true

以上、 ArgoCD に Sidecar plugin 構成 で argocd-vault-plugin を内包したセットアップの紹介でした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です