Argo CD 를 AWS EKS 에 사용하기

이준석·2022년 2월 19일
3

Infra

목록 보기
1/5
post-thumbnail

서론

최근 회사에서 Argo CD 도입을 고려하여 우선적으로 AWS EKS 에서 사용 하기 위해 인프라를 구성해보았다. 완벽한 구성인지는 잘 모르겠지만 내가 아는 지식으로는 최선의 방법만을 사용했고 잘 동작하는 모습까지 확인했다. 따라서 해당 부분을 까먹기전에 기록용으로 작성해두는 부분이지만 혹여나 검색해서 들어오는 사람들에게 조금이나마 도움이 되었으면 좋겠다.
(실제로 하면서 작성하는 글이 아니고 했던 부분을 정리하는 부분으로 누락되거나 비약된 부분이 있을수도 있습니다 😢)

본격적으로 Argo CD 에 들어가기에 앞서 아이스 브레이킹으로 Argo CD 이름에 대한 유래를 뇌피셜로 추측해보았다.

  • 첫번째 뇌피셜은 Argo 가 그리스 로마 신화의 이아손이 영웅들과 함께 아르고 호를 타고 원정을 떠난 이야기가 있다. 따라서 쿠버네티스의 아이콘인 키와 어울리는 배의 이름으로 지은것이 아닌가 추측한다.
  • 두번째 뇌피셜은 집낙지의 학명이 Argonauta hians 인 점을 고려해보면 맨 앞의 Argo 만 따서 지은 이름일 수도 있을꺼 같다.

왼쪽부터 Argo CD 아이콘과 Kubernetes 아이콘 (출처: 구글 이미지)

본론

저는 EKS 구성을 CDK 를 이용하였고 Fargate 를 이용해서 구성하였다. EKS 는 구성이 완료되었다고 가정한 후에 포스팅을 할 예정이다. (CDK 예제 소스)

또한, Argo CDargocd 네임스페이스 위에 설치할 예정인데 미리 argocd 네임스페이스에 대한 fargate profile 이 구성되어 있어야지만 정상적으로 pod 가 스케줄링 되면서 리소스들을 사용할 수 있다.

만약 0/2 nodes are available: 2 node(s) had taints that the pod didn't tolerate 와 같은 비슷한 에러가 뜬다면 해당 네임스페이스에 fargate profile 설정되지 않은 확률이 높음으로 fargate profile 을 생성해줄 수 있도록 한다. (링크)

이젠 진짜로 Argo CDEKS 에 설치하도록 하자.

EKS Cluster AWS CLI에 연결하기

먼저 EKS Cluster 를 다음 명령어를 이용해서 연결할 수 있도록 한다. (링크)

aws eks update-kubeconfig \
--region <eks가 설치된 aws region> \
--name <eks cluster 이름> \
--role-arn <eks cluster에 주어진 role arn>

따라서 위에 양식대로 작성해보면 다음과 같이 작성된다. (예시)

aws eks update-kubeconfig \
--region ap-northeast-2 \
--name argocd-cluster \
--role-arn arn:aws:iam::<AWS_ACCOUNT_ID>:role/<생성한 롤 이름>

연결이 되면 터미널로 kubectl 명령을 이용해서 EKS Cluster 리소스들을 조회할 수 있게 된다. (kubectl 설치가 안된 경우 해당 링크에 들어가서 설치할 수 있도록 한다.)

EKS Cluster에 argocd 네임스페이스 생성하기

EKS 안에 argocd 네임스페이스를 생성해야하는데 굳이 argocd 네임스페이스에 설치하는 이유는 install.yaml 파일안에 설정된 네임스페이스가 argocd 로 설정되어있어서 고치기가 귀찮아서 그냥 argocd 네임스페이스를 만들고 생성한다.

kubectl create ns argocd

고로 커스텀한 네임스페이스에 argocd 를 설치하려면 수작업으로 한땀 한땀 네임스페이스 이름을 수정해주고 설치해야 하는 것 같다. (제가 테스트했을땐 다른 네임스페이스에 다운로드하면 네임스페이스가 안맞아서 에러가 발생했는데 잘 모르고 하는 소리일 수 있습니다.)

물론 argocd 네임스페이스에는 fargate profile 이 생성되어있다.

argocd 네임스페이스에 Argo CD 설치하기

argocd 네임스페이스에 argocd를 설치할꺼고 명령은 다음과 같다.

kubectl apply -n argocd \
-f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

