brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jul 09. 2021

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

실습 3탄 =  1/3

<1>   AWS-com3 EC2 생성(필수)

<2>  eksctl , kubectl tool  설치 (필수)

<3>   EKS 생성 - 1.31

<4> 모니터링 kube-ops-view 생성

<5> eksctl로 node 수 증가 감소 = 물리서버 증가 감소해보기 (실습)



<1>   AWS-com3 EC2 생성(필수)



1

EKS를 CLI로  생성하기 위해 서버 1대가 필요하다.


EC2 생성

https://console.aws.amazon.com/console/home


t3.미듐

기존 키페어 사용


hostnamectl --static set-hostname aws-com3

[root@ip-172-31-32-9 ~]# exit

logout

[ec2-user@ip-172-31-32-9 ~]$ sudo su -

[root@aws-com3 ~]#




2

# EC2에 admin role을 주어 사용한다. 


iam > roles > create role > ec2 > admin > eks-admin


aws s3 ls 








<2>  eksctl , kubectl tool  설치 (필수)



다음은 다운로드하여 수동으로 각종 툴을 설치하는 법


1

eksctl 설치?


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


eksctl completion bash >> ~/.bash_completion

. /etc/profile.d/bash_completion.sh

. ~/.bash_completion



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






2

# awscli 설치?  ,  아마존 리눅스는 기본 설치


sudo pip install --upgrade awscli && hash -r


aws --version

aws-cli/2.2.35 Python/3.8.8 Linux/4.14.243-185.433.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off



3

jq , gettext , bash호환 유틸 설치?


sudo yum -y install jq gettext bash-completion moreutils



4

# yaml 처리를 위해 yq 설치?


echo 'yq() {

  docker run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"

}' | tee -a ~/.bashrc && source ~/.bashrc




5

for command in kubectl jq envsubst aws

  do

    which $command &>/dev/null && echo "$command in path" || echo "$command NOT FOUND"

  done




6

# kubectl  bash 활성화


kubectl completion bash >>  ~/.bash_completion

. /etc/profile.d/bash_completion.sh

. ~/.bash_completion




7

echo 'export LBC_VERSION="v2.2.0"' >>  ~/.bash_profile

.  ~/.bash_profile




8

# Install kubens kubectx


yum install git -y


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






<3>   EKS 생성 - 1.31


1

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


export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)


export AWS_REGION=ap-northeast-2



export AZS=($(aws ec2 describe-availability-zones --query 'AvailabilityZones[].ZoneName' --output text --region $AWS_REGION))



2

# 리전 확인?


test -n "$AWS_REGION" && echo AWS_REGION is "$AWS_REGION" || echo AWS_REGION is not set

AWS_REGION is us-east-2




3

# bach 프로파일에 저장?


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


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


echo "export AZS=(${AZS[@]})" | tee -a ~/.bash_profile


aws configure set default.region ${AWS_REGION}


aws configure get default.region




4

# 임시 역할에 대한 검증?

# 만든 eks-admin role이 부여 되었는지 확인하는 명령어


aws sts get-caller-identity --query Arn | grep eks-admin -q && echo "IAM role valid" || echo "IAM role NOT valid"

IAM role valid




5

# 서비스 저장소 복제?


yum install git -y


mkdir environment

cd ~/environment

git clone https://github.com/brentley/ecsdemo-frontend.git

git clone https://github.com/brentley/ecsdemo-nodejs.git

git clone https://github.com/brentley/ecsdemo-crystal.git



6

# KMS = CMK 생성?


aws kms create-alias --alias-name alias/eksworkshop --target-key-id $(aws kms create-key --query KeyMetadata.Arn --output text)



7

# cluster 명령에 입력할 cmk arn 검색


export MASTER_ARN=$(aws kms describe-key --key-id alias/eksworkshop --query KeyMetadata.Arn --output text)



8

# Master arn 환경 변수를 bash에 저장


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



9

# EKS 클러스터  생성 , 1.31 버전 - 2024-12월 신규 버전

# 클러스터 이름 =   name: eksworkshop-eksctl3

# name: nodegroup3



cat << EOF > eksworkshop.yaml

---

apiVersion: eksctl.io/v1alpha5

kind: ClusterConfig


metadata:

  name: eksworkshop-eksctl3

  region: ${AWS_REGION}

  version: "1.31"


availabilityZones: ["${AZS[0]}", "${AZS[1]}", "${AZS[2]}"]


managedNodeGroups:

- name: nodegroup3

  desiredCapacity: 2

  instanceType: t3.small

  ssh:

    enableSsm: true


# To enable all of the control plane logs, uncomment below:

# cloudWatch:

#  clusterLogging:

#    enableTypes: ["*"]


secretsEncryption:

  keyARN: ${MASTER_ARN}

