본문 바로가기

메가존 클라우드 2기 교육/실무 특화

Kubernetes - Amazon EKS

Amazon EKS란?

 Amazon Elastic Kubernetes Service(Amazon EKS)는 Kubernetes 제어 플레인을 설치하고 운영할 필요 없이 AWS에서 Kubernetes를 손쉽게 실행하도록 하는 관리형 서비스이다. Kubernetes는 컨테이너화된 애플리케이션의 배포, 조정 및 관리 자동화를 위한 오픈 소스 시스템이다.

Amazon EKS는 여러 가용 영역에서 Kubernetes 제어 플레인 인스턴스를 실행하여 고가용성을 보장한다. Amazon EKS는 비정상 제어 플레인 인스턴스를 자동으로 감지하고 교체하며, 자동화된 버전 업그레이드 및 패치를 제공한다.


IAM 설정

IAM 사용자 생성

'사용자 추가' 클릭


MFA 디바이스 할당



사용자 생성 완료.

'멀티 팩터 인증(MFA)'의 'MFA 디바이스 할당' 클릭


이전에 설치한 구글 OTP로 인증을 한다.

액세스 키 만들기

'액세스 키 만들기' 클릭



'.csv 파일 다운로드'를 눌러 키를 보관한다.

 IAM 로그인

우측의 '이 계정의 IAM 사용자를 위한 로그인 URL'을 클릭하여 로그인.

 


AWS EKS

VM 세팅

기존 VM을 재활용한다. 사설 레지스트리의 파일을 다운로드

AWS 자격증명

$ aws configure
액세스 키, 시크릿 액세스 키, 리전 이름, 포멧을 입력.

AWS ECR 업로드(push)

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

좌측의 'Amazon ECR' 클릭

'시작하기' 클릭

'퍼블릭'과 리포지토리 이름 설정


퍼블릭 리포지토리 생성 완료. 해당 URI를 도커 사설 레지스트리를 사용하듯이 사용하면 된다.

# aws ecr에 로그인 
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/a9m2n3r6

$ docker tag 192.168.1.158:5000/web-site:aws public.ecr.aws/a9m2n3r6/web-site:aws
$ docker push public.ecr.aws/a9m2n3r6/web-site:aws

$ docker tag 192.168.1.158:5000/web-site:aws public.ecr.aws/a9m2n3r6/web-site:food
$ docker push public.ecr.aws/a9m2n3r6/web-site:food

PUSH 성공.

## PUSH 확인 테스트
# 기존 이미지 삭제
docker rmi public.ecr.aws/a9m2n3r6/web-site:food
docker rmi public.ecr.aws/a9m2n3r6/web-site:aws

# ECR에서 이미지를 가져와 컨테이너 생성
docker run -d -p 8081:80 --name aws-web public.ecr.aws/a9m2n3r6/web-site:aws
docker run -d -p 8082:80 --name food-web public.ecr.aws/a9m2n3r6/web-site:food

똑같이 리포지토리 'test-home'을 생성해서 도커에 있던 이미지를 업로드한다.

'리포지토리 생성' 클릭



docker pull 192.168.1.158:5000/test-home:v0.0
docker tag 192.168.1.158:5000/test-home:v0.0 public.ecr.aws/a9m2n3r6/test-home:v0.0
docker push public.ecr.aws/a9m2n3r6/test-home:v0.0

docker tag 192.168.1.158:5000/test-home:v1.0 public.ecr.aws/a9m2n3r6/test-home:v1.0
docker push public.ecr.aws/a9m2n3r6/test-home:v1.0

docker tag 192.168.1.158:5000/test-home:v2.0 public.ecr.aws/a9m2n3r6/test-home:v2.0
docker push public.ecr.aws/a9m2n3r6/test-home:v2.0

EKS 클러스터 IAM 역할 생성




역할 생성 완료.

 EKS 클러스터 생성

'생성' 클릭


서브넷은 'pub-2a', 'pub-2c' / 보안 그룹은 'my-web' / 퍼블릭


최신 버전 그대로.

