brunch

EKS 5탄-1. EC2에서 EKS 생성법-1/3

5탄 - 1/3

by Master Seo

명령 내릴 서버를 만들고, 신규 VPC로 클러스터를 만들고 , IP 모드로 서비스를 배포해보자~


<1> AWS 콘솔에서 aws-com5 EC2 1대 생성 (실습)

<2> eksctl , kubectl 툴 설치 (실습)

<3> 컨테이너 이미지 만들어보기 (선택)

<4> ECR에 컨테이너 이미지 올리기 (실습)

<5> 명령어 유틸로 k8s 클러스터 생성 (실습)

<6> 인그레스 컨트롤러 L7 만들기 (실습)

<7> kube-ops-view 설치로 가시성을 높여 보자 (실습)

<8> 인그레스 컨트롤러 L7 만들기 (실습)

<9> Cert-manager 설치 (실습)

<10> 배포 (실습)

<11> 삭제 (실습)



# 클러스터 이름

eksworkshop-eksctl

nodegroup3



<1> AWS 콘솔에서 aws-com5 EC2 1대 생성 (실습)


1

aws-com5 EC2 1대 생성


2

IAM > Roles > Create role > admin role을 생성 - seo-admin-role



3

Cloudformation 으로 EC2 생성 - 툴까지 설치 됨


https://brunch.co.kr/@topasvga/1814



<2> eksctl , kubectl 툴 설치



1

# EC2 로그인


hostnamectl --static set-hostname aws-com5

sudo su -



2

# eksct 설치l = EKS 클러스터 생성하는 유틸


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

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

eksctl version



3

# kubectl 설치 = 쿠버네티스에 명령을 내리는 툴

쿠버네티스 마스터에 명령을 내릴때 사용한다. 리소스 만들때 사용하는 툴.



curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"


install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl


kubectl version


다운로드 사이트

https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/



4

# Install kubens kubectx


yum install -y git


git clone https://github.com/ahmetb/kubectx /opt/kubectx

ln -s /opt/kubectx/kubens /usr/local/bin/kubens

ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx



5

# aws cli 업데이트


sudo pip install --upgrade awscli

aws --version



6

# json 지원


sudo yum install -y jq


# bash 지원


sudo yum install -y bash-completion




7

참고

툴 설치는 S3버킷에 스크립트를 올려놓고, 해당 스크립트를 다운로드하도록 하면 한 번에 설치할 수 있다.




# 디폴트 값 세팅

# 현재 리전을 기본 리전으로 지정


# 리전을 변수 저장 ?


# 방법1


export AWS_REGION=ap-northeast-2

echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile

aws configure set default.region ${AWS_REGION}

aws configure get default.region

echo ${AWS_REGION}




# 방법2 (선택)


aws configure


AWS Access Key ID [None]:

AWS Secret Access Key [None]:

Default region name [None]: ap-northeast-2

Default output format [None]:


export AWS_REGION=$(aws configure get default.region)

echo "export AWS_REGION=$AWS_REGION" >> ~/.bashrc

echo $AWS_REGION



# 방법3 (선택)


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



8

# account id 변수로 지정? (필수)


export ACCOUNT_ID=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.accountId')


export ACCOUNT_ID=33971


echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile



9

# 도커 이미지 빌듯이 용량 부족 이슈 해결을 위한 디스크 증설 (선택)


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

sh resize.sh

df -h




<3> 컨테이너 이미지 만들어보기 (선택)


1

yum install docker


mkdir -p ~/environment/

cd ~/environment/



2

# 컨테이너 이미지 만들기


cat << EOF > Dockerfile

FROM nginx:latest

RUN echo '<h1> test nginx web page </h1>' >> index.html

RUN cp /index.html /usr/share/nginx/html

EOF


# 확인

docker images



3

# 실행

# 8080 포트로 접속하면 80으로 연결한다.


docker run -p 8080:80 --name test-nginx test-image





4

# 새 터미널에서 도커 떠있는 것 확인


dicker ps



5

# 컨테이너 로그 확인


docker logs -f test-nginx



6

# 컨테이너 내부에 접속해


docker exec -it test-nginx /bin/bash



7

# 컨테이너 중지


docker stop test-nginx



8

# 컨테이너 삭제 (중지 상태인 컨테이너 삭제 가능)


docker rm test-nginx


9

# 컨테이너 이미지 삭제


docker rmi test-image



10

# 컨테이너 실습 더 해보기


https://brunch.co.kr/@topasvga/1651




<4> ECR에 컨테이너 이미지 올리기


1

# 소스 코드 받기


git clone https://github.com/joozero/amazon-eks-flask.git

ls



2

# 레파지토리인 ecr 만들기


aws ecr create-repository \

--repository-name demo-flask-backend \

--image-scanning-configuration scanOnPush=true \

