Infra & DevOps/Terraform

[Terraform] EKS IaC

용감한 개복치 2024. 4. 24. 23:10

Amazon EKS Workshop Study 2기

8주차

EKS IaC ( Terraform )

eks 환경을 테라폼으로 구성해보기

 

실습환경 구성

윈도우에서 구성하려면 mac 환경에서보다 이것저것 해 줘야할 게 많다. brew 짱짱맨..

 

wsl2 설치 > 실행 > 테라폼 설치

wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform

# 테라폼 버전 정보 확인
terraform version

 

https://www.how2shout.com/linux/how-to-install-eksctl-cli-tool-on-ubuntu-linux/

 

How to Install eksctl CLI tool on Ubuntu Linux

Using eksctl, users can easily deploy and scale containerized applications on AWS. Here we learn how to install eksctl on an Ubuntu system.

www.how2shout.com

 

시스템 업데이트

sudo apt update

 

AWSCLIL 설치

sudo apt install awscli

#자격증명
aws configure

 

EKSCTL 설치(amd64기)

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

 

바이너리 파일 위치 이동

sudo mv /tmp/eksctl /usr/local/bin

 

설치 확인

eksctl version
eksctl --help


KUBECTL 설치

curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.29.3/2024-04-19/bin/linux/amd64/kubectl
chmod +x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH

#확인
kubectl version --client

 

HELM 설치

기존의 바이너리 파일 설치부터하는 방법도 있는데, 공식 인스톨러 스크립트가 있다니 그것을 사용

https://helm.sh/docs/intro/install/

 

Installing Helm

Learn how to install and get running with Helm.

helm.sh

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

 

+) third party 를 사용한 방법(apt)

curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

 

테라폼 실습을 위한 디렉토리

mkdir learn-terraform
cd learn-terraform
touch main.tf

 

Amazon Linux 2 최신 ami id 찾기

#aws ec2 describe-images --owners self amazon
aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2" "Name=state,Values=available" --query 'Images|sort_by(@, &CreationDate)[-1].[ImageId, Name]' --output text
ami-0217b147346e48e84   amzn2-ami-hvm-2.0.20240412.0-x86_64-gp2

aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2" "Name=state,Values=available" --query 'Images|sort_by(@, &CreationDate)[-1].[ImageId]' --output text
ami-0217b147346e48e84

AL2ID=`aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2" "Name=state,Values=available" --query 'Images|sort_by(@, &CreationDate)[-1].[ImageId]' --output text`
echo $AL2ID

 

ec2 생성 모니터링

# [터미널1] EC2 생성 모니터링
export AWS_PAGER=""
while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output text ; echo "------------------------------" ; sleep 1; done

 

Terraform 기본 사용법 -> 별도 포스팅

https://bravesunfish.tistory.com/80

 

[Terraform] 테라폼 기초 설명 & init 코드 구성 요소

Terraform 이란?- 하시코프사에서 공개한 IaC 도구- 블록에서 작성된 타겟 리소스에 대한 api 를 테라폼 프로바이더가 호출- 실행(apply) 하면 생성되는 tfstate 파일을 기준으로 상태를 비교하여 선언된

bravesunfish.tistory.com

 

 

Terraform 으로 EKS 배포

 

테라폼 배포 실행

> 테라폼은 디렉토리 기준으로 파일을 읽기 때문에 실행하고자하는 tf 가 있는 곳에서 실행

# 초기화
terraform init
ls -al
tree .terraform

# plan 확인
terraform plan

# apply 실행
terraform apply
 Enter a value: yes 입력

# ec2 생성 확인 : aws 웹 관리 콘솔에서도 확인 - 서울 리전 선택
export AWS_PAGER=""
aws ec2 describe-instances --output table

# 테라폼 정보 확인
terraform state list
terraform show
terraform show aws_instance.example

 

코드 파일 수정 > 반영 확인 : 태그 수정

 

plan 으로 변경 예정 값 확인 & apply 로 적용

 

첫 번째 EKS 클러스터 배포

# 코드 가져오기
git clone https://github.com/gasida/aews-cicd.git
cd aews-cicd/4

# terraform 환경 변수 저장
export TF_VAR_KeyName='peach'
echo $TF_VAR_KeyName

# 
terraform init
terraform plan

# 10분 후 배포 완료
terraform apply -auto-approve

 

만들어 져야할 것 : VPC, Subnet, IGW, NATGW, Routing Table, EKS, EKS SG

state 파일 생성 완

 

확인

#
kubectl get node -v=6

# EKS 클러스터 인증 정보 업데이트
CLUSTER_NAME=myeks
aws eks update-kubeconfig --region ap-northeast-2 --name $CLUSTER_NAME
kubectl config rename-context "arn:aws:eks:ap-northeast-2:$(aws sts get-caller-identity --query 'Account' --output text):cluster/$CLUSTER_NAME" "Aews-Labs"

#
kubectl cluster-info
kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone
kubectl get pod -A

 

두 번째 배포 > 코드 재사용 검증

첫 번째 코드를 그대로 복사해서 myeks2 로 변수만 바꿔서 새로 apply 했으니 그대로 생성되는가 확인

#
cd ..
mkdir 5
cd 5
cp ../4/*.tf .
ls

#
terraform init
terraform apply -auto-approve -var=ClusterBaseName=myeks2 -var=KubernetesVersion="1.28"

# EKS 클러스터 인증 정보 가져오기
CLUSTER_NAME2=myeks2
aws eks update-kubeconfig --region ap-northeast-2 --name $CLUSTER_NAME2 --kubeconfig ./myeks2config

# EKS 클러스터 정보 확인
kubectl --kubeconfig ./myeks2config get node 
kubectl --kubeconfig ./myeks2config get pod -A