본문 바로가기

⭐ Kubernetes & EKS/⚡ NodeGroup (노드그룹)

Custom AMI를 생성 후 EKS 노드그룹에 반영하기

# Custom AMI를 활용하여 EKS 노드그룹에 반영하여 구성하기

- Custom AMI란?

Custom AMI는 AWS에서 사용하던 인스턴스를 그대로 이미지로 만들 수 있다. 이러한 이미지를 Custom AMI 이라고 하며 자신이 구축한 인스턴스 환경을 그대로 이미지화 할 수 있다는 점에서 클라우드 환경에서 꼭 필요한 기능이다.

- Custom AMI를 활용하여 EKS 노드그룹에서 배포를 하는 방법에 대해서 알아보자.

EKS NodeGroup에 Custom AMI를 배포하는 법은 간단하다. 이러한 작업이 필요한 이유는 EKS NodeGroup 즉, 각각의 EC2에 개별 보안 요소를 적용하거나 에이전트를 설치하여 Golden Image로 운영을 필요로 하는 사람들이 많을 것이다. EKS NodeGroup은 기본적으로 AutoScaling이 적용되어 있기 때문에 서버가 Scale IN/OUT 될 때마다 새로운 보안요소를 적용하거나 에이전트를 설치하는 것은 여간 여러운 일이 아닐 것이다. 그래서 Custom AMI를 통해 미리 보안요소나 에이전트등과 같은 리소스를 설치 후 이미지로 만들고 해당 이미지를 시작 템플릿에 적용하여 스케일 아웃과 스케일 인 이 되었을때 바로 적용 되도록 해야 한다.

- 해당 워크플로우는 아래와 같다.

아래의 내용을 간략하게 설명하면 EC2 인스턴스를 생성 시 Custom AMI를 지정하여 생성을 한다. 그리고 해당 ec2 인스턴스에 여러가지 필요한 리소스 자원을 설치 및 적용 하고 해당이미지를 시작 템플릿에 적용하면 된다.

- 우리가 여러가지 작업을 할때 고려해야할 부분이 반드시 존재한다. 대표적으로 노드그룹의 설치하는 리소스 자원과 공유 자원이 그에 해당할 것이다.

- 노드그룹에 공통으로 사용할 리소스자원을 설치하고 해당 노드가 늘어나거나 줄어들때 동일하게 적용 되도록 해아한다.

- 그리고 공유자원도 마찬가지이다. EFS와 같은 네트워크 드라이브를 사용한다고 가정할때, EFS에 대한 정보를 노드가 가지고 있어야 하므로, 해당 AMI에 대한 Custom 작업은 반드시 필요하다.

- 그렇다면 본격적으로 EKS 노드그룹에 해당 AMI 이미지를 적용하는 방법에 대해서 알아보자.

1. EKS 노드그룹의 AMI 이미지 ID 식별하기

- 아래의 링크에 접속하여 해당 AMI 이미지 ID를 확인 한다.

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/eks-optimized-ami.html

 

Amazon EKS 최적화 Amazon Linux AMI - Amazon EKS

많은 노드를 동시에 시작하는 경우 --apiserver-endpoint, --b64-cluster-ca 및 --dns-cluster-ip 부트스트랩 인수에 대한 값을 지정하여 오류를 방지하려 할 수도 있습니다. 자세한 내용은 AMI 지정 섹션을 참조

docs.aws.amazon.com

- AWS 리전과 X86등 OS 버전등을 확인 후 해당 인스턴스 ID를 확인 할 수 있다.

- 확인한 AMI ID는 아래와 같다. ID = ami-07d1f1e1f9eaaf855

2. 해당 AMI ID를 가지거 EC2 인스턴스를 생성한다.

- EC2 생성하기를 클릭하여 위에서 확인한 AMI ID를 검색 후 생성을 한다.

- 인스턴스 정보를 선택 후 아래와 같은 화면을 확인 할 수 있다.

인스턴스 생성 정보를 기입한다.

인스턴스 이름을 지정, 인스턴스 유형을 정하고, 키페어를 생성하고, 위치할 VPC를 설정하고, 서브넷을 설정한다.
그리고 스토리지 등 구성을 진행하고, 마지막에 사용자 데이터에 #!/bin/bash 쉘 스크립트를 적용할 부분이 있다면 아래와 같이 사용자 데이터에 적용을 해준다.

#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &

3. 시작 템플릿 생성하기

- 일단 EC2 인스턴스가 생성이 완료되면 생성된 EC2 인스턴스를 가지고 시작 템플릿을 생성해야 한다.

시작 템플릿을 생성하는 방법은 아래의 링크를 확인한다.

https://may9noy.tistory.com/98

 

Auto-Scaling 그룹을 생성해 보자.

