본문 바로가기

KOSA 클라우드 솔루션즈 아키텍트 양성과정

[7.21] kubernetes(ECR, EKS)

** review : taint처리된 노드에서 작업을 할 수 있게끔 하는 것이 torlerations 필드


--- AWS EC2 도커 설치

=> EC2 생성 시 사용자 스크립트

=> EKS 마스터 노드에 접근하는 클라이언트의 역할

#!/bin/bash
cd /tmp
=> 이렇게 절대경로를 지정하지 않으면, 아래의 curl 명령어로 어디에 설치되었는지 알 수 없음
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install
amazon-linux-extras install docker -y
systemctl enable --now docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
usermod -a -G docker ec2-user
=> 도커 그룹에 ec2-user를 추가시키면 도커 명령어 사용 시 sudo를 붙이지 않아도 됨

--- EKS


- aws 자격증명

$ aws configure

- aws ecr 업로드(push)
$ aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/r5a6z4q5

$ docker tag web-site:v1.0 public.ecr.aws/r5a6z4q5/web-site:v1.0

$ docker push public.ecr.aws/r5a6z4q5/web-site:v1.0

- eks cli
$ aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER
$ curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.21.2/2021-07-05/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin
$ source <(kubectl completion bash)
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
$ kubectl version --short --client
$ kubectl get svc

-- IAM 사용자 생성

 

사용자 추가

 

.csv 파일 다운로드(분실하면 안 됨)


-- 역할(Role) 만들기

=> 역할(Role)은 특정 리소스가 다른 리소스를 관리할 수 있도록 부여하는 것

역할 만들기

 

일반 사용 사례 EC2 선택

 

S3FullAccess 선택
역할 이름만 기입하고 역할 생성하기


-- s3 생성

ACL 비활성화 : ACL을 조작하지 못하도록 하는 정책


-- aws configure

 

IAM user 만들 때 생성된 .csv파일을 활용하여 aws configure
.aws 안에 credentials 관련 정보가 들어 있어서 삭제하면 configure 안 됨, 따라서 역할(role)이 필요


 

-- 역할(Role)

=>  EC2 자체에게 s3에 접근할 수 있는 역할(role)을 주면 aws configure가 필요 없음

 

docker라는 EC2의 IAM 역할 수정

 

s3-role : s3FullAcess

 

EC2에게 s3에 접근할 수 있는 역할을 주니까 credential 없이 s3 버킷에 접근 가능해짐


-- ECR(Elastic Container Registry) 생성

 

AWS ECR 리포지토리
리포지토리 생성

 

퍼블릭 선택

 

리포지토리 이름의 앞 부분은 랜덤하게 배정된 계정과 주소 부분, web-site라는 이미지를 푸시할 것이므로 web-site를 리포지토리 이름으로 기입, 이후 리포지토리 생성

 

리포지토리 이름 체크 후 푸시 명령 보기

 

도커 클라이언트 인증을 위해 첫 명령어 복사
도커 클라이언트가 aws에 로그인 되어 있어야 함

 

configure 후 도커 클라이언트 인증을 위한 명령어 붙여 넣기(이중으로 보안이 되어 있는 것)

 

IAM 역할 없애기

 

역할(role)을 없앴는데도 aws s3 ls 명령어로 버킷 확인 가능

 

ECR 콘솔에서 ECR의 레포지토리 주소를 복사
도커 클라이언트의 이미지를 ECR 레포지토리 주소와 태그하여 같은 이미지ID가 하나 더 만들어짐

 

태그된 이미지를 push
리포지토리 이름을 클릭하면 이미지 태그 확인 가능

 

이미지의 이름도 확인 가능(URI)


-- EKS의 컨트롤 플레인에서 사용할 역할(Role) 생성

역할 이름 지정 후 역할 생성


-- EKS(Elastic Container Service)

도커 사용자로 로그인

-- 마스터 노드 생성

마스터 노드 : cpu 2core, memory 4G를 사용해야 함, 워커 노드 : t2.micro 프리티어를 사용하여 비용이 청구되지 않음

 

 

서브넷 : t2.micro에서 선택할 수 있는 퍼블릭 서브넷 a와 c 가용영역만 선택
마스터노드에서 작업할 수 있지만, 작업 노드에서 작업하려면 작업 노드에 퍼블릭 IP부여
컨트롤 플레인에 문제가 생기면 해당 로그들을  CloudWatch Logs로 보내는 로깅, 이후 생성하면 마스터 노드가 생성됨

- 클러스터가 만들어지면 EC2로 워커 노드를 만들어야 함


-- kubectl 설치

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html  링크에서 버전에 맞는 kubectl 설치

 

sudo mv ./kubectl /usr/local/bin : kubectl을 어디서든 사용할 수 있게 함

 

bashrc에 completion bash를 넣으면 재부팅 시에도 자동완성 적용

 

aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER를 해야 get svc 명령어 사용 가능
콘솔에서 클러스터가 생성된 후 자격증명
자격증명 후 get svc 명령어 사용 가능


-- 워커노드 만들기

 

콘솔 -> 컴퓨팅 - > 노드 그룹 추가

 

aws가 자동으로 EC2를 만들 수 있도록 Role로 권한을 줘야 함
AmazonEKSWorkerNodePolicy, AmazonEC2ContainerRegistryReadOnly, AmazonEKS_CNI_Policy 세 가지 역할 선택

 

nodeGroupRole로 이름 지정
밑으로 스크롤해서 정책이 제대로 추가되었는지 확인
앞서 생성한 Role을 선택
spot으로 만들어도, 마스터가 관찰하다가 Desired State에 의해 control manager가 노드 개수를 유지, 실습은 on-demand

 

 

어차피 key가 있으니까 실습 시 혼란을 피하기 위해 SSH 접속 대상을 모두로 선택

 

원하는 크기(Desired State)를 2개로 했기 때문에 docker를 제외한 나머지 두 개의 인스턴스가 자동으로 생성됨
마스터 노드는 직접 만든 것이 아니기 때문에 보이지 않음, ip~~~이 내부 도메인 네임


--- Pod

=> 마스터 노드에서 실행

# mkdir workspace && cd $_
# kubectl get node
# kubectl run nginx-pod --image=nginx
# kubectl expose pod nginx-pod --name clusterip --type=ClusterIP --port 80
# kubectl expose pod nginx-pod --name nodeport --type=NodePort --port 80
# kubectl expose pod nginx-pod --name loadbalancer --type=LoadBalancer --external-ip 192.168.56.103 --port 80

=> port는 타깃 포트를 의미, nginx라는 pod는 80포트가 오픈되어 있음
# kubectl get pod
# kubectl get service
# kubectl exec -it nginx-pod -- bash

터미널에 접속하지 않고 쉘 명령어를 통해 바로 index.html파일 생성 가능


# kubectl get all
# kubectl delete svc --all
# kubectl delete pod nginx-pod