EOF


eksctl create cluster -f eksworkshop.yaml





(15분 걸림)


# eks cluser가  먼저 만들어진다.  콘솔에서 EKS 가면 클러스터가 생성 된다.

# node가 2번째로 만들어진다. 콘솔에서 EC2 가면 node 서버가 만들어 진다.


#  AWS 콘솔 >  CloudFormation 가서 진행 상태 확인이 가능하다.

#  Subnet만들어진 상태 확인 

#  AZ 3곳에 , pub - private 만들어 졌다.



https://vclock.kr/timer/#countdown=00:10:00&enabled=0&seconds=0&sound=xylophone&loop=1


12

# 설치된 node 확인


kubectl get nodes



cd

vi .bashrc

alias k=kubectl


echo 'alias k=kubectl' >> /etc/profile

echo 'complete -F __start_kubectl k' >> /etc/profile




# 서울리전에 EKS 생성 확인 - 콘솔



# 클러스터 이름


eksworkshop-eksctl3



# node 그룹

nodegroup3



# ec2 =  2대 =  t3.small 로 만들어짐

eksworkshop-eksctl3-nodegroup3-Node

eksworkshop-eksctl3-nodegroup3-Node





13

# 임시 역할을 저장하기 , 노드 그룹


STACK_NAME=$(eksctl get nodegroup --cluster eksworkshop-eksctl3 -o json | jq -r '.[].StackName')


ROLE_NAME=$(aws cloudformation describe-stack-resources --stack-name $STACK_NAME | jq -r '.StackResources[] | select(.ResourceType=="AWS::IAM::Role") | .PhysicalResourceId')


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






14

#  기타 -  아래 처럼 권한 주어야 하는데  EKS 생성한 사용자는 따로 권한 줄 필요가 없다.

# cloud9 에서 권한을 주는것이다.  여기서 불필요.


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

if echo ${c9builder} | grep -q user; then

 rolearn=${c9builder}

        echo Role ARN: ${rolearn}

elif echo ${c9builder} | grep -q assumed-role; then

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

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

        echo Role ARN: ${rolearn}

fi



15

# 인가 하기


echo ${rolearn}


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



16

# 확인


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


2021-07-10 07:41:13 [ℹ]  eksctl version 0.56.0

2021-07-10 07:41:13 [ℹ]  using region us-east-2

2021-07-10 07:41:13 [ℹ]  adding identity "arn:aws:iam::88888888:role/seo-administrator-role" to auth ConfigMap




<4> 모니터링 kube-ops-view 생성



# kube-ops-view 설치

파드와 노드증가를 시각화 하여 확인하는 Kubeops view 설치


1

# 방법 1 - git 다운로드 설치 - 80 포트


git clone https://codeberg.org/hjacobs/kube-ops-view.git

cd kube-ops-view/

kubectl apply -k deploy


3

외부에서 kube-ops-view를 접속하기 위해서 Service Type을 LoadBalancer 로 변경한다.


kubectl edit svc kube-ops-view



apiVersion: v1

kind: Service

metadata:

  annotations:

  name: kube-ops-view

spec:

  ....

  sessionAffinity: None

  type: LoadBalancer

status:




ClusterIP => LoadBalancer


(3분 걸림)


# kube ops view 접속 URL

kubectl get svc kube-ops-view | tail -n 1 | awk '{ print "Kube-ops-view URL = http://"$4 }'




4

# 방법 2 

Helm 으로 설치  - 8080 포트


kubens kube-system



helm repo add geek-cookbook https://geek-cookbook.github.io/charts/


helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ="Asia/Seoul" --namespace kube-system


kubectl patch svc -n kube-system kube-ops-view -p '{"spec":{"type":"LoadBalancer"}}'


kubectl annotate service kube-ops-view -n kube-system "external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain"


echo -e "Kube Ops View URL = http://kubeopsview.$MyDomain:8080/#scale=1.5"


( 5분 걸림)






<5> eksctl로 node 수 증가 감소 = 물리서버 증가 감소해보기 (실습)


1

# 터미널 2에서 모니터링


 watch -d kubectl get no,deploy,rs,pod,svc




2

EKS > 클러스터 > Compute > Node groups 이름 확인


nodegroup3



export CLUSTER_NAME=eksworkshop-eksctl3


eksctl scale nodegroup --cluster $CLUSTER_NAME --name nodegroup3 --nodes 1 --nodes-min 1 --nodes-max 6



export CLUSTER_NAME=eksworkshop-eksctl3


eksctl scale nodegroup --cluster $CLUSTER_NAME --name nodegroup3 --nodes 3 --nodes-min 3 --nodes-max 6



3

#    AWS EKS 실습 3


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


4

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


5

다음 과정


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


                    

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