

배경 상황
ArgoCD로 클러스터 부트스트랩 구성을 진행하고 있다.
kustomize로 ArgoCD 배포 → ArgoCD 애플리케이션 배포해서 ArgoCD 설정 선언적으로 관리 → App of Apps 패턴으로 나머지 애플리케이션 배포 하는 절차를 통해 EKS 클러스터에서 사용할 대부분의 워크로드를 선언적으로 관리하려고 하는데 kustomize로 ArgoCD를 배포할 때 ArgoCD에 Github 저장소를 등록해야 나머지 절차(ArgoCD Appliation으로 워크로드 배포)를 진행할 수 있다.
GUI로 ArgoCD에 Github 저장소 등록하기
구글에서 ArgoCD 튜토리얼을 찾아보면 처음에는 대부분 GUI(혹은 CLI)로 등록하는 방법을 안내해주는데(ArgoCD GUI 접속 > Settings > Repositories > Connect Repo로 연결 정보 입력), 클러스터 부트스트랩을 매끄럽게 진행하기 위해서는 Github Repo도 선언적으로 관리해주는 것이 좋다.


선언적으로 ArgoCD에 Github 저장소 등록하기(Secret 활용)
위처럼 등록한 Repository 정보는 k8s Secret으로 저장되는데, 반대로 아래처럼 k8s Secret을 직접 작성해서 배포하면 선언적으로 깃 저장소 등록을 관리할 수 있다. 이 때 ArgoCD Repository 정보임을 나타내는 argocd.argoproj.io/secret-type: repository 레이블을 반드시 추가해주어야한다.
apiVersion: v1
kind: Secret
metadata:
name: private-repo
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
stringData:
type: git
url: <https://github.com/argoproj/private-repo>
password: my-password
username: my-username
project: my-project
선언적으로 ArgoCD에 Github 저장소 등록하기(ExternalSecrets 활용)
하지만 위 처럼 Secret을 작성하게되면 패스워드가 깃 저장소에 그대로 들어가게 되는 문제가 발생하게 되는데, External Secrets를 활용하면 깃헙에 직접적으로 패스워드를 작성하지 않아도 런타임에서 Secret을 생성할 수 있다. Git Credential 정보를 Secrets Manager 를 이용해서 rotation하는 구성은 필요 없을 듯 해서 무료 서비스인 Parameter Store를 활용했다.
먼저 링크를 참조해 클러스터에 External Secrets을 설치한다.
[Kubernetes]External Secrets란? 설치 및 구성방법 (GitOps 도입 시 크레덴셜 정보 안전하게 저장하기)
배경 상황쿠버네티스 환경에서 깃옵스(GitOps)를 하려고 하면 k8s 매니페스트 파일을 깃헙이나 깃랩같은 코드 저장소에 저장하게 된다. 이렇게 ArgoCD를 이용해서 애플리케이션 부트스트래핑 구성
canaryrelease.tistory.com
다음으로는 ClusterSecretStore를 생성해 Parameter Store와의 연결 정보를 구성해준다. 나는 IRSA 구성을 진행했기 때문에 jwt 토큰을 발급받아 인증할 수 있게끔 구성해주었다.
apiVersion: external-secrets.io/v1
kind: ClusterSecretStore
metadata:
name: aws-parameter-store
spec:
provider:
aws:
service: ParameterStore
region: ap-northeast-2
auth:
jwt:
serviceAccountRef:
name: external-secrets # ESO 컨트롤러의 서비스 어카운트 이름
namespace: external-secrets # ESO가 설치된 네임스페이스
다음으로는 Parameter Store에 저장된 값을 읽어 Secret 리소스를 생성하기 위해 ExternalSecret 리소스를 생성해준다.
- secretStoreRef에는 사용할 ClusterSecretStore 정보를 넣어준다.
- target.name에는 Secret 이름을 정의한다.
- target.template은 Secret 리소스 템플릿이라고 생각하면 된다.
- target.template.metadata.labels 에 argocd.argoproj.io/secret-type: repository 값을 반드시 설정해준다(ArgoCD가 repository 정보라는 것을 인식하기 위한 용도)
- data에는 Secret에 저장할 정보들을 입력해준다.
- {{ .secretKey값 }} 과 같은 템플릿 문법을 통해 Parameter Store에 저장된 값을 읽어 시크릿을 구성할수도 있고, 명시적으로 정의한 값을 활용할수도 있다.
- spec.data에는 Parameter Store의 어느 값을 가져올 지에 대한 정보를 입력해주면 된다.
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: repo-test-app
namespace: argocd
spec:
secretStoreRef:
name: aws-parameter-store
kind: ClusterSecretStore
target:
name: repo-test-app
creationPolicy: Owner
template:
metadata:
labels:
argocd.argoproj.io/secret-type: repository
data:
# 정적 값
type: "git"
name: "repo-test-app"
# 동적 값
url: "{{ .url }}"
username: "{{ .username }}"
password: "{{ .password }}"
data:
- secretKey: url
remoteRef:
key: /parameter-store-path/url
- secretKey: username
remoteRef:
key: /parameter-store-path/username
- secretKey: password
remoteRef:
key: /parameter-store-path/password
이렇게 매니페스트 파일을 구성해서 적용하면 소스코드 저장소에 크레덴셜을 직접 입력하지 않고도 ArgoCD에 Repository 정보를 등록할 수 있다.