EKS로 ArgoCD 구성하기까지
해당 문서는 EKS를 구성하기까지를 문서화하여 저장한다.
EKS Cluster 생성
0. 사전에 필요한 패키지
- awscli
- kubectl
- eksctl
- helm
1. EKS Cluster 역할 생성
Cluster를 생성할 때 EKS Cluster에 대한 Role이 필요하다. Amazon EKS에서 관리하는 Kubernetes 클러스터는 이 역할을 사용하여 노드를 관리 및 로드밸런서를 생성할 수 있다.
아래와 같이 json으로 생성 가능하며 다른 방향으로는 Console에서 직접 생성 가능
# cluster-trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "eks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}# Role을 생성하는 부분이며 필수적인 신뢰관계를 삽입하는 부분이다.
aws iam create-role
\ --role-name [Cluster_Role_Name_You_Want]
\ --assume-role-policy-document file://"[Name_You_Want].json"# 생성한 Cluster Role에 AWS 관리형 IAM 정책 연결
aws iam attach-role-policy
\ --role-name [Cluster_Role_Name_You_Created]
\ --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
# 실제 예시
aws iam attach-role-policy
\ --role-name eksClusterRole
\ --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy2. Cluster 생성
CLI를 이용하여 Cluster를 생성한다.
# AWSCLI를 이용하여 생성
aws eks create-cluster
\ --name {CLUSTER_NAME}
\ --region ap-northeast-2
\ --kubernetes-version {KUBERNETES_VERSION}
\ --role-arn arn:aws:iam::{ACCOUNT_ID}:role/{CLUSTER_ROLE_NAME}
\ --resources-vpc-config subnetids={SUBNET_ID1},{SUBNET_ID2}, endpointPublicAccess=true, endpointPublicAccess=true
\ --profile {YOUR_PROFILE}
# Cluster 생성 내용 확인
aws eks describe-cluster
\ --name {CLUSTER_NAME}
\ --region ap-northeast-2
\ --query "cluster.status" --profile ""
# 생성 후 Cluster 등록
aws eks update-kubeconfig
\ --name
\ --region
\ --profile3. 환경별 Pod 관리
(1) Fargate
-
Pod Role 생성
Pod 인프라에서 Pods를 실행하려면 Amazon EKS AWS Fargate 실행 역할이 필요
// pod-execution-role-trust-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:eks:<EKS-REGION>:{ACCOUNT_ID}:fargateprofile/{CLUSTER_NAME}/*" } }, "Principal": { "Service": "eks-fargate-pods.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }# 생성한 신뢰관계 json 파일을 이용하여 IAM Role 생성 이후 권한 부여 aws iam create-role \ --role-name {CLUSTER_FARGATE_ROLE} \ --assume-role-policy-document file://"pod-execution-role-trust-policy.json" aws iam attach-role-policy \ --role-name {CLUSTER_FARGATE_ROLE} \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSFargatePodExecutionRolePolicy -
Fargate Profile 생성
Fargate를 이용하여 Pod를 생성하기 위해서는 Fargate Profile을 생성해야 한다. Cluster가 생성될 때 Core-DNS 외 Add-on들이 설치되므로 kube-system에 Pod가 생성될 수 있도록 kube-system 관련 Fargate-Profile이 필요.
# Fargate를 생성할 Profile을 생성하는 기본 명령어 aws eks create-fargate-profile --cluster-name {CLUSTER_NAME} --fargate-profile-name {FARGATE_PROFILE_NAME} \ --pod-execution-role-arn {CLUSTER_FARGATE_ROLE} \ --subnets <SUBNET1>, <SUBNET2> \ --selectors aws eks create-fargate-profile --cluster-name {CLUSTER_NAME} --fargate-profile-name kube-system \ --pod-execution-role-arn {CLUSTER_FARGATE_ROLE} \ --subnets {SUBNET_ID1},{SUBNET_ID2} \ --selectors kube-system -
CoreDNS 재시작 (특정 버전 이후 할 필요 없음)
# CoreDNS가 생성되는지 확인 kubectl rollout restart deployment/coredns -n kube-system
(2) Node - 추후 설정
4. Ingress 생성
(1) LB Controller 생성을 위한 사전 작업
# 지정한 iam_policy.json을 현재 폴더에 저장
curl -O <https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json>
# 폴더에 저장한 iam_policy.json을 이용하여 policy 생성
aws iam create-policy --policy-name {LB_POLICY_NAME} --policy-document file://iam_policy.json
# OIDC Provider 생성
eksctl utils associate-iam-oidc-provider --region={REGION} --cluster={CLUSTER_NAME} --approve
# Cluster Service Account 생성
eksctl create iamserviceaccount --cluster={CLUSTER_NAME} --namespace=kube-system --name=aws-load-balancer-controller --role-name {AWS_LB_CONTROLLER_ROLE} --attach-policy-arn=arn:aws:iam::{ACCOUNT_ID}:policy/{LB_POLICY_NAME} --approve --region {REGION}OIDC Provider란?
(2) Helm을 이용하여 lb-controller-pod 배포
# 로컬에 eks 라는 repo를 캐싱하여 eks-charts를 pull
# helm repo add <LOCAL-REPO-NAME> <HELM-URI>
helm repo add eks <https://aws.github.io/eks-charts>
# pull한 repo를 최신으로 update
# helm repo update <LOCAL-URI>
helm repo update eks
# pull한 repo를 이용하여 lb-controller 배포
# helm install <CHART-RELEASE-NAME> <TARGET-CHART> <OPTION>
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller --set vpcId={VPC_ID}
# install된 lb-controller 확인
# helm status <CHART-RELEASE-NAME> -n <NAME-SPACE>
helm status aws-load-balancer-controller -n kube-system