목표
- ArgoCD Image Updater를 이용해서 GitOps가 아닌 RegistryOps CD를 구축합니다.
- Harbor(Private Registry)와 연동하여 Helm Application을 배포 해봅니다.
- ECR의 경우 포스팅을 잘해주셔서 아래 글을 참고하시면 될 것 같습니다
- https://velog.io/@junsugi/Argo-CD-Image-Updater-사용하기-with.-AWS-EKS#결론
설치
argocd image updater를 설치합니다.
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml # 설치 확인 kubectl get pod -n argocd | grep updater argocd-image-updater-5ffdf575c4-ljsn2 1/1 Running 0 50s
API용 계정 생성
api 접근 용도로 사용할 계정을 생성합니다.
kubectl edit configmap argocd-cm -n argocd
apiVersion: v1
kind: ConfigMap
data:
# api 접근 용도로만 사용할꺼기 때문에 apiKey 만 적어준다
accounts.image-updater: apiKey
#생략
argocd login $server
argocd account list
NAME ENABLED CAPABILITIES
admin true login
image-updater true apiKey
Image Updater가 사용하는 ArgoCD 계정 생성
image updater가 사용할 ArgoCD Account를 생성합니다.
생성한 토큰을 시크릿으로 생성합니다.
### argocd 계정 생성
argocd account generate-token --account image-updater --id image-updater
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJpbWFnZS11cGRhdGVyOmFwaUtleSIsIm5iZiI6MTcwMjIwNTAxOSwiaWF0IjoxNzAyMjA1MDE5LCJqdGkiOiJpbWFnZS11cGRhdGVyIn0.aq
YOUR_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJpbWFnZS11cGRhdGVyOmFwaUtleSIsIm5iZiI6MTcwMjIwNTAxOSwiaWF0IjoxNzAyMjA1MDE5LCJqdGkiOiJpbWFnZS11cGRhdGVyIn0.aq
# 계정정보 시크릿 생성
kubectl create secret generic argocd-image-updater-secret \
--from-literal argocd.token=$YOUR_TOKEN --dry-run -o yaml |
kubectl -n argocd apply -f -
# ECR
계정 권한 설정
생성한 계정의 RBAC 권한을 설정합니다.
kubectl edit configmap argocd-rbac-cm -n argocd
apiVersion: v1
kind: ConfigMap
data:
policy.csv: |
p, role:image-updater, applications, get, */*, allow
p, role:image-updater, applications, update, */*, allow
g, image-updater, role:image-updater
policy.default: role.readonly
# 생략
ArgoCD Endpoint 설정
- Image Updater에서 연결할 ArgoCD 엔드포인트를 설정합니다.
- 주요한 필드는 다음과 같습니다.
plaintext
: http/https 여부insecure
: 인증서 무시 여부- argocd.server_addr: <argocd 접속 주소>
- ArgoCD 엔드 포인트는 내부 서비스 디스커버리 주소인 argocd-server.argocd.svc로 연결하겠습니다.
kubectl edit configmap argocd-image-updater-config -n argocd
# 예시
apiVersion: v1
data:
applications_api: argocd
argocd.grpc_web: "true"
argocd.insecure: "false"
argocd.plaintext: "true"
argocd.server_addr: argocd-server.argocd.svc
레지스트리 인증 시크릿 생성
연결할 레지스트리 imagePullSecret을 생성합니다.
kubectl create secret docker-registry harbor-creds \
--docker-server=<Harbor URL>\
--docker-username=<Harbor Account> \
--docker-password=<Harbor Password> \
-n <argocd namespace>
이미지 레지스트리 설정
api_url
Harbor 엔드포인트 주소prefix
프로토콜(http/https)를 제외한 주소credentials
위에서 만든 레지스트리 인증 시크릿 및 네임스페이스tagsortmode
태그 이미지 sort 방식
kubectl edit configmap argocd-image-updater-config -n argocd
# HARBOR
registries.conf: | <-- 추가
registries:
- name: Harbor
api_url: <HARBOR_API_URL>
prefix: <HARBOR_PREFIX>
ping: yes
credentials: pullsecret:<NAMESPACE>/<IMAGE_PULL_SECRET>
insecure: yes
tagsortmode: latest-last
# image-updater 파드 접속
kubectl exec -it -n deploy $pod
# 레지스트리 연결 테스트
argocd-image-updater test <HARBOR_IMAGE_NAME> --registries-conf-path app/config/registries.conf
ArgoCD Application 등록
- ArgoCD 애플리케이션을 declarative 방식으로 생성합니다.
- image-updater 설정 정보를 anotations에 등록합니다.
# Helm Guest Book
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
annotations:
argocd-image-updater.argoproj.io/image-list: <HARBOR_IMAGE_NAME>
argocd-image-updater.argoproj.io/org_app.update-strategy: latest
name: guestbook-image-updater
namespace: deploy
spec:
destination:
namespace: guestbook
server: https://kubernetes.default.svc
project: default
source:
path: helm-guestbook
repoURL: https://github.com/argocd-example-apps/argocd-example-apps
targetRevision: HEAD
# applcation
project: default
source:
repoURL: 'https://github.com/argoproj/argocd-example-apps.git'
path: helm-guestbook
targetRevision: HEAD
helm:
parameters:
- name: image.name
value: <HARBOR_IMAGE_NAME>
forceString: true
- name: image.tag
value: '0.2'
forceString: true
destination:
server: 'https://kubernetes.default.svc'
namespace: default
syncPolicy:
automated: {}
# image-updater-config
등록한 이미지 태그를 변경하여 레지스트리에 푸시할 시, 다음과 같이 ArgoCD 애플리케이션이 OutOfSync되는 것을 볼 수 있습니다.
결론
고객사의 환경이 폐쇄망인데다가 깃 레포지토리(GitLab,Bitbucket,Github)등을 사용할 수없는 환경이여서(금융권은 아직도 git을 잘 활용하고 있는 것 같지는 않다.) 찾아보니 image-updater라는 좋은 ArgoCD 플러그인이 있어 도입하게 되었다(git없는 ArgoCD 사용이라니..) 하지만 Image-Updater의 치명적인 단점은 Helm과 kustomize만 지원한다는 것이였다. 고객사는 쿠버네티스를 이제 막 도입하기 때문에, 애플리케이션을 간단한 yaml로만 작성해서 배포하고 있었다. 결국 어쩔 수없이, iamge-updater를 사용하기 위해서 간단한 Helm 차트를 만들어서 배포하기로 하였다. 실무에서 위와 같은 이유들로, Image-Updater를 분명 활용하는 곳도 있지만, 메니페스트 파일을 추적하고 관리하는데 있어서 GitOps를 도입하는 것이 더 좋다고 생각이 들었다. CICD에서 GitOps가 왜 좋은지 대세인지, 알 수 있는 그런.. 경험이었던 것 같다.
Ref
https://velog.io/@junsugi/Argo-CD-Image-Updater-사용하기-with.-AWS-EKS#결론
https://argocd-image-updater.readthedocs.io/en/stable/basics/authentication/#using-a-pull-secret
'CICD' 카테고리의 다른 글
docker build 시, 빌드 명령어 결과 출력하기(--progress=plain) (0) | 2024.03.18 |
---|---|
ArgoCD 외부 EKS 클러스터 연동(Add Cluster) (0) | 2023.12.02 |
사설 이미지 저장소(Harbor)에 컨테이너 이미지 푸시 (0) | 2023.09.02 |