그리고나서 해당 네임스페이스를 조회해보면 다음과 같이 리소스들이 생성될 것이다. (전체적으로 이미지를 다운받고 파드가 실행되기까지 2~3분정도 소요가 됨으로 기다리셔야 됩니다.)
(Service의 Cluster IP는 삭제했습니다!)
kubectl 명령어 링크

$ kubectl get all -n argocd

NAME                                      READY   STATUS    RESTARTS   AGE
pod/argocd-application-controller-0       1/1     Running   0          30h
pod/argocd-dex-server-65bf5f4fc7-8x8l8    1/1     Running   0          30h
pod/argocd-redis-d486999b7-hwqdt          1/1     Running   0          30h
pod/argocd-repo-server-8465d84869-lbzgc   1/1     Running   0          30h
pod/argocd-server-86c6c74f94-fxqzx        1/1     Running   0          30h

NAME                            TYPE         EXTERNAL-IP   PORT(S)                      AGE
service/argocd-dex-server       ClusterIP    <none>        5556/TCP,5557/TCP,5558/TCP   30h
service/argocd-metrics          ClusterIP    <none>        8082/TCP                     30h
service/argocd-redis            ClusterIP    <none>        6379/TCP                     30h
service/argocd-repo-server      ClusterIP    <none>        8081/TCP,8084/TCP            30h
service/argocd-server           ClusterIP    <none>        80/TCP,443/TCP               30h
service/argocd-server-metrics   ClusterIP    <none>        8083/TCP                     30h
service/prod-argocd-service     ClusterIP    <none>        80/TCP                       30h

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/argocd-dex-server    1/1     1            1           30h
deployment.apps/argocd-redis         1/1     1            1           30h
deployment.apps/argocd-repo-server   1/1     1            1           30h
deployment.apps/argocd-server        1/1     1            1           30h

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/argocd-dex-server-65bf5f4fc7    1         1         1       30h
replicaset.apps/argocd-redis-d486999b7          1         1         1       30h
replicaset.apps/argocd-repo-server-8465d84869   1         1         1       30h
replicaset.apps/argocd-server-86c6c74f94        1         1         1       30h
replicaset.apps/argocd-server-87b47d787         0         0         0       30h

NAME                                             READY   AGE
statefulset.apps/argocd-application-controller   1/1     30h

만약 파드의 상태가 pending 에서 상태가 변하지 않는 경우 다음 명령을 통해서 로그를 살펴보고 로그에 맞는 대처를 해주셔야 합니다.

$ kubectl get pods -n argocd : 파드 전체 조회
$ kubectl describe pods [pod-name] -n argocd : 특정 파트 설정 보기

위에서도 언급했듯이 대체로 pending 상태에서 변하지 않는 이유는 네임스페이스가 안맞는 곳에 설치했거나 fargate profile 이 생성이 되지 않은 경우였습니다.

Argo CD 로드밸런서 생성하기 (feat. kubernetes ingress)

이제 설치한 Argo CD 에 접속해야 하는데 쿠버네티스의 인그레스 리소스를 이용해서 외부와 통신을 할 수 있도록 할 예정이다.

간략하게 인그레스에 설명하면 한 네임스페이스 안에 여러개의 서비스들이 존재하고 서비스 안에는 여러개의 파드가 존재할 수 있다. 이때 외부에서 인그레스의 라우팅을 이용해서 원하는 서비스에 접근해서 실제 애플리케이션에 접근할 수 있도록 해주는 리소스이다. 그림은 아래와 같고, 쿠버네티스 공식 홈페이지에서 가져왔다.

인그레스 YAML 파일은 다음과 같다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/certificate-arn: <인증서 arn>
    alb.ingress.kubernetes.io/healthcheck-path: /
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    kubernetes.io/ingress.class: alb
  finalizers:
  - ingress.k8s.aws/resources
  labels:
    app: velog-test
    tier: backend
  name: argocd-ingress # 인그레스 이름 정하기
  namespace: argocd    # 설치할 네임스페이스
