Cloud Solution Architect/AWS

Amazon - EKS

YunHyeong 2023. 6. 12. 18:28

0. EKS 개념 및 아키텍처

- 쿠버네티스 완전 관리형 서비스

- ECR : Docker hub 같은 이미지 저장 장소

 

1. 도커 VM에 ECR 설치

1.1 사용자 생성

- root 사용자에 준하는 권한을 준다.

- 암호도 알고 사용자 이름도 알고 있으니 굳이 .csv 파일을 다운받지 않는다.

- 사용자에 MFA 설정

- 디바이스 이름 설정 후 MFA 코드 2개를 입력한다.

- 액세스 키를 생성하고 .csv 파일을 다운 받는다

- 절대 키를 외부에 노출 시키지 않는다.

- 계정 ID를 별칭으로 바꿀 수 있다.

 

1.2 ECR 생성

- 액세스키 생성후 나타난 URL을 구글 크롬에서 더보기 창을 눌러 시크릿 창 모드로 접근한다.

- 설정에서 언어를 한국어 리전을 서울로 설정하고 저장한다.

- 그리고 서울을 기본 리전으로 저장한다.

- 도커 사설 레지스트리에 있는 이미지들 확인

- curl http://192.168.1.150:5000/v2/_catalog

- 특정 이미지를 확인하고 pull로 가져온다.

- aws와 food 둘다 가져오기

------- aws cli 설정
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ exit

- docker vm에 aws cli 설정

 

- eks 서비스에서 왼쪽에 ECR 버튼 클릭

- 리포지토리 생성 버튼을 누르고 web-site로 url 생성

- 이 주소로 docker vm에서 이미지를 설정할 예정 

- ecr에서 생성한 레포지토리 주소로 tag를 만들고 푸시를 했지만 자격증명이 되어있지 않아서 실패

- aws configure 명령어를 치고 자격증명을 마친다.

- 이전에 생성한 사용자 액세스 키를 활용한다.(.csv)

 

aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/w3h1o2e6

- 주소의 ID를 활용하여 ecr 을 vm에 등록

- 위의 tag를 잘못 입력했기 때문에 다시 태그 지정

- aws와 food 모두 ECR 레지스트리에 push

- 이미지들이 정상적으로 ECR에 올라온 것을 확인

- docker vm의 이미지들을 지우고

 

- ECR에 있는 이미지를 활용하여 컨테이너를 생성한다

- 이름을 각각 aws-web, aws-food로 지정( 밑에 aws-web은 잘못 지정한 것)

- 포트 충돌이 나지 않도록 서로 포트를 다르게 설정

- aws 이미지로 만든 8081 포트로 접근

- food 이미지로 만든 8082 포트 컨테이너에 접근

- 또 다른 레포지토리 생성(test-home)

- 사설 레지스트리(192.168.1.148:5000)에서 test-home:v0.0 pull로 가져오고 tag 지정 후 ECR 레지스트리에 push

- ECR에 있는 이미지 확인

- test-home:v1.0도 push

- ECR에서 이미지 확인

- 같은 방식으로 v2.0도 tag 후 push

 

1.3 EKS 클러스터의 역할 생성

- 역할 만들기 버튼 클릭

- 역할 이름까지 적고 생성 버튼 클릭

 

- EKS 생성 버튼 클릭

 

- 이름, 버전(최신), 이전에 생성한 역할을 지정한다.

 

- my-vpc 선택

- 2b와 2d는 선택할 수 없으니 해제한다.

- 2a, 2c 역시도 실습상 편의를 위해 pvt 영역은 해제

- 보안그룹은 web-sg로 선택

 

- CloudWatch 로깅 선택

- 그대로 다음 버튼 클릭

CNI : 쿠버네티스에서 Pod 간의 통신을 위해서 CNI 를 사용

 

- EKS 생성 확인

 

curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.26.4/2023-05-11/bin/linux/amd64/kubectl

- eks cli 설치

$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin
$ source <(kubectl completion bash)
$ echo "source <(kubectl completion bash)" >> ~/.bashrc # 시스템 재부팅 시에도 bash compeletion 실행
$ kubectl version

- ./kubectl 파일의 권한을 변경하고 경로 변경

- bash-completion설치 후 설정

 

aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER

- VM과 EKS가 교신이 되도록 만드는 명령어

 

kubectl config get-contexts

- context 확인

 

