brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Sep 03. 2021

EKS 5탄-1. EKS 생성법

5탄 - 1/3

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


<1> AWS 콘솔에서 Cloud9 설치 - 명령을 내릴 서버 1대 생성

<2> 각종 명령어 툴 설치

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

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

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

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

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

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

<9> Cert-manager 설치

<10> 배포

<11> 삭제

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

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




<1> AWS 콘솔에서 Cloud9 설치 - 명령을 내릴 서버 1대 생성


1

aws 콘솔 로그인  >  토쿄 or 싱가포르 or 서울 리전 선택 (어디든 상관없다)

VPC 마법사로 VPC 1개 - Public Subnet 1개  만든다.

Public Subnet에 Cloud9 생성한다.


2

순서는

admin role 생성, Cloud9 서버 생성,  명령어 툴 설치 , 권한 제공


3

admin role 생성 ?

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

Cloud9  > k8s-admin >  생성,  admin role을 해당 EC2 서버에 연결하기


3

Cloud9 서버 생성?

Cloud9에서

Cloud9 , 서버 1대 구축하는 것이다.

해당 서버에 role을 주거나  해당 서버에서 access-key를 설정해서 사용한다.

ec2 가서 admin-role을 ec2에 적용

해당 서버에서 명령을 내리기 위해, 각종 명령어 툴을 설치한다.

or


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

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

or


Cloud9 , EKS 까지 한번에 설치 - CloudFormation



4

기존 크리덴셜 적용 안되게 설정 변경하기

오른쪽 위 톱니바퀴 클릭 > AWS Settings > Credentials> AWS managed temporry credentials  비활성화 (빨간색이 보이도록 한다)



5

기존 크리덴셜 삭제

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



6

cloud9에서

aws sts get-caller-identity --query Arn

(적용한 role  나오면 정상)




<2> 각종 명령어 툴 설치


cloud9  서버에  각종 명령어 툴 설치하기



1

aws cli 업데이트

sudo pip install --upgrade awscli

aws --version



2

eksctl , 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

쿠버 네티스에 명령을 내리는 유틸

sudo curl -o /usr/local/bin/kubectl    https://amazon-eks.s3-us-west-2.amazonaws.com/1.20.4/2021-04-12/bin/linux/amd64/kubectl


sudo chmod +x /usr/local/bin/kubectl

kubectl version --client=true --short=true



4

기타

json 지원

sudo yum install -y jq


bash 지원

sudo yum install -y bash-completion



5

참고

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



6

디폴트 값 세팅

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

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')

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> Cloud9에서  컨테이너 이미지 만들어 보기  (선택)


1

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

실행

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

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



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로 한다.

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.28 버전으로 설치한다. = 2023년 12월 최신



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

---

apiVersion: eksctl.io/v1alpha5

kind: ClusterConfig


metadata:

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

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

  version: "1.28"


vpc:

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


managedNodeGroups:

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

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

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

    volumeSize: 10  # 클러스터 워커 노드의 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


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

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

// ssh는 막음

// 볼륨은 10 ,  실무에서는 30 정도로.




5

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


// 아래 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도 삭제해야 인스턴스가 삭제된다.

그렇지 않으면 다시 자동 생성됨



6

확인

kubectl get nodes


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




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


1

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

안 보인다.

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

권한을 추가한다 ( 선택)



2

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


echo ${rolearn}



3

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

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



4

매핑 생성

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



5

정보 확인

kubectl describe configmap -n kube-system aws-auth



6

콘솔 가서 확인

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




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



참고

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



1

Helm 설치

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

helm version --short

helm repo add stable https://charts.helm.sh/stable



2

kube-ops-view  설치

helm install kube-ops-view stable/kube-ops-view --set service.type=LoadBalancer --set rbac.create=True



3

차트 설치 확인

helm list

(t6-admin@myeks:default) [root@myeks-host ~]# helm list

NAME          NAMESPACE       REVISION        UPDATED     STATUS      CHART             APP VERSION

kube-ops-view   default    1  2021-08-30 18:46 +09 KST deployed   kube-ops-view-1.2.4     20.4.0



4

kubectl get svc kube-ops-view

(t6-admin@myeks:default) [root@myeks-host ~]# kubectl get svc kube-ops-view

NAME            TYPE           CLUSTER-IP       EXTERNAL-IP         PORT(S)        AGE

kube-ops-view   LoadBalancer   10.100.154.244   a8fac4b27fee24f5192de1977dae80c2-2086998210.ap-northeast-2.elb.amazonaws.com   80:32458/TCP   3m6s

CLB가 자동 생성된다.

(5분 소요)



5

웹브라우저로  접속




<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를 삭제한다.





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



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



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


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



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



감사합니다.

매거진의 이전글 (몰아보기) EKS 실습 5탄-EKS로 웹 서비스 구축

작품 선택

키워드 선택 0 / 3 0

댓글여부

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