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 を内包したセットアップの紹介でした。