https://growth-coder.tistory.com/216
이전에 도커 및 컨테이너의 개념 및 사용법에 대해 알아보았다.
컨테이너의 장점으로는 각각 독립적인 환경을 유지할 수 있다는 점이다.
이에 따라 여러 컨테이너를 띄워두고 작업을 할 수 있는데 컨테이너의 개수가 많아지면 문제가 발생할 수 있다.
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
그리고 이 EC2 인스턴스에 관리자 권한 역할을 부여하자. (AdministratorAccess)
IAM -> 역할 -> 역할 만들기에 들어간다.
AWS 서비스, EC2를 선택한다.
AdministratorAccess를 선택한다.
원하는 역할 이름을 적고 생성한다.
EC2 인스턴스에 들어가서 IAM 역할을 수정한다.
AdministratorAccess를 가진 역할로 수정하고 업데이트를 한다.
이제 이 EC2 인스턴스에 접속해서 kubectl 및 eksctl을 설치한다.
아래 공식 문서를 보면 설치 순서가 자세하게 나와있다. EC2를 사용하기 때문에 설치 환경은 Linux 부분을 보면 된다.
<kubectl 설치>
kubectl 설치 또는 업데이트 - Amazon EKS
<eksctl 설치>
https://docs.aws.amazon.com/ko_kr/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-eksctl.html
그리고 이제 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
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
https://eksctl.io/usage/creating-and-managing-clusters/
'공부 > AWS' 카테고리의 다른 글
[AWS] ssh key forwarding (Windows) (0) | 2024.11.05 |
---|---|
[AWS] EC2 ssh 비밀번호로 접속 및 sudo 권한 설정 (0) | 2023.08.13 |
[AWS] CI/CD 배포 결과 디스코드에 알림 보내기 (0) | 2023.07.05 |
[AWS] AWS lambda + event bridge 매일 크롤링해서 private RDS에 저장 (0) | 2023.06.17 |
[AWS] EC2 인스턴스 t 타입. 프리티어 EC2 인스턴스 먹통되는 현상 (502 bad gateway) (0) | 2023.06.15 |
댓글