본문 바로가기

개발관련/AWS

AWS EKS 클러스터 구축하기

반응형

Overview

AWS EKS 서비스를 활용하여 kubernetes 클러스터를 구축하는 방법을 스터디한다.

 


스터디에 앞서 준비사항은 아래와 같다.

 

 

AWS EKS에서는 아래와 같은 방법으로 kubernetes 서비스를 제공한다.

  • 마스터 노드는 AWS가 직접 관리해주고 워커 노드를 프로비저닝하여 사용자가 직접 관리할 수 있도록 워커 노드 EC2를 생성 해주는 방법
  • 마스터 노드와 워커 노드 자체를 AWS에서 모두 관리해주고 사용자는 Pod만 띄워 사용할 수 있도록 해주는 방법 (Fargate)

첫번째 방법의 경우, 워커 노드에 Pod를 띄워 서비스를 배포 및 관리할 때 EC2 인스턴스의 한정된 리소스 안에서만 가능하다는 제약 사항이 있지만 기타 다른 서버와 동일하게 SSH 접속을 통해 내 마음대로 워커 노드를 설정하거나 내부 로그 및 다양한 정보를 쉽게 조회할 수 있다.

두번째 방법의 경우, EC2 인스턴스의 한정된 리소스에서 해방되어 Pod를 자유롭게 배포 및 관리할 수 있는 장점이 있지만, 로깅의 자유도나(Cloudwatch를 통해서만 가능) 실제 Pod가 돌아가고 있는 서버의 다양한 정보를 확인할 수 없다는 단점이 있다.

 

이 문서에서는 첫번째 방법에 대해서 설명한다.

 

AWS EKS는 워커 노드와 노드 그룹이라는 것으로 이루어져 있다.

워커 노드는 실질적인 Pod가 띄워질 인스턴스이고 이 인스턴스들을 그룹으로 묶는 개념이 노드 그룹이다.

 


AWS EKS 클러스터 생성

AWS EKS 클러스터를 생성하기 위해 아래와 같은 yaml 파일을 작성한다.

 

create-cluster.yaml

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: eks-cluster # 클러스터명
  region: ap-northeast-2 # 클러스터를 생성할 리젼

vpc:
  cidr: "192.168.0.0/16" # 클러스터의 CIDR

nodeGroups:
  - name: eks-cluster-ng # 클러스터의 노드 그룹명
    instanceType: t3a.large # 클러스터 워커 노드의 인스턴스 타입
    desiredCapacity: 1 # 클러스터 워커 노드의 갯수
    volumeSize: 10  # 클러스터 워커 노드의 EBS 용량 (단위: GiB)
    iam:
      withAddonPolicies:
        ImageBuilder: true # AWS ECR에 대한 권한 추가
        albIngress: true  # alb ingress에 대한 권한 추가
    ssh:
      allow: true # 워커 노드에 SSH 접속 허용
      publicKeyName: cluster-ssh-key.pem # 워커 노드에 SSH 접속을 위해 사용할 pem키 명(aws key pairs에 등록되어 있어야함)

 

 

클러스터 생성을 위한 yaml 파일 작성법에 대해서 좀 더 자세한 내용은 아래 링크를 참조한다.

https://eksctl.io/usage/creating-and-managing-clusters/

 

Creating and managing clusters | eksctl

Creating a clusterCreate a simple cluster with the following command:eksctl create cluster That will create an EKS cluster in your default region (as specified by your AWS CLI configuration) with one nodegroup containing 2 m5.large nodes.After the cluster

eksctl.io

 

위의 create-cluster.yaml 파일과 같이 AWS EKS 클러스터 생성을 위한 yaml 파일을 작성했다면 eksctl을 사용하여 아래 명령어를 통해 프로비저닝한다.

eksctl apply -f create-cluster.yaml

 

`eksctl apply -f` 명령어를 통해 클러스터를 생성 하면 AWS CloudFormation에 해당 EKS 프로비저닝에 대한 스택이 생성되고, 순차적으로 AWS EKS에 대한 인프라가 구축된다.