# 시작 템플릿을 구성 # 오토스케일링 그룹 생성 - 오토스케일링을 수행할 인스턴스를 마우스 우클릭하여 이미지 및 템플릿에서 이미지를 생성한다. - 이미지 생성에 대한 기본적인 정보를 입력

may9noy.tistory.com

- 일단 AMI 리스트를 보게되면 아래와 같이 리스트에 표시가 되어 있다.

- 그리고 해당 AMI를 시작템플릿에 등록을 해줘야 한다.

- 아래와 같이 인스턴스 메뉴에서 시작템플릿을 클릭하여 시작 템플릿 생성을 시작한다.

- 시작 템플릿 생성에서 시작 템플릿의 이름과 설명을 넣고 아래와 같이 세팅을 진행한다.

- 내 AMI로 이동을 하면 내가 생성한 AMI 이미지를 선택 할 수 있다. 해당 이미지를 선택 후 인스턴스 유형, 키 페어
네트워크 설정 등을 진행 후 시작 템플릿을 생성한다.

- 여기서 주의할 점은 서브넷은 따로 설정하지 않고 진행을 한다.

- 시작 템플릿 메뉴로 이동하면 아래와 같이 시작 템플릿이 생성된것을 볼 수 있다.

4. 생성된 시작 템플릿을 기반으로 EKS에서 새로운 노드그룹을 생성한다.

- EKS 메뉴로 이동하여 노드그룹을 생성한다.

- 시작 템플릿은 자동적으로 최신 버전으로 등록 된다.

- 그리고 시작 템플릿을 생성 시 고급 세부 정보에서 userdata를 아래와 같이 입력하여 함께 생성해야 한다.

#!/bin/bash
set -ex
/etc/eks/bootstrap.sh [cluster_name] --kubelet-extra-args "--node-labels=alpha.eksctl.io/cluster-name=[cluster_name],alpha.eksctl.io/nodegroup-name=[nodegroup_name],eks.amazonaws.com/nodegroup=[nodegroup_name],eks.amazonaws.com/nodegroup-image=[CustomAmi_Id]"

- 다음 으로 넘어가서 컴퓨팅 및 조정 구성 설정을 진행한다.

여기서 노드그룹의 숫자를 정하고, 스팟 인스턴스 인지 온디멘드 인스턴스 인지 설정을 진행한다.

- 다음으로 네트워킹 지정에서 자동으로 현재 EKS에서 맵핑되어 있는 서브넷을 불러 올것이다. 여기서 주의할 점은 Subnet을 private와 public 모두를 설정해야 한다는 점이다. 그리고 또한, SSH 접속을 위한 키페어도 확인이 가능하다.

- 마지막 검토 및 생성에서 최종적으로 확인 후 생성을 한다. (생성중인 모습)

- 노드 그룹 생성 시 AutoScaling도 함께 생성 되므로 약간의 시간이 소요된다.

- 만약 아래와 같은 오류가 발생 시 노드 그룹을 생성할때 subnet을 어떤 것을 선택했는지 확인한다.

- 노드그룹의 subnet은 private와 public서브넷이 함께 있어야 한다.

Instances failed to join the kubernetes cluster

- 노드그룹의 서브넷은 아래를 참조하면 된다.

5. Custom AMI를 활용한 노드그룹 확인하기

- 아래와 같이 2개의 노드그룹에서 각각의 인스턴스 타입으로 인스턴스를 생성한 것을 볼 수 있다.

- 1개의 노드그룹은 custom ami를 통해 생성된 노드그룹이고, 또 다른 노드그룹은 custom ami가 아닌 일반적인 이미지로 생성된 노드그룹 이다.

6. 마지막으로 콘솔에 접근하여 노드 정보를 확인하기

- 아래와 같이 node를 조회하면 2개의 노드가 추가된 것을 확인 할 수 있다.

:~/environment $ kubectl get nodes
NAME                                   STATUS   ROLES    AGE     VERSION
-223.ap-northeast-2.compute.internal   Ready    <none>   8m32s   v1.24.9-eks-
-51.ap-northeast-2.compute.internal    Ready    <none>   4h53m   v1.24.10-eks-
-41.ap-northeast-2.compute.internal     Ready    <none>   4h53m   v1.24.10-eks-
-56.ap-northeast-2.compute.internal     Ready    <none>   8m33s   v1.24.9-eks-

- 콘솔에서 노드별 리소스 분배 확인하기, t2.micro 인스턴스 1개의 정보는 아래와 같다.

- 노드그룹이 신규로 생성 되면서 기존의 노드그룹과 신규로 생성되는 노드그룹간의 리소스 재 분배가 발생한것을 확인 할 수 있다.

- 여기까지 하겠다.

- 끝 -