--region ${AWS_REGION}



3

확인

aws 콘솔 가서 ecr 만들어진 것 확인 (선택)



4

인증 토큰 가져와서 , 인증 토큰을 docker-login명령어로 전달.

사용이 이름을 aws로 명시, 인증하려는 목적지를 ECR로 한다.


# account id 변수로 지정? (필수)

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



# 로그인

aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com



5

# 빌드


cd ~/environment/amazon-eks-flask

docker build -t demo-flask-backend .



6

# 태그 추가


docker tag demo-flask-backend:latest $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/demo-flask-backend:latest



7

# docker push로 , 이미지를 레파지토리에 올리기


docker push $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/demo-flask-backend:latest



8

AWS 콘솔 > ECR에서 확인



9

컨테이너 실습 더 해보기

hello world도 ecr에 올려 보자

https://brunch.co.kr/@topasvga/1651




<5> k8s 클러스터 만들기



1

만드는 방법 4가지?

AWS 콘솔로 클릭 클릭

AWS Cloudformation , CDK로 생성

eksctl로 생성

테라폼 등으로 생성





2

여기서는 eksctl로 생성한다.



3

cd ~/environment



4

# 192.168.0.0/16 로 VPC 만들고, eks-demo 클러스터를 생성해 보자.


# 1.31 버전으로 설치한다. = 2024년 12월 최신 버전이다.


# 앞에 리전과 클러스터 이름이 중복되어 ap-northeast-1으로 변경함.


export AWS_REGION=ap-northeast-1

echo ${AWS_REGION}





cat << EOF > eks-demo-cluster.yaml

---

apiVersion: eksctl.io/v1alpha5

kind: ClusterConfig


metadata:

name: eks-demo # 생성할 EKS 클러스터명

region: ${AWS_REGION} # 클러스터를 생성할 리젼

version: "1.31"


vpc:

cidr: "192.168.0.0/16" # 클러스터에서 사용할 VPC의 CIDR


managedNodeGroups:

- name: node-group # 클러스터의 노드 그룹명

instanceType: m5.large # 클러스터 워커 노드의 인스턴스 타입

desiredCapacity: 1 # 클러스터 워커 노드의 개수

volumeSize: 20 # 클러스터 워커 노드의 EBS 용량 (단위: GiB)

# ssh:

# enableSsm: true

iam:

withAddonPolicies:

imageBuilder: true # AWS ECR에 대한 권한 추가

# albIngress: true # albIngress에 대한 권한 추가

cloudWatch: true # cloudWatch에 대한 권한 추가

autoScaler: true # auto scaling에 대한 권한 추가


cloudWatch:

clusterLogging:

enableTypes: ["*"]

EOF


eksctl create cluster -f eks-demo-cluster.yaml





# VPC 새로 만들고 클러스터를 생성한다.

# 기존 있는 VPC에 설치하는 법은 따로 정리

# ssh는 막음

# 볼륨은 20 , 실무에서는 30 정도로.




5

# Cloud9 에서

// 아래 error는 cloud9에서 AWS Settings > Credentials> AWS managed temporry credentials 비활성화 안 했을 때 발생

// ssh 부분 주석처리 안 했을 때도 발생


2021-09-02 05:21:56 [✖] error describing stack: ExpiredToken: The security token included in the request is expired

status code: 403, request id: c7208776-f13c-4a52-b93b-adf63e9f5f30


// 잘못해서 클러스터 삭제 필요시 해야 하는것

ec2 > autoscaling 그룹을 반드시 삭제해야 인스턴스가 삭제 된다.

그렇지 않으면 다시 자동으로 EC2가 다시 생성 된다.



6

# 확인


kubectl get nodes


~/.kube/config에 클러스터 자격 증명이 더해진 것을 확인





<6> AWS 콘솔에서 node정보 보기 (선택)


1

AWS 콘솔 > EKS cluster > Overview에서 nodes가 보이는지 확인한다.

안 보인다.


cloud9에서 eks를 만들어서, 콘솔에서 보려면 console 크리 텐션을 클러스터에 추가해줘야 콘솔에서 보인다.


권한을 추가한다 ( 선택)




2

# cloud9 사용시


rolearn=$(aws cloud9 describe-environment-memberships --environment-id=$C9_PID | jq -r '.memberships[].userArn')


echo ${rolearn}


assumedrolename=$(echo ${rolearn} | awk -F/ '{print $(NF-1)}')

rolearn=$(aws iam get-role --role-name ${assumedrolename} --query Role.Arn --output text)



3

# 매핑 생성 , EC2 사용시


eksctl create iamidentitymapping --cluster eks-demo --arn ${rolearn} --group system:masters --username admin



4

# 정보 확인


kubectl describe configmap -n kube-system aws-auth



5

