본문 바로가기
공부/AWS

[AWS] 쿠버네티스를 EKS 환경에서 구축하기

by 웅대 2023. 8. 18.
728x90
반응형

https://growth-coder.tistory.com/216

 

[Docker] 도커 개념 및 사용법

프로젝트를 진행하면서 로컬에서 잘 작동하던 프로젝트가 서버에 배포하면 잘 작동하지 않을 수 있다. 수많은 원인이 존재하겠지만 라이브러리 버전이 다르다거나 네트워크 환경이 다르다거나

growth-coder.tistory.com

이전에 도커 및 컨테이너의 개념 및 사용법에 대해 알아보았다.

 

컨테이너의 장점으로는 각각 독립적인 환경을 유지할 수 있다는 점이다.

 

이에 따라 여러 컨테이너를 띄워두고 작업을 할 수 있는데 컨테이너의 개수가 많아지면 문제가 발생할 수 있다.

 

1. 컨테이너 생성의 어려움

다음과 같이 정말 많은 컨테이너를 띄워야 한다고 생각을 해보자.

 

굉장히 많은 시간이 걸릴 것이다.

2. 컨테이너 관리의 어려움

컨테이너가 많으면 관리도 굉장히 어려운데 다음과 같은 상황이 발생했다고 가정해보자.

 

빨간색이 이미 컨테이너를 실행 중인 서버라고 하고 초록색이 실행 중이 아닌 서버라고 하면 초록색을 찾아서 컨테이너를 듸워야 한다.

 

인간이 수동으로 하면 많은 시간이 걸릴 것이다.

또한 애플리케이션에 기능이 추가되면서 여러 컨테이너를 업데이트 해야 한다면 얼마나 많은 시간이 걸릴까?

또한 몇 개 컨테이너가 죽는다면 다시 복구하는 것에도 시간이 많이 걸릴 것이다.

그래서 이렇게 번거로운 컨테이너들을 편리하게 관리해주는 도구가 컨테이너 오케스트레이션(Container Orchestration)이다.

 

컨테이너 오케스트레이션 툴 중 유명한 것이 바로 쿠버네티스(kubernetes)이다.

 

AWS의 서비스들을 이용하여 쿠버네티스 환경을 구축해 볼 예정이다.

 

그 전에 용어들을 정리해보려고 한다.

클러스터

클러스터는 특정 목적을 수행하기 위해 마치 하나처럼 동작하는 컴퓨터들의 집합이다.

 

쿠버네티스 클러스터 아키텍처는 다음과 같이 크게 control plane과 computer machines로 나뉘어진다.

쿠버네티스는 정말 다양한 일을 해준다.

 

컨테이너의 상태 관리도 해주고 replica를 여러 개 띄우는 것도 간단한 설정으로 가능하다.

 

특정 컨테이너를 추가로 띄울 때 여유가 있는 서버를 판단해서 여유가 있는 곳에 컨테이너를 띄우거나 새로운 서버를 만들어서 그 안에 띄우는 것도 자동으로 해준다.

 

이외에도 버전 관리, 스토리지 관리 등등도 자동으로 해준다.

 

이러한 쿠버네티스를 직접 구현해도 되지만 여러 클라우드 플랫폼에서 관리형 쿠버네티스를 지원해준다.

 

AWS의 EKS, Azure의 AKS, Google의 GKE 등등 여러 종류의 관리형 쿠버네티스가 존재하므로 적절한 것을 선택하면 된다.

 

다른 용어들은 간단한 정리를 통해 넘어가자.

 

용어 역할
master 컨트롤 플레인이 실행되는 곳.
pod 하나 이상 컨테이너의 모임. 가장 기본적인 배포 단위.
service pod의 경우 유동적이라 ip가 계속 변할 수 있는데 이를 외부에 노출시켜줌. ex) 로드밸런서
volume 컨테이너 내부 디스크에 저장하면 일시적이기 때문에 이를 방지하기 위한 저장소.
deployment pod에 레플리카 셋을 통해 안정성 보장.
kubectl 쿠버네티스를 관리하는 도구.
eksctl EKS 클러스터를 사용하기 위한 도구

 

EKS 환경 구축

이제 AWS에서 EKS 환경을 구축해보자.

 

우선 인터넷 연결이 가능하도록 public subnet에서 EC2 인스턴스를 하나 생성하자. (다음 포스팅 참고)

https://growth-coder.tistory.com/169

 

[AWS] public subnet에 EC2, private subnet에 RDS 인스턴스 생성하기 (1)

이번 포스팅에서는 public subnet에 EC2 인스턴스를 생성하고 privatet tsubnet에 RDS 인스턴스를 생성해서 통신할 예정이다. 다음 다이어그램은 우리가 만들 aws 아키텍처이다. EC2는 인터넷 게이트웨이와

growth-coder.tistory.com

그리고 이 EC2 인스턴스에 관리자 권한 역할을 부여하자. (AdministratorAccess)

 

IAM -> 역할 -> 역할 만들기에 들어간다.

 

AWS 서비스, EC2를 선택한다.

AdministratorAccess를 선택한다.

원하는 역할 이름을 적고 생성한다.

EC2 인스턴스에 들어가서 IAM 역할을 수정한다.

AdministratorAccess를 가진 역할로 수정하고 업데이트를 한다.

 

이제 이 EC2 인스턴스에 접속해서 kubectl 및 eksctl을 설치한다.

 

아래 공식 문서를 보면 설치 순서가 자세하게 나와있다. EC2를 사용하기 때문에 설치 환경은 Linux 부분을 보면 된다.

 

<kubectl 설치>

kubectl 설치 또는 업데이트 - Amazon EKS

 

