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 |