모두 다 구축이 완료되면 eksctl 명령을 실행시킨 로컬 PC의 kubectl에 자동적으로 AWS EKS 클러스터와 연결된다.(내부적으로 .kube/config 에 context 내용이 업데이트 되고 이 context 와 kubectl이 연결되는 것이다.)

 


ALB Ingress Controller 생성

ALB Ingress Controller는 EKS 클러스터 내부에 생성되는 Ingress 리소스를 참조하여 외부 통신에 대한 인프라를 프로비저닝 하는 역할을 맡고 있다.

ALB Ingress Controller라는 이름 처럼 Application Load Balancer를 생성하여 외부 통신을 가능하도록 해준다.

ALB Ingress Controller는 클러스터 내부에 Pod 형태로 생성되며 ALB Ingress Controller를 생성하는 방법은 아래와 같다.

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/alb-ingress.html

 

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/alb-ingress.html

Amazon EKS의 ALB 수신 컨트롤러

docs.aws.amazon.com

 

문서를 따라 하나씩 처리해도 되지만 쉽게 스크립트를 구성하여 한큐에 생성되도록 하자.

#/bin/bash

echo '>>> CREATE ALBIngressControllerIAMPolicy '
aws iam create-policy \
--policy-name ALBIngressControllerIAMPolicy \
--policy-document https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/iam-policy.json
echo ''


echo '>>> Connecting ALBIngressControllerIAMPolicy To WorkerNode Role'
NG_ROLE=`kubectl -n kube-system describe configmap aws-auth | grep rolearn`
ACCOUNT=${NG_ROLE:24:12}
WN_ROLE=${NG_ROLE:42}

echo "ACCOUNT          : $ACCOUNT"
echo "WORKER NODE ROLE : $WN_ROLE"
echo "NODE GROUP ROLE  : $NG_ROLE"

aws iam attach-role-policy \
--policy-arn arn:aws:iam::${ACCOUNT}:policy/ALBIngressControllerIAMPolicy \
--role-name ${WN_ROLE}
echo ''


echo '>>> Create ClusterRole for ALB Ingress Controller'
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/rbac-role.yaml
echo ''


echo '>>> Create ALB Ingress Controller'
CLUSTER_NAME='eks-cluster' # 클러스터명
AWS_REGION='ap-northeast-2' # 클러스터 리젼
VPC_ID=`eksctl get cluster --name ${CLUSTER_NAME} --region ${AWS_REGION} --output json | jq -r '.[0].ResourcesVpcConfig.VpcId'`


echo "CLUSTER NAME : $CLUSTER_NAME"
echo "VPC ID       : $VPC_ID"
echo "AWS REGION   : $AWS_REGION"
echo ''

echo '>>> Remove Old alb-ingress-controller.yaml file && New alb-ingress-controller.yaml file Download'
rm -rf alb-ingress-controller.yaml* &&
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/alb-ingress-controller.yaml &&

# alb-ingress-controller.yaml
sed -i -e "s/# - --cluster-name=devCluster/- --cluster-name=$CLUSTER_NAME/g" alb-ingress-controller.yaml &&
sed -i -e "s/# - --aws-vpc-id=vpc-xxxxxx/- --aws-vpc-id=$VPC_ID/g" alb-ingress-controller.yaml &&
sed -i -e "s/# - --aws-region=us-west-1/- --aws-region=$AWS_REGION/g" alb-ingress-controller.yaml &&

kubectl apply -f ./alb-ingress-controller.yaml

echo '>>> FINISH'
sleep 5
echo '>>> Checking Create ALB Ingress Controller'
kubectl get pods -n kube-system | grep alb

 

 

쉘 스크립트를 실행하고 나면 `alb-ingress-controller-7c8795cc48-q56wv` 와 비슷한 이름의 Pod가 생성된 것을 확인할 수 있을 것이다.

 

이렇게 간단하게 EKS 클러스터 구축이 완료되었다.

반응형