kubectl 설치 또는 업데이트 - Amazon EKS

Amazon EKS 클러스터 제어 영역과 마이너 버전이 하나 다른 kubectl 버전을 사용해야 합니다. 예를 들어 1.26 kubectl 클라이언트는 Kubernetes 1.25, 1.26, 1.27 클러스터와 함께 작동합니다.

docs.aws.amazon.com

<eksctl 설치>

https://docs.aws.amazon.com/ko_kr/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-eksctl.html

 

eksctl 설치 - Amazon EMR

EKS에서 아마존 EMR을 설정하려면 eksctl 0.34.0 이상 버전이 있어야 합니다. 그러나 EKS 기반 Amazon EMR의 일부 기능에는 최신 버전이 필요하므로 최신 eksctl을 다운로드하는 것이 좋습니다. 자세한 정보

docs.aws.amazon.com

 

그리고 이제 node에 접속하기 위한 ssh 키를 생성하고 AWS에 등록한다.

 

cd .ssh
ssh-keygen
aws configure set region ap-northeast-2
aws ec2 import-key-pair --key-name "키 이름" --public-key-material file://~/.ssh/id_rsa.pub

 

 

EC2 -> 키 페어 부분에 우리가 설정한 키 이름이 존재한다면 성공한 것이다.

 

이제 eks cluster와 노드(EC2)를 만들 차례이다. 다음과 같은 cluster.yaml 파일을 작성한다.

 

<cluster.yaml>

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
 
metadata:
  name: [eks 클러스터 이름]
  region: ap-northeast-2
  version: "버전"
 

managedNodeGroups:
  - name: [노드 그룹 이름]
    instanceType: [인스턴스 타입]
    instanceName: [인스턴스 이름]

    minSize: 1
    maxSize: 1

    ssh:
      allow: true
      publicKeyName: [생성한 키 이름]

원래는 여러 개의 노드를 생성해서 고가용성으로 구성하는 것이 일반적이지만 노드(EC2)를 여러 개 생성하면 금방 프리티어 할당량을 넘어서기도 하고 지금은 사용법 정도만 알아보는 포스팅이기 때문에 1개로 구성하였다.

 

나는 다음과 같은 설정을 진행하였다.

 

<내가 만든 cluster.yaml>

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
 
metadata:
  name: cluster
  region: ap-northeast-2
  version: "1.26"
 

managedNodeGroups:
  - name: node-group
    instanceType: t3.medium
    instanceName: node

    minSize: 1
    maxSize: 1

    ssh:
      allow: true
      publicKeyName: "키 이름"

vi culster.yaml 명령어를 통해 파일을 생성하고 위 내용을 복사해준다.

 

이제 위 yaml 파일을 생성한 곳에서 다음 명령어를 입력하면 된다.

 

eksctl create cluster -f cluster.yaml

20분에서 30분 정도의 시간이 걸린다.

 

kubectl get node 명령어를 통해 잘 생성되었는지 확인해보고 EC2 인스턴스가 새롭게 하나 생성되었는지 확인하자.

 

이제 Deployment를 생성하기 위한 yaml 파일을 작성해준다.

 

<deployment.yaml>

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      run: nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

 

설명을 해보자면 우선 Deployment의 이름을 nginx라고 정해두고 matchLabels를 통해 label이 nginx인 파드들을 관리하겠다고 정의를 해두었다.

 

또한 pod의 replicas는 두 개로 정해두었고 label을 nginx라고 붙여주었다.

 

컨테이너의 이름, 포트, 사용할 이미지도 정해둔 모습을 볼 수 있다.

 

deployment.yaml 파일을 생성한 위치에서 다음 명령어를 입력하자.

 

kubectl apply -f deployment.yaml

kubectl get pod 명령어를 통해 잘 생성되었는지 확인하자.

 

위에서 pod의 경우 유동적이라서 ip가 변할 수 있다고 했다.

 

이를 외부로 노출시키기 위해서 service를 생성해야 한다. 

 

<service.yaml>

kind: Service
metadata:
  name: nginx
  labels:
    run: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: nginx
  type: LoadBalancer

다음 명령어를 통해 서비스를 생성하자.

kubectl apply -f service.yaml

서비스까지 성공적으로 생성했다면 외부에서 접속할 수 있다

 

kubectl get svc를 통해 서비스 정보를 출력하면 external ip를 확인할 수 있다.

 

[external ip] : [포트 번호]에 접속해서 다음과 같은 페이지가 뜬다면 성공한 것이다.

참고

https://www.redhat.com/ko/topics/containers/kubernetes-architecture

 

쿠버네티스 아키텍처(Kubernetes architecture) 개념 & 구성

쿠버네티스의 구성요소와 구성요소 간 상호 작용 방식에 대해 소개하고, 컨트롤 플레인의 역할과 구조를 설명합니다.

www.redhat.com

https://www.youtube.com/watch?v=Ia8IfowgU7s&list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb 

https://docs.aws.amazon.com/ko_kr/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-eks-cluster.html

 

아마존 EKS 클러스터 설정 - Amazon EMR

EKS 클러스터를 만들 때는 키 페어가 필요하지 않습니다. 하지만 키 페어를 지정하면 노드가 생성된 후 해당 노드에 SSH로 연결할 수 있습니다. 노드 그룹을 생성할 때만 키 페어를 지정할 수 있습

docs.aws.amazon.com

https://eksctl.io/usage/creating-and-managing-clusters/

 

Creating and managing clusters - eksctl

Creating and managing clusters Creating a cluster Create a simple cluster with the following command: That will create an EKS cluster in your default region (as specified by your AWS CLI configuration) with one managed nodegroup containing two m5.large nod

eksctl.io

 

728x90
반응형

댓글