본문 바로가기
개발/AWS

AWS EKS 구성 및 컨테이너 웹 어플리케이션 배포 - 1

by 궁즉변 변즉통 통즉구 2023. 2. 6.
반응형

유튜브 AWS EKS 워크샵 자료를 보면서 핸즈온한 EKS 구성 및 간단한 웹 애플리케이션 배포하는 과정을 복습하면서 다시 정리해본다.

 

1. IAM 생성

당연한 얘기지만 앞으로의 작업을 위한 AWS IAM 계정을 생성한다. 권한은 아래와 같이 AdministratorAccess로 설정한다.

 

2. Cloud9 환경 설정

테스트의 편의를 위해 Cloud9 환경을 사용한다. 

New EC2 instance를 선택하고 인스턴스 타입은 t3.medium으로 선택했다.

 

다음으로 Cloud9이 사용할 수 있는 Role을 생성한다. IAM Role생성에서 EC2인스턴스의 정책은 'AdministratorAccess'로 선택하고, Role이름은 'eks-workspace-admin'으로 한다.

 

다음으로 생성한 Role을 Cloud9에 설정해준다. EC2화면으로 가서 Cloud9인스턴스를 선택하고 작업 > 보안 > IAM 역할 수정을 선택한다

위에서 생성한 Role을 선택하고 Role을 업데이트를 한다.

Cloud9을 Open하고 설정에 들어가서 AWS managed temporary credentials 설정을 비활성화한다.

Temporary credentials이 없는지 확실히 하기 위해 기존의 자격 증명 파일도 아래 명령으로 제거한다.

$ rm -vf ${HOME}/.aws/credentials

마지막으로 Cloud9 IDE가 올바른 IAM Role을 사용하고 있는지 확인한다.

$ aws sts get-caller-identity --query Arn | grep eks-workspace-admin

 

3. Tool 설치 및 환경 설정

EKS 구성에 필요한 tool들을 설치해준다. 먼저 AWS CLI를 업데이트 한다.

$ sudo pip install --upgrade awscli

kubectl을 설치한다.

$ sudo curl -o /usr/local/bin/kubectl  \
   https://s3.us-west-2.amazonaws.com/amazon-eks/1.23.13/2022-10-31/bin/linux/amd64/kubectl
   
$ sudo chmod +x /usr/local/bin/kubectl

# 설치 확인
$ kubectl version --client=true --short=true

jq와 bash-completion을 설치한다.

# json 파싱
$ sudo yum install -y jq

# bash 명령어 자동완성 
$ sudo yum install -y bash-completion

마지막으로 eksctl을 설치한다.

$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp

# 바이너리를 /usr/local/bin으로 이동
$ sudo mv -v /tmp/eksctl /usr/local/bin

# 확인
$ eksctl version

이제 자주 사용되는 AWS REGION과 ACCOUNT ID를 환경 변수로 설정한다.

# 리전 환경변수 설정
$ export AWS_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')
$ echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile    
$ aws configure set default.region ${AWS_REGION}
$ aws configure get default.region

# AccountID 환경변수 설정
$ export ACCOUNT_ID=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.accountId')
$ echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile

다음으로 Docker 이미지를 빌드하는 동안 Cloud9환경에서 용량 부족 이슈 발생 대비 디스크 용량을 증설한다. 아래 명령만 실행하면 된다.

$ wget https://gist.githubusercontent.com/joozero/b48ee68e2174a4f1ead93aaf2b582090/raw/2dda79390a10328df66e5f6162846017c682bef5/resize.sh

$ sh resize.sh

# 확인
$ df -h

 

4. EKS 생성(with eksctl)

Cloud9에서 yaml파일을 생성하고 eksctl로 EKS Cluster를 생성한다.

# 작업 디렉토리 이동
$ cd ~/environment

 

# yaml 파일 생성
$ cat << EOF > eks-demo-cluster.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: eks-demo # 생성할 EKS 클러스터명
  region: ${AWS_REGION} # 클러스터를 생성할 리전
  version: "1.23"

vpc:
  cidr: "10.0.0.0/16" # 클러스터에서 사용할 VPC의 CIDR
  nat:
    gateway: HighlyAvailable

managedNodeGroups:
  - name: node-group # 클러스터의 노드 그룹명
    instanceType: m5.large # 클러스터 워커 노드의 인스턴스 타입
    desiredCapacity: 3 # 클러스터 워커 노드의 갯수
    volumeSize: 20  # 클러스터 워커 노드의 EBS 용량 (단위: GiB)
    privateNetworking: true
    ssh:
      enableSsm: true
    iam:
      withAddonPolicies:
        imageBuilder: true # Amazon ECR에 대한 권한 추가
        albIngress: true  # albIngress에 대한 권한 추가
        cloudWatch: true # cloudWatch에 대한 권한 추가
        autoScaler: true # auto scaling에 대한 권한 추가
        ebs: true # EBS CSI Driver에 대한 권한 추가

cloudWatch:
  clusterLogging:
    enableTypes: ["*"]

iam:
  withOIDC: true
EOF

 

# eks 생성 실행
$ eksctl create cluster -f eks-demo-cluster.yaml

위 명령을 실행하면 EKS Cluster를 생성하는데 시간이 좀 걸린다. 내부적으로 Cloudformation을 사용하여 진행과정을 AWS 콘솔의 Cloudformation에서도 확인 가능(약 15분 소요)

Cloud9에서는 아래와 같이 프롬프트가 떨어지면 생성이 완료 된 것이다.

Cluster Node를 조회하면 워커노드 3개가 잘 나온다.

$ kubectl get nodes

위와 같이 Cloud9에서 조회하면 잘 나오는데 AWS콘솔 화면에서는 정보를 조회할 수 없다. 이는 권한 관련 문제인데 EKS 클러스터를 생성한 IAM Entity(사용자 or Role)는 Control Plane에서 클러스터 RBAC 구성의 system:masters 권한이 자동적으로 부여되지만 AWS콘솔화면의 사용자에게는 권한이 없을 수 있기 때문이다. 자세한 내용은 아래를 참조하고 조치하면 된다.

https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/50-eks-cluster/200-option-console

 

현재까지 구성된 아키텍처를 보면 아래와 같다.

어플리케이션 배포는 아래 링크에 계속 작성한다.

https://happy-jjang-a.tistory.com/194

 

 

참조:

https://www.youtube.com/watch?v=kb6s0Tmp2CA 

https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/10-intro

 

 

 

 

반응형

댓글