콘솔 가서 확인

EKS > Clusters > Overview와 Workloads에 나오는지 확인





<7> kube-ops-view 설치로 가시성을 높여 보자 (선택)



# kube-ops-view 설정

https://brunch.co.kr/@topasvga/1653




<8> 인그레스 컨트롤러 L7 만들기


1

AWS Load Balancer Controller를 만들어 서비스를 외부에 노출하자.



2

ALB - 인그래스--서비스------Pod 순으로 통신된다.



3

AWS Load Balancer Controller 트래픽 모드는 2가지를 지원한다.


인스턴스 모드?

클러스터 내의 node를 대상으로 등록한다.

ALB > nodePort > Pod로 통신된다.


IP 모드?

클러스터 내의 pod를 대상으로 등록한다.

ALB > Pod로 통신한다.

효율적이다!!!

우리는 그래서 IP 모드를 사용한다.


EC2 > NLB > 대상그룹에 가면 대상 유형을 확인할 수 있다.

IP or 인스턴스



4

# 관리 폴더 만들기


cd ~/environment


mkdir -p manifests/alb-controller && cd manifests/alb-controller



5

IAM ODIC 생성 (OpenID Connect) 생성

클러스터 내 Pod 가 API , 외부 서비스와 인증하기 위해 사용되는 service account에 IAM role을 사용하기 위해 필요.


eksctl utils associate-iam-oidc-provider \

--region ${AWS_REGION} \

--cluster eks-demo \

--approve



6

확인

aws eks describe-cluster --name eks-demo --query "cluster.identity.oidc.issuer" --output text


aws iam list-open-id-connect-providers

aws iam list-open-id-connect-providers | grep 8A6E78112D7F1C4DC352B1B511DD13CF



7

로드 밸런서 컨트롤러에 부여할 iam policy 생성


aws iam create-policy \

--policy-name AWSLoadBalancerControllerIAMPolicy \

--policy-document https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json



8

서비스 어카운트 생성

eksctl create iamserviceaccount \

--cluster eks-demo \

--namespace kube-system \

--name aws-load-balancer-controller \

--attach-policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \

--override-existing-serviceaccounts \

--approve



참고

https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/deploy/installation/




<9> Cert-manager 설치


1

쿠버네티스 클러스터 내에서 TLS인증서를 자동으로 프로비저닝 및 관리하는 오픈 소스

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.4.1/cert-manager.yaml



2

wget https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/install/v2_2_0_full.yaml



3

vi v2_2_0_full.yaml



4

# 파일 수정


ServiceAccount yaml spec 부분 8줄을 없애줍니다

---

apiVersion: v1

kind: ServiceAccount

metadata:

labels:

app.kubernetes.io/component: controller

app.kubernetes.io/name: aws-load-balancer-controller

name: aws-load-balancer-controller

namespace: kube-system



5

클러스터 이름 수정

eks-demo로 변경


spec:

containers:

- args:

- --cluster-name=eks-demo # 생성한 클러스터 이름을 입력

- --ingress-class=alb



6

모니터링용 터미널 1


watch -d kubectl get pod,ds,svc,ep,deployment -A

kubectl get pod,ds,svc,ep,deployment -A


배포

kubectl apply -f v2_2_0_full.yaml



7

컨트롤러 실행 확인

kubectl get deployment -n kube-system aws-load-balancer-controller



8

서비스 어카운트 생성 확인

kubectl get sa aws-load-balancer-controller -n kube-system -o yaml



9

로그로 확인 (선택)

kubectl logs -n kube-system $(kubectl get po -n kube-system | egrep -o "aws-load-balancer[a-zA-Z0-9-]+")



10

ALBPOD=$(kubectl get pod -n kube-system | egrep -o "aws-load-balancer[a-zA-Z0-9-]+")

kubectl describe pod -n kube-system ${ALBPOD}



11

참고 자료

IP mode는 서비스 어카운트가 필요

https://brunch.co.kr/@topasvga/1868





<10> 배포


1

접속 순서

ALB > Ingress > Service > Pod



2

배포 순서

ECR > Deployment > Service > Ingress


L7 ALB 인그래스의 IP mode로 서비스해보자.


https://brunch.co.kr/@topasvga/1869




<11> 삭제


EC2 > Autoscaling 부터 삭제한다. 그래야 삭제한 EC2가 다시 생성되지 않는다.

Cloud formation 삭제한다.

VPC를 삭제한다.

LB를 삭제한다.







<30> (몰아보기) EKS 실습5


https://brunch.co.kr/@topasvga/1884



https://brunch.co.kr/@topasvga/1679




<20> 다음 2. Cloud9생성과 EKS생성



https://brunch.co.kr/@topasvga/1880



keyword
매거진의 이전글EKS 3탄-3. Helm으로 nginx설치-3/3