- nodegroup 역할 만들기
AmazonEKSWorkerNodePolicy
AmazonEC2ContainerRegistryReadOnly
AmazonEKS_CNI_Policy

- 노드 역할 정책들 추가

- 하나씩 검색해서 체크박스를 눌러서 선택할 수 있다

 

- 최종적으로 이름 설정 후 역할 생성

 

- 노드 만들기

- 역할과 이름 설정 후 다음 버튼 클릭

- OS 이미지, 용량 유형, 인스턴스 타입, 노드 수를 설정

 

- 서브넷, 키, 원격 엑세스 설정

- 인스턴스 유형 확인 후 최종적으로 생성

- 인스턴스 생성 확인

- 각 노드들은 모두 쿠버네티스가 설치되어 있음

- 연결 확인

 

- docker 서브에서 노드 확인

 

$ mkdir test && cd $_
$ vi deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-site-deployment
spec:
  replicas: 4
  selector:
    matchLabels:
      app: web-site-deployment
  template:
    metadata:
      name: web-site-deployment
      labels:
        app: web-site-deployment
    spec:
      containers:
      - name: web-site-deployment-container
        image: public.ecr.aws/w3h1o2e6/web-site:aws

$ kubectl apply -f deployment.yaml

 

$ vi loadbalancer-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment
spec:
  type: LoadBalancer
  selector:
    app: web-site-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

$ kubectl apply -f loadbalancer-deployment.yaml

 

- CLB가 생성된다

 

- CLB 주소로 접근하면 설정한 이미지가 나온다.

 

- Route53에서 CLB의 레코드를 생성한다.

 

kubectl edit deployments.apps web-site-deployment

- ScaleOut 하기

- replicas:4 -> 6

 

 

- pod가 6개가 된다.

- 거의 하나의 노드당 하나의 파드가 생긴다.

- 2개가 Pending?

 

- kubectl describe pod <Pending이 발생한 pod>

- t2.micro 인스턴스 타입이 저사양이기 때문에 12개의 pod를 생성하지 못함

 

- node를 자세히 확인해보니 노드 당 pod 생성 갯수가 4개로 제한되어 있었다.

- 시스템 pod 2개와 내가 만든 파드 2개로 구성되어 있었다.

 

- 세번째 노드는 아예 시스템 파드로만 채워져있었다.

- 여기서 2개의 파드를 생성하지 못했기 때문에 Pending 현상이 발생한거 같다 

- pod를 10개로 scaleIn 한다.

- 정확히 Pending 상태의 2개의 pod만 날아감

 

- 노드의 수를 2배로 늘려본다.

- 노드의 수가 12개가 된다.

 

kubectl scale deployment web-site-deployment --replicas 22

- pod 갯수 22개로 늘리기( ScaleOut)

- 24개는 t2.micro 인스턴스 타입으로는 불가

- 22개의 pod를 확인할 수 있다.

 

- pod를 11개로 줄인다.

- kubectl scale deployment web-site-deployment --replicas 11

 

- deployment2.yaml 파일을 수정하기

 

- 이번에는 node-port 서비스로 생성

 

- 생성된 pod와 서비스의 포트를 확인한다.

- pod 중 하나의 IP를 인스턴스에서 검색한다

 

 

- 보안 그룹의 인바운드 포트 편집에서 모든 소스에대해 NodPort의 포트 번호를 허용한다.

- pod가 속한 노드의 내부 IP를 알아내어 그 노드의 포트번호를 입력하여 접근한다.

- 다음과 같이 food 화면이 나타난다.

 

- vi clusterip-deployment.yaml을 생성하고 다음과 같이 수정한다.

- externalIPs의 주소는 node의 내부 주소로 설정한다.(외부 트래픽이 node의 externalIP를 통과하여 pod에 접근하기 위해서는 clusterip 서비스의 외부 주소는 node의 내부주소로 설정해야한다.)

- 보안그룹의 HTTP 80포트를 열어준다.

- node의 외부 IP로 접근하면 다음과 같은 결과를 얻을 수 있다.

'Cloud Solution Architect > AWS' 카테고리의 다른 글

Terraform - VPC, EC2, Autoscaling  (0) 2023.05.18
AWS-CloudFormation  (0) 2023.05.16
AWS-CLI  (0) 2023.05.15
2차 세미 프로젝트 - Openstack  (0) 2023.05.11
AWS - Amazon Inspector, CloudWatchLog, NAT Instance  (0) 2023.05.02