ArgoCD Vault Plugin을 적용하면 Secret 리소스를 만들 때 값을 하드코딩해서 입력하지 않고 Vault에 저장된 값을 가져와서 생성 시에 주입할 수 있음 (참고 블로그)
apiVersion: v1
kind: Secret
metadata:
name: first-application-secret
annotations:
avp.kubernetes.io/path: "secret/data/first-application/secret"
type: Opaque
data:
DB_USERNAME: <db-user | base64encode>
DB_PASSWORD: <db-password | base64encode>
DB_ROOT_PASSWORD: <db-root-password | base64encode>
.
├── applications
│ ├── first-application-applicationset.yaml
│ └── second-application-applicationset.yaml
└── clusters
├── eks-kafka
│ └── first-application
│ ├── base
│ │ ├── deployment.yaml
│ │ ├── ingress.yaml
│ │ ├── kustomization.yaml
│ │ ├── secret.yaml
│ │ └── service.yaml
│ └── overlays
│ ├── dev
│ │ ├── ingress.yaml
│ │ ├── kustomization.yaml
│ │ └── secret.yaml
│ └── prod
│ ├── ingress.yaml
│ ├── kustomization.yaml
│ └── secret.yaml
└── rke2-on-premise
└── second-application
├── base
│ ├── deployment.yaml
│ ├── ingress.yaml
│ ├── kustomization.yaml
│ └── service.yaml
└── overlays
├── dev
│ ├── ingress.yaml
│ └── kustomization.yaml
└── prod
├── ingress.yaml
└── kustomization.yaml
아래 사진처럼 kustomize + argocd-vault-plugin 을 활용하려니 에러가 발생함.
기본적으로 plugin 별로 컨테이너가 추가 되어야 함.
그리고 가이드 상에서는 argocd-vault-plugin만 initcontainer를 통해 설치하기 때문에 helm과 kustomize도 사용자가 직접 깔아줘야 함

Pydantic의 BaseSettings 객체를 사용하면, 환경 변수로부터 자동으로 값을 불러와서 설정 객체를 생성해줌
| ini | omegaconf | Pydantic’s BaseSettings | |
|---|---|---|---|
| attribute access | |||
| (config.foo.bar로 가져올 수 있는가?) | X | O | O |
| 환경 변수로부터 자동으로 값을 불러오는가? | X | SoSo | |
oc.env Resolver로 가능은 함. 단, yaml에 미리 환경변수로 가져와야 한다고 명시해야 함 |
O | ||
| .env 파일로부터 값을 불러올 수 있는가? | X | X | |
yaml, json 만 지원 |
O | ||
생성 시 인자 → 환경 변수 → env_file → default 값 순서대로 불러옴 |
|||
| 복수 개의 설정 파일로부터 merge 할 수 있는가? | X | O | |
OmegaConf.merge(c1, c2) |
O | ||
복수개의 env_file 파일 리스트로 제공 가능 |
|||
| 데이터 타입에 맞추어서 지정해주는가? | X | X | O |
| Nested 데이터 구조를 읽어올 수 있는가? | X | O | SoSo |
미리 데이터 구조를 정의해놓으면 가능함 |
import os
from pydantic import BaseSettings
class Settings(BaseSettings):
DB_DSN: str
DB_PASSWORD: str
settings = Settings()
DB_DSN = settings.DB_DSN
DB_PASSWORD = settings.DB_PASSWORD
Vault CLI를 활용해서 on-the-fly로 실행하는 환경에 vault로부터 시크릿을 읽어와서 환경변수로 주입하기
export DB_DSN=$(vault read -field=first-application-secret secret/db-dsn)
export DB_PASSWORD=$(vault read -field=first-application-secret secret/db-password)
python main.py