검토 후 생성

EKS 클러스터 활성화 완료.

 EKS CLI

# kubectl 다운로드
$ curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.26.4/2023-05-11/bin/linux/amd64/kubectl
$ chmod +x ./kubectl

# 어느 경로에서든 kubectl을 사용할 수 있도록 kubectl을 bin으로 이동
$ mv ./kubectl /usr/local/bin

# kubectl 자동완성
$ echo "source <(kubectl completion bash)" >> ~/.bashrc

# EKS 클러스터 접속
$ aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER

$ kubectl version --short --client
$ kubectl get svc

노드 그룹 추가

'노드 그룹 추가' 클릭

 노드 그룹 역할 생성

노드들은 EC2에 있다.

AmazonEKSWorkerNodePolicy
AmazonEC2ContainerRegistryReadOnly
AmazonEKS_CNI_Policy



eksNodeRole 생성완료.



'pub-2a', 'pub-2c' 이용



노드들이 생성됐다.

CLI에서도 노드가 확인된다.

EKS - 로드 밸런서

$ 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/a9m2n3r6/web-site:aws
//

# kubectl apply -f deployment.yaml
# kubectl get all

$ 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
# kubectl get svc
이전과 다르게 로드 밸런서의 외부 아이피를 도메인으로 준다.




Route53 도메인 주소로 접속

테스트 - 스케일링 

# kubectl edit deployments.apps web-site-deployment
//
replicas 를 6으로 변경
//

파드가 6개로 스케일 아웃 됐다.

10개의 파드까지 밖에 생성이 안된다. (하나의 노도에 파드가 배치가 안됨)
하나의 노드에 coredns 파드가 있어서 빈자리가 없기 때문에 파드를 배치가 불가능함.
파드가 배치된 노드의 모습

## scale in
# kubectl scale deployment web-site-deployment --replicas 10

노드의 개수를 늘려본다.
## scale out
# kubectl scale deployment web-site-deployment --replicas 22

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

EKS - 노드 포트

# cp deployment.yaml deployment2.yaml
# vi deployment2.yaml
//
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-site-deployment2
spec:
  replicas: 5
  selector:
    matchLabels:
      app: web-site-deployment2
  template:
    metadata:
      name: web-site-deployment2
      labels:
        app: web-site-deployment2
    spec:
      containers:
      - name: web-site-deployment-container2
        image: public.ecr.aws/a9m2n3r6/web-site:food
//

# kubectl apply -f deployment2.yaml

## 노드 포트로 변경
# cp loadbalancer-deployment.yaml  nodeport-deployment.yaml
# vi nodeport-deployment.yaml
//
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service-deployment
spec:
  type: NodePort
  selector:
    app: web-site-deployment2
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
//

# kubectl apply -f nodeport-deployment.yaml
# kubectl get svc
도커가 클러스터 안에 있지 않기 때문에 접속 불가.

외부 아이피와 포트 번호를 통해 접속도 불가. 보안 그룹 때문
해당 아이피의 eks-remoteAccess 보안 그룹 클릭.
인바운드 규칙 편집
노드 포트의 포트 번호를 개방.
웹 사이트 접속이 가능해졌다.

EKS - 클러스터 아이피 

# cp nodeport-deployment.yaml cluster-deployment.yaml
# vi cluster-deployment.yaml
//
kind: Service
metadata:
  name: cluster-service-deployment
spec:
  type: ClusterIP
  externalIPs:
  - 10.31.45.203  # 노드 포트에서 사용한 아이피에 대응하는 내부 아이피
  selector:
    app: web-site-deployment2
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
//

# kubectl apply -f cluster-deployment.yaml
# kubectl get svc

다시 'eks-remoteAccess'의 보안 그룹에 80포트를 추가.

웹 사이트 접속 가능.

마지막으로 보안 그룹에 대해 더 정리를 하자면,

 두번째 규칙을 보면 자기 자신을 소스로 한다. 이렇게 하면, 해당 보안 그룹 안에 있는 클러스터 내부의 모든 트래픽이 허용된다.