ArgoCD에서 EKS 클러스터를 등록하는 방법은 크게 3가지가 있습니다: IRSA를 사용하는 방법과 그렇지 않은 방법으로 나뉩니다.
1. 같은 계정의 EKS 클러스터 등록하기
먼저, ArgoCD가 설치된 EKS와 동일한 계정 내에 있는 EKS 클러스터를 등록하는 방법을 살펴보겠습니다.
IRSA(IAM Roles for Service Accounts)을 사용해 등록하기
같은 계정의 EKS에 ArgoCD를 설치할 때 가장 쉬운 방법은 IRSA를 활용하는 것입니다. IRSA는 Kubernetes 서비스 어카운트에 IAM 역할을 할당하는 기능입니다. 방법은 간단합니다. 서비스 어카운트에 IAM 역할 ARN을 주석(annotation)으로 추가하면 됩니다.
이렇게 설정하면 파드가 서비스 어카운트에 적용된 ARN을 통해 AssumeRoleWithWebIdentity API를 호출하여 AWS 리소스에 접근 권한을 부여받게 됩니다.
더 자세한 내용은 아래 문서에서 확인할 수 있습니다
https://aws.amazon.com/ko/blogs/containers/diving-into-iam-roles-for-service-accounts/
Diving into IAM Roles for Service Accounts | Amazon Web Services
A common challenge architects face when designing a Kubernetes solution on AWS is how to grant containerized workload permissions to access an AWS service or resource. AWS Identity and Access Management (IAM) provides fine-grained access control where you
aws.amazon.com
ArgoCD를 통해 EKS 클러스터를 등록할 때, argocd-repo-server와 argocd-application-controller가 클러스터에 접근할 권한이 필요합니다. 이를 위해 두 파드의 서비스 어카운트에 해당 권한이 부여된 역할을 설정하면 됩니다.
AWS 인증 메커니즘을 호출하는 execProviderConfig를 사용해 등록하기
ArgoCD에서는 (내부의) argocd-k8s-auth 명령어를 통해 AWS 및 Azure와 같은 클라우드 서비스에 연결할 수 있습니다. 클러스터를 등록하는 설정에 EKS 권한이 있는 사용자의 AWS 자격 증명 정보를 추가하면 됩니다.
{
"execProviderConfig": {
"command": "argocd-k8s-auth",
"args": ["aws", "--cluster-name", "my-eks-cluster"],
"apiVersion": "client.authentication.k8s.io/v1beta1",
"env": {
"AWS_REGION": "xx-east-1",
"AWS_ACCESS_KEY_ID": "{{ .aws_key_id }}",
"AWS_SECRET_ACCESS_KEY": "{{ .aws_key_secret }}"
}
},
"tlsClientConfig": {
"insecure": false,
"caData": "{{ .cluster_cert }}"
}
}
만약 IAM 역할을 사용하고 싶다면 --role-arn 옵션을 추가해주면 됩니다.
"args": ["aws", "--cluster-name", "my-eks-cluster", "--role-arn", "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<IAM_ROLE_NAME>"],
AWS 프로필을 사용해 등록하기 (ArgoCD 2.10 이상)
ArgoCD에 AWS 프로필을 마운트하여 해당 권한으로 EKS에 접근하는 방법입니다. 먼저 AWS 프로필을 시크릿으로 등록하고, ArgoCD의 Helm 차트를 통해 이를 마운트합니다. 이때, IRSA를 argocd-server와 argocd-application-controller 두 곳에만 프로필을 추가해 주면 됩니다.
1. aws 프로필을 secret으로 등록합니다.
apiVersion: v1
kind: Secret
metadata:
name: my-aws-profile
type: Opaque
stringData:
my-profile-file: |
[default]
region = <aws_region>
aws_access_key_id = <aws_access_key_id>
aws_secret_access_key = <aws_secret_access_key>
aws_session_token = <aws_session_token>
2. 그리고 이 프로필을 argocd에 마운트 시킵니다.
volumeMounts:
- name: my-profile-mount
mountPath: /mount/path/to
readOnly: true
volumes:
- name: my-profile-volume
secret:
secretName: my-aws-profile
items:
- key: my-profile-file
path: my-profile-file
3. 마지막으로 클러스터 등록
다음의 설정에 맞게 값을 변경해서 추가하면 클러스터가 등록됩니다.
apiVersion: v1
kind: Secret
metadata:
name: mycluster-secret
labels:
argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
name: "<클러스터 이름>"
server: "<클러스터 API 서버 주소>"
config: |
{
"awsAuthConfig": {
"clusterName": "< 클러스터 이름>",
"roleARN": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<IAM_ROLE_NAME>",
"profile": "< aws credentials를 마운트 한 경로 >"
},
"tlsClientConfig": {
"insecure": false,
"caData": "<base64 encoded certificate>"
}
}
다른 계정의 eks를 등록해보기 (EKS → EKS)
앞서 설명한 같은 계정의 EKS 클러스터 등록 방법과 달리, 다른 계정의 EKS 클러스터를 등록하려면 IRSA로 매핑된 역할과 다른 계정의 역할 간의 신뢰 관계 설정이 필요합니다.
예시를 들어 설명하겠습니다. AA 계정의 argo-cluster라는 이름의 EKS 클러스터에 BB 계정의 b-cluster라는 이름의 EKS 클러스터를 등록하려고 한다고 가정해보겠습니다.
BB계정 설정하기
먼저 BB계정에 b-cluster에 대한 어드민 권한을 갖는 b-admin 역할을 생성합니다.
AA 계정 설정하기
AA 계정에서는 ArgoCD의 argocd-repo-server와 argocd-application-controller에 연결할 수 있도록 argo-admin이라는 하나의 역할을 생성하고, 이를 IRSA를 통해 연결합니다.
AA계정의 역할과 BB의 계정의 역할 연결하기
이 단계에서는 AA 계정의 argo-admin 역할과 BB 계정의 b-admin 역할 간의 신뢰 관계를 설정하고, sts:AssumeRole 권한을 부여합니다.
IRSA 설정
argocd-repo-server와 argocd-application-controller에 argo-admin 역할을 사용하도록 IRSA를 설정하면 됩니다.
클러스터 등록하기
마지막으로 아래의 정보를 입력하여 ArgoCD에서 클러스터를 등록하면 됩니다.
apiVersion: v1
kind: Secret
metadata:
name: mycluster-secret
labels:
argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
name: "< CLUSTER NAME >"
server: "< CLUSTER SERVER API >"
config: |
{
"awsAuthConfig": {
"clusterName": "<CLUSTER NAME>",
"roleARN": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<IAM_ROLE_NAME>"
},
"tlsClientConfig": {
"insecure": false,
"caData": "<base64 encoded certificate>"
}
}
다른 계정의 eks를 등록해보기 (EC2 → EKS)
마지막으로, EC2에 설치된 Kubernetes에서 다른 계정의 EKS 클러스터를 등록하는 방법을 알아보겠습니다.
앞서 설명한 방법과 유사하지만, 이번에는 AA 계정의 EKS를 EC2로 변경하여 진행한다고 생각하시면 됩니다. EC2 환경에서는 IRSA를 지원하지 않으므로 execProviderConfig를 사용하여 등록해야 합니다.
BB계정 설정하기
먼저, BB 계정에서 argo-cluster 클러스터에 대한 관리자 권한을 갖는 b-admin 역할을 생성합니다.
AA 계정 설정하기
AA 계정에서는 argocd-repo-server와 argocd-application-controller에 연결할 argo-admin 역할을 생성합니다.
AA계정의 역할과 BB의 계정의 역할 연결하기
AA 계정의 argo-admin과 BB 계정의 b-admin 역할 간에 신뢰 관계를 설정하고 sts:AssumeRole 권한을 부여합니다. 이때, sts:TagSession도 추가해야 하는 것 같습니다.
클러스터 등록하기
EC2 → EKS 환경에서는 사용자 자격 증명 정보가 필요하므로, argo-admin 역할을 사용할 수 있도록 자격 증명을 가진 사용자를 생성해야 합니다. 이후, 해당 사용자의 AWS 자격 증명 정보를 아래와 같이 입력하면 클러스터 등록이 완료됩니다.
{
"execProviderConfig": {
"command": "argocd-k8s-auth",
"args": ["aws", "--cluster-name", "my-eks-cluster", "--role-arn", "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<IAM_ROLE_NAME>"],
"apiVersion": "client.authentication.k8s.io/v1beta1",
"env": {
"AWS_REGION": "xx-east-1",
"AWS_ACCESS_KEY_ID": "{{ .aws_key_id }}",
"AWS_SECRET_ACCESS_KEY": "{{ .aws_key_secret }}"
}
},
"tlsClientConfig": {
"insecure": false,
"caData": "{{ .cluster_cert }}"
}
}
위 과정을 따르면 EC2에서 다른 계정의 EKS 클러스터 등록이 완료됩니다.
지금까지 ArgoCD에서 EKS 클러스터를 등록하는 다양한 방법에 대해 알아보았습니다. 같은 계정 내의 클러스터 등록부터 다른 계정의 EKS 클러스터를 등록하는 방법, 그리고 EC2에서 EKS 클러스터를 등록하는 방법까지 살펴보았습니다. 각각의 방법은 상황에 따라 선택적으로 활용할 수 있으니, 여러분의 환경에 가장 적합한 방법을 선택하시기 바랍니다.
'K8S > argocd' 카테고리의 다른 글
argocd의 로컬 계정 비밀번호 고정하기 (admin 비번 고정 방법) (0) | 2024.09.17 |
---|---|
argocd 코드 수정을 위해 로컬에서 빌드하기 (feat OSSCA) (0) | 2024.08.17 |
argocd 플러그인(CMP) 추가로 istio 배포하기 (1) | 2024.02.11 |
argocd를 argocd로 배포하기 (gitops로 관리하기) (1) | 2024.02.10 |
argocd에 helm gitops로 배포하기 (0) | 2024.02.10 |