brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Sep 03. 2021

EKS 5탄-1. EKS 생성법-1/3

5탄 - 1/3

명령 내릴 서버를 만들고, 신규 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 로그인

# 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



2

#  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/



3

# 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



4

# aws cli 업데이트


sudo pip install --upgrade awscli

aws --version



5

#  json 지원


sudo yum install -y jq


#  bash 지원


sudo yum install -y bash-completion




6

참고

 설치는 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



7

#  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



8

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


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



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari