저번 시간에 Argo CD
를 AWS EKS
에 올려서 사용하는 방법에 대해서 알아보았다. 저번 시간은 Argo CD
의 설정과 간단한 프로젝트 생성에 대해서 봤다면 이번 포스팅에서는 조금 더 심도있게 VPC
가 다른 외부 클러스터를 Argo CD
에 추가해서 사용하는 방법에 대해서 설명할 예정이다.
이번 포스팅까지 작성하게되면 Argo CD
를 AWS
에서 사용하는 전반적인 흐름은 훑을 것으로 생각한다. 아마 추가하자면 이미지 태그를 자동으로 업데이트 해주는 argocd image updater
부분만 남지 않을까 싶은데 AWS ECR
을 공식적으로 지원해주지 않고 있어서 해당 레퍼런스를 찾으면서 적용해보려고 하고 있다. (적용이 되면 포스팅을 작성하도록 하겠습니다.)
그럼 각설하고 본론으로 들어가도록 하겠습니다.
여태까지 AWS
위에서 인프라를 만들면서 느낀바로는 AWS 에서 가장 핵심적이고 중요한 부분이 VPC
와 보안 그룹(Security Group) 이지 않을까 싶다. 갑자기 이런말을 하는 이유는 이번 포스팅에서도 해결해야 할 숙제 중 하나이기 때문이다.
현재 데모할 인프라 상황은 다음과 같습니다.
❗️
api-server
가 존재할eks
클러스터와argocd
가 존재하는eks
의VPC
가 다릅니다.
따라서 VPC
가 다르면 원칙적으로 서로 통신을 할 수 없습니다. 하지만 이 부분을 해결해 줄 수 있는 서비스가 AWS
에 존재합니다. 다른 리전에 존재하는 VPC
간의 통신도 가능하고 심지어 다른 게정에 존재하는 VPC
와 통신을 할 수도 있습니다.
해당 서비스는 VPC > 피어링 연결 에서 설정 할 수 있습니다.
AWS Management Console
에 로그인 한 후 VPC > 피어링 연결
을 선택해서 접속합니다.
들어간 후 피어링 생성을 클릭합니다.
다음과 같이 내용을 채워줍니다.
- name: 피어링 이름을 정해줍니다. (원하는 값 입력)
- 요청자: 연결을 원하는
VPC
중 하나- 수락자 : 연결을 원하는 나머지
VPC
(요청자와 수락자 순서는 중요하지 않기 때문에 연결을 원하는VPC
만 잘 선택해서 넣으시면 됩니다.)
전부 다 채웠으면 하단애 생성 버튼을 눌러서 피어링을 생성해줍니다. 생성을 하게 되면 수락 대기 중
상태로 남게 되는데 이를 수락을 눌러서 허용을 해주어야지 정상적으로 이용할 수 있습니다.
현재는 같은 리전, 같은 게정의
VPC
끼리 연결하기 때문에 요청자가 곧 수락자 입니다. 하지만 다른 리전 및 다른 계정의VPC
간에 피어링 연결을 하실 경우 해당 리전 혹은 계정으로 접속하시고 수락을 해주셔야지만 합니다.
피어링 연결을 생성했으면 VPC
라우팅 테이블에서 서로의 VPC CIDR
를 추가해주어야 한다. 저는 아직까진 잘 몰라서 각각의 VPC
로 조회해서 나온 라우팅 테이블 설정에 전부 다 추가해주었습니다.
(argocd-vpc
라우팅 테이블에 api-server-vpc
CIDR
추가하고 api-server-vpc
라우팅 테이블에 argocd-vpc
CIDR
추가를 해야지 양방향 통신이 가능해진다.)
이렇게 양쪽 라우팅 테이블에 다 추가하면 준비 완료이다.
이제 본격 외부 클러스터 추가하는 방법이다. 외부 클러스터를 추가하기 위해서는 api-server-cluster
가 kubectl
에 연결이 되어 있어야 한다. 만약 연결이 안되어있다면 다음 명령으로 연결할 수 있도록 한다.
$ aws eks update-kubeconfig \
--region <사용하는 리전>
--name <클러스터 이름>
--role-arn <사용하는 cluster master role arn>
master role
을 클러스터 생성 당시에 사용했으면 입력해주어야 권한 에러가 안뜨지만 사용하지 않고 생성했다면role-arn
옵션을 사용하지 않아도 연결이 될 것 같습니다.
잘 연결이 되었는지 다음 명령어를 통해서 현재 컨텍스트 값을 확인해본다.
$ kubectl config current-context
<클러스터 arn>
이전 포스팅에서 ArgoCD CLI
를 설치했다면 상관없지만 ArgoCD CLI
가 설치가 안되어있을 경우 다음 명령어로 ArgoCD CLI
를 설치해준다. Argo CD CLI Download
VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
sudo curl --silent --location -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-linux-amd64
sudo chmod +x /usr/local/bin/argocd
본인이 설치한 ArgoCD 주소를 이용해서 CLI로 로그인해준다.
$ argocd login <argocd 주소 (http, https 프로토콜은 빼고 입력)>
WARN[0013] Failed to invoke grpc call. Use flag --grpc-web in grpc calls. To avoid this warning message, use flag --grpc-web.
Username: admin
Password: <패스워드> --> 모를 경우 이전 포스트 참고
'admin:login' logged in successfully
Context <argocd 주소> updated
로그인이 완료 되었으면 Argo CD
에 클러스터를 추가하는 명령어를 입력한다. 그 전에 내가 추가할 클러스터의 이름을 조회하는 명령어는 다음과 같다.
$ kubectl config get-contexts -o name
<클러스터 arn 명>
$ argocd cluster add <클러스터 arn 명>
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context <클러스터 arn 명> with full cluster level admin privileges. Do you want to continue [y/N]? y
INFO[0012] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0013] ClusterRole "argocd-manager-role" updated
INFO[0013] ClusterRoleBinding "argocd-manager-role-binding" updated
WARN[0013] Failed to invoke grpc call. Use flag --grpc-web in grpc calls. To avoid this warning message, use flag --grpc-web.
FATA[0043] rpc error: code = Unknown desc = Get <클러스터 서버 엔드포인트>: dial tcp <클러스터 IP>:443: i/o timeout
아마도 dial tcp <ip>: i/o timeout
에러가 발생했을 것이다. 에러가 나야 정상이다.
왜냐하면 현재 다른 VPC
에 존재하는 클러스터를 추가하려고 하니까 방화벽으로 인해 접근이 안돼서 발생하는 것이다.
따라서 Argo CD
가 api-server cluster
에 접근할 수 있도록 보안그룹 인바운드를 설정해주어야 한다.
EC2 > 보안 그룹
탭으로 들어가서 찾아도 되지만 저 같은 경우는 확실하게 하기 위해서EKS > 해당 클러스터 > 구성 > 네트워크 > 보안 그룹
을 통해서 들어갑니다!
보안 그룹에 들어가서 다음과 같이 설정해줍니다.
예를 들면 10.0.0.0/16
과 같은 값이 들어가질 것이다. 이렇게 설정을 마무리하고 다시 클러스터 추가 명령을 입력하면 다음과 같이 정상적으로 추가가 된다.
$ argocd cluster add <클러스터 arn 명>
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context <클러스터 arn 명> with full cluster level admin privileges. Do you want to continue [y/N]? y
INFO[0001] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0001] ClusterRole "argocd-manager-role" updated
INFO[0001] ClusterRoleBinding "argocd-manager-role-binding" updated
WARN[0002] Failed to invoke grpc call. Use flag --grpc-web in grpc calls. To avoid this warning message, use flag --grpc-web.
Cluster <클러스터 엔드포인트> added <--- 이 부분이 뜨면 성공!!
Argo CD 홈페이지에 접속해서 톱니바퀴 > clusters
에 접속하면 다음과 같이 디폴트 클러스터를 제외하고 추가된 모습을 볼 수 있다. (CONNECTION STATUS
는 해당 클러스터와 매핑된 애플리케이션이 존재하면 그때 Successful
로 바뀐다. 현재는 생성된 애플리케이션이 없을꺼니 Unknown
으로 뜨는게 맞다.)
따라서 NEW APP
으로 애플리케이션을 생성할 때 cluster
선택 부분에 해당 클러스터를 선택하고 네임스페이스를 잘 설정해주면 외부 클러스터에 쿠버네티스 리소스들을 설치할 수 있게 된다.
이 부분까지 설정하는데 있어서 엄청난 삽질을 했었다. 위에서도 언급했듯이 VPC
와 보안 그룹 때문에 어디서 통로가 막혔는지 계속 생각하면서 해당 프로젝트를 진행했었다. AWS
에 대해서 아무것도 모르고 시작했는데 이번 프로젝트를 계기로 약간이나마 AWS
에 눈을 뜰 수 있게된 계기가 되었다.
근데 아직 이미지가 변경되면 수동으로 바꿔주어야 하는데 해당 부분을 빠른 시일내에 해결해서 공유해드리면 행복 GitOps
가 되지 않을까 생각됩니다.
부족하지만 읽어주셔서 감사드리고 이만 가보겠습니다..🏃🏃