spec:
  rules:
  - http:
      paths:
      - backend:
          service:
            name: argocd-server # 연결할 서비스 (이부분은 고정)
            port:
              number: 80 # (이부분도 고정)
        path: /*
        pathType: ImplementationSpecific

해당 파일을 복사해서 YAML 파일로 저장하고 kubectl 명령을 이용해서 argocd 네임스페이스에 설치할 수 있도록 한다.

kubectl apply -f <ingress yaml 경로> -n argocd

YAML 파일을 보면 spec 밑에 service 부분에 argocd-server 라는 부분이 적혀있는데 해당 서비스 내부에 Argo CD 홈페이지가 설치되어 있고 우리는 홈페이지 UI에 접근하려고 해당 서비스를 Ingress 에 연결한 것이다.

실제로 서비스를 조회해보면 argocd-server 라는 서비스가 존재한다. (80 포트로 뚫려있기 때문에 80 포트로 number 를 설정해준 것이다.) (Cluster IP는 삭제했습니다!)

$ kubectl get svc -n argocd
NAME                    TYPE        EXTERNAL-IP   PORT(S)                      AGE
argocd-dex-server       ClusterIP   <none>        5556/TCP,5557/TCP,5558/TCP   30h
argocd-metrics          ClusterIP   <none>        8082/TCP                     30h
argocd-redis            ClusterIP   <none>        6379/TCP                     30h
argocd-repo-server      ClusterIP   <none>        8081/TCP,8084/TCP            30h
> argocd-server           ClusterIP <none>        80/TCP,443/TCP               30h
argocd-server-metrics   ClusterIP   <none>        8083/TCP                     30h
prod-argocd-service     ClusterIP   <none>        80/TCP                       30h

ingress 조회해보면 다음과 같이 리스트가 뜨고 ADDRESS가 나오게 된다.

NAME                  CLASS    HOSTS   ADDRESS                                                                      PORTS   AGE
prod-argocd-ingress   <none>   *       k8s-XXXXX-XXXXXX-XXXXXX-XXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXX.elb.amazonaws.com   80      30h

그리고 실제로 EC2 > 로드밸런싱 탭으로 들어가보면 Application Loadbalancer가 생성된 모습도 확인할 수 있다. (보안상 캡처는 생략합니다.)

로드밸런서 대상 그룹 확인하기

EC2 > 로드밸런싱 > 로드밸런서 > 방금 생성한 로드밸런서 클릭 > 리스터 > 규칙 보기/편집 경로로 들어가면 다음과 같은 대상 그룹을 확인할 수 있다.

위의 링크를 클릭하고 대상 그룹 선택 후 Targets 탭을 클릭하면 실제 로드밸런서와 연결된 파드의 IP 주소가 나오고 정상적으로 연결이 되었는지 확인할 수 있다.

(저는 헬스체크 경로를 잘못 설정해서 404 에러가 떴는데 정상적으로 서비스 이용은 가능합니다.)

그래서 대상 그룹 확인은 왜 하냐? 해당 부분을 보면 두가지 에러가 뜰 가능성이 있다. 에러가 뜬 이유는 다음과 같다.

  • Request timeout : 설정은 잘 되었으나 특정 IP 및 보안 그룹이 EKS Cluster 보안 그룹에 뚫려있지 않은 경우
  • Bad Gateway : Ingress service 설정을 잘못한 경우 (이름이 틀렸다거나 포트가 다를 경우)

인프라를 구성하면서 2가지 에러가 주로 떴고 발생한 이유가 대략 저런 이유였던 것으로 기억이 된다.

EKS Cluster 보안 그룹에 로드밸런서 보안 그룹 추가하기

위에서 설명했듯이 EKS Cluster 보안 그룹에 로드밸런서가 접근하지 못하도록 설정되어있다. 따라서 접근할 수 있도록 인바운드 규칙을 추가해주어야 한다. (로드밸런서 보안 그룹은 로드밸런서 를 선택해서 찾아볼 수 있다.)

EKS Cluster 보안 그룹은 EKS > 클러스터 선택 > 구성 > 네트워크 > 클러스터 보안 그룹 해당 부분에 파랗게 링크된 보안 그룹을 클릭해서 들어가면 안 헷갈리게 찾아서 들어갈 수 있다. (보안 그룹을 잘 찾을 수 있으면 EC2 > 네트워크 및 보안 > 보안 그룹 에 들어가서 찾아도 된다.)

따라서 EKS Cluster 보안 그룹에 모든 트래픽으로 유형을 선택한 뒤 소스 부분에 로드밸런서 보안 그룹을 추가한다. 해당 부분을 추가해야 로드밸런서가 EKS Cluster 의 리소스에 접근할 수 있다.

만약 EKS Cluster 보안그룹에 8080 포트 설정이 없다면 로드밸런서 보안그룹리 접근할 수 있도록 8080포트에 대해서 설정해줄 수 있도록 한다.

Argo CD 접속하기

위의 설정이 끝났다면 로드밸런서 DNS 주소를 통해서 Argo CD 홈페이지를 접속해보도록 하자. 아래와 같은 화면이 떴다면 정상적으로 실행된 것이다.

Argo CD를 설치하면 기본적으로 관리자 계정을 생성해준다. 관리자 계정의 패스워드 확인 CLI는 다음과 같다.

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

Username: admin
Password: <위에서 조회한 값>

로그인 하면 아래과 같이 메인 페이지가 뜨게 된다.

여기까지 들어왔으면 이제 다 끝났다고 봐도 된다. Argo CD 자체는 사용이 정말 쉽게 되어있다.

Argo CD Git repo 등록하기

우리는 데모로 사용할 Git repo 를 등록할건데 Argo CD 에서 제공하는 Git repo 로 등록해보도록 하자.

왼쪽 톱니바퀴 버튼을 누르고 Repositories 탭으로 들어간다. 그 다음 가장 쉬운 방법이라고 생각되는 CONNECT REPO USING REPO HTTP 버튼을 누르고 다음의 정보를 입력한다.
(우리는 여기서 helm 차트 예제를 사용할 것이다. helm에 대한 정보는 링크를 통해 살펴본다.)

CONNECT 버튼을 누르면 다음과 같이 Successful 이 뜰 것이다.

Argo CD Application 생성하기

이젠 등록된 Git repo 를 사용할 애플리케이션을 생성해도록 하자. 톱니바퀴 위에 사각형 3개가 나란히 있는 버튼을 눌러 NEW APP 버튼을 클릭한다. 그리고 다음을 입력한다.

  • GENERAL
    - Application Name: <원하는 이름>
    - Project: default
    - SYNC POLICY: Automatic
    - ✅ PRUNE RESOURCES
    - ✅ SELF HEAL
  • SOURCE
    - Repository URL: <아까 설정한 주소>
    - Revision: HEAD
    - Path: helm-guestbook
  • DESTINATION
    - Cluster URL: https://kubernetes.default.svc
    - Namespace: default (자신이 원하는 네임스페이스로 설정해도됨, 단 fargate profile 설정이 된 네임스페이스로 지정해야됨)

위의 설정이 끝났다면 CREATE 버튼을 눌러서 설정을 마무리한다. 그리고 시간이 지나서 파드 생성이 완료되면 다음과 같은 화면이 뜬다.

Argo CD 의 장점 중 하나가 쿠버네티스 리소스들을 UI를 이용해서 관리할 수 있는 부분이 있어서 꽤나 편리한 툴임엔 틀림없다.

쿠버네티스 리소스 설정 변경해보기

Helm 을 이용해서 쿠버네티스 리소스를 사용한 이유는 바로 설정 값 변경을 Argo CD 를 이용해서 할 수 있기 때문에 너무나도 간편하다. 위의 화면에서 APP DETAILS 버튼을 누르고 PARAMETERS 탭으로 들어가면 환경 설정 값들이 리스트 되어있다.

여기서 EDIT 버튼을 누르고 service typeport 를 변경해보도록 하겠다.

정확한 비교를 위해 설정을 변경하기 전에 servicetypeport 는 다음과 같다.


(포트는 80이고 Type은 ClusterIP 이다.)

따라서 다음과 같이 수정하고 살펴보면 다음과 같다.


이렇게 쉽게 설정 값들을 변경할 수 있다. 실제로 연결된 Git repo 에 들어가서 설정 값들을 수정하면 3분뒤에 자동으로 쿠버네티스 리소스들이 Sync 가 되는데 그 이유는 애플리케이션 생성당시 SELF HEAL 옵션에 체크했기 때문이다. (기본적으로 자동 Sync 에 대해서 설정되어 있지 않다.)

결론

하나씩 하면서 작성한 글이 아니고 기억을 더듬어 작성한 글이라 다시 말하지만 비약이 있을 수 있고 어딘가 구멍이 뚫린 것 같은 부분이 있을 수 있습니다. 하지만 최대한 구성할 수 있게끔 자세하게 작성했다고 생각을 하고 있고, 만약 이해가 안되거나 잘못된 부분 댓글로 남겨주시면 최대한 빠르게 답변 드리도록 하겠습니다.

그럼 모두들 성공적인 Argo CD 사용하시길 바라며 이만 총총..🏃

참고자료

Argo CD 공식 홈페이지
Argo CD Sync Option
Argo CD Git example
Helm 이란

profile
호주 워홀중

0개의 댓글