들어가며
CJ 클라우드 웨이브에서 프로젝트 기간동안 AWS 비용을 지원을 받아서 AWS 서비스를 돈 걱정 없이 사용할 수 있는 좋은 기회를 얻게 되었습니다. 프로젝트에서 사용할 EKS 클러스터를 AWS 콘솔을 이용해서 구축해 보았습니다.
VPC 생성
1. VPC 생성
- private subnet과 public subnet을 가용성을 위해 2개씩 생성
- nat gateway와 ingress를 두기 위해 public subnet 생성한다.
2. 서브넷 4개 생성후 2개는 자동할당 활성화 (public subnet으로 사용하기 위해서)
3. 2개의 public subnet에 nat-gateway를 둡니다
4. routing 테이블에서 라우팅 편집을 통해서 생성한 nat-gateway를 private 서브넷과 연결해줍니다.
5. 나머지 퍼블릭 서브넷과 프라이빗도 동일하게 적용해줍니다.
pri 서브넷은 nat로 라우팅 해주고 pub 서브넷은 internet gateway로 나갈 수 있도록 라우팅 테이블을 작성해줍니다.
6. public subnet에는 kubernetes.io/role/elb 태그 추가, private subnet에는 kubernetes.io/role/internal-elb 태그 추가
태그를 달아주는 이유는 control plane과 worker node간에 통신을 하기 위함입니다.
EKS 클러스터 생성
1. EKS 역할 생성
2. 버전과 클러스터 액세스 선택
3. 아까 생성한 VPC 선택
4. 클러스터 엔드포인트 엑세스 선택
- 사용자가 쿠버네티스 API 서버에 kubectl로 명령을 내릴 때 접근 방식을 결정합니다.
- public은 인터넷을 통해 api 서버에 요청을 보내고 private은 vpc 내부에서 요청을 보내야한다.
- public + private 방식은 control plane에서 워커노드에 접근할 때 워커노드를 위한 주소가 별도의 프라이빗 호스팅 존으로 구성되어 대상을 EKS owned ENI로 매핑한다.
5. 추가 기능 선택 후 생성
NODE 그룹 생성
1. 노드 그룹 생성
2. node 그룹에 대한 역할 생성 후 정책 추가
3. 리소스 구성
4. 생성할 노드 그룹 수 지정
5. 노드 그룹 네트워크 구성
이때 생성할 때 모든 서브넷을 구성해서 private에만 있어야할 인스턴스도 public에 띄워져서 private에만 띄워야 하면 private만 선택
EKSCTL로 클러스터 접속
1. EKS 클러스터에 IAM 사용자 액세스 등록
2. EKS 클러스터 액세스 정책 추가
3. aws iam 사용자로 configure 등록, kubectl과 eksctl 설치
4. eks cluster 연결
$ aws eks --region ap-northeast-2 update-kubeconfig --name {클러스터 이름}
//kubctx 설치후 eks 클러스터로 선택
$ kubctx {eks 클러스터}
AWS LoadBalancer Controller 설치
1. OIDC 공급자 확인
$ aws eks describe-cluster --name {eks 클러스터명} \
--query "cluster.identity.oidc.issuer" \
--output text
2. LB controller를 위한 IAM 정책 생성(기본 정책으로 없기 때문에 다운)
// IAM 정책 json 다운
$ curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.7/docs/install/iam_policy.json
// 정책 생성
$ aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json
// 클러스터에 OIDC 제공자 연결
$ eksctl utils associate-iam-oidc-provider --region=ap-northeast-2 --cluster={eks 클러스터명} --approve
**3. 정책을 Role에 연결하고 SA 생성 한 뒤 Role과 SA 연결
//service account 생성
$ eksctl create iamserviceaccount \
--cluster=$CLUSTER_NAME \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--approve
//SA 정보 확인
$ eksctl get iamserviceaccount --cluster $CLUSTER_NAME
$ kubectl get serviceaccounts -n kube-system aws-load-balancer-controller -o yaml | yh
4. Helm 이용해서 설치
// Helm Chart Repository 추가 및 업데이트
$ helm repo add eks https://aws.github.io/eks-charts
$ helm repo update
// Helm Chart - AWS Load Balancer Controller 설치
$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system \
--set clusterName=oliveSafety-eks \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region=ap-northeast-2 \
--set vpcId={eks vpc Id 입력}
// 확인하기
$ kubectl get pods -n kube-system | grep aws-load-balancer
Deployment, service, ingress 띄우기
//yaml 파일로 pod, service, ingress 띄우기
$ kubectl apply -f deployment.yaml
$ kubectl apply -f service.yaml
$ kubectl apply -f ingress.yaml
route53에 ingress address 등록 후 url로 접속
NLB vs INGRESS
- INGRESS는 path routing이 가능하다.
- SSL 적용가능
후기
콘솔을 이용해서 EKS 클러스터를 구축해 보았는데 정말 오래 걸렸고 왜 Terraform이나 Cloudformation으로 구축하는지 깨달을 수 있었고 다음에는 Terraform을 이용해서 EKS 클러스터를 구축해보겠습니다.
'Infra' 카테고리의 다른 글
terraform으로 aws 인프라 구축하기 (2) (Auto Scaling) (0) | 2024.12.04 |
---|---|
terraform으로 aws 인프라 구축하기 (1) (0) | 2024.12.04 |
UTM 이용해서 쿠버네티스 환경 구성하기 (0) | 2024.12.04 |
AWS IAM 계정 공유 와 AWS 서비스에 IAM 역할 적용 (0) | 2024.12.04 |
Docker-compose 다루기 (0) | 2024.12.04 |