최신글

custom EKS AMI 만들기 - Managed Node Group과 Karpenter 설정 차이

반응형

해결하려는 문제

EKS node에 모니터링 에이전트, 보안 패키지 등 추가 소프트웨어를 설치해야 하는 경우가 있습니다. 간단한 작업이면 user data로 충분합니다. 하지만 설치할 내용이 많아지면 두 가지 문제가 생깁니다.

  1. user data가 비대해져서 관리가 어려워집니다
  2. node가 부팅될 때마다 패키지를 설치하므로 node 생성 속도가 느려집니다

 

이 문제를 해결하는 방법이 custom EKS AMI입니다. 필요한 패키지를 미리 설치한 AMI를 만들어 두면, node 생성 시 추가 설치 없이 바로 사용할 수 있습니다.

 

EKS custom AMI설정 요약

  • Managed Node Group은 custom AMI 사용 시 user data에 NodeConfig를 직접 설정해야 합니다
  • Karpenter는 NodeConfig를 자동 생성하므로 별도 설정 없이 AMI ID만 지정하면 됩니다

 

AMI를 생성하는 방법

AMI를 생성하는 방법은 본인의 환경마다 다릅니다. 보통 Packer만 사용하거나 Packer + Ansible 조합을 사용합니다.

 

base AMI는 EKS optimized AMI를 사용하는 편이 작업하기 편합니다. EKS optimized AMI에는 nodeadm, kubelet, containerd 등 node가 클러스터에 조인하는 데 필요한 패키지가 설치되어 있습니다. nodeadm은 AL2023 EKS AMI에서 node를 클러스터에 조인시키는 도구입니다. 임의의 AMI를 base로 사용하면 클러스터 조인이 실패합니다.

 

EKS optimized AMI는 GitHub release에서 찾는 것이 쉽습니다.
- EKS optimized AMI release: https://github.com/awslabs/amazon-eks-ami/releases

 

이 글의 예제에서는 간단히 Packer와 shell script를 사용했습니다.
- Packer 예제: https://github.com/choisungwook/portfolio/blob/master/aws/eks-custom-ami/packer/eks-custom-ami.pkr.hcl

build {
  name    = "eks-custom-ami"
  sources = ["source.amazon-ebs.eks"]

  provisioner "shell" {
    script = "${path.root}/scripts/setup.sh"
  }
}

... 이하생 략

 

custom AMI로 만든 node가 클러스터에 조인할 수 있을까?

custom EKS AMI를 만들 때 가장 먼저 드는 고민은 “이 AMI로 만든 node가 EKS 클러스터에 조인할 수 있나?”입니다.

 

결과만 먼저 말씀드리면 node를 어떻게 생성하느냐에 따라 설정 방법이 다릅니다. EKS node는 Managed Node Group으로 관리되는 EC2와 Karpenter로 생성되는 EC2가 있습니다.

 

Managed Node Group에서 custom AMI 사용

Managed Node Group로 EKS custom AMI를 사용하면, 사용자가 직접 user data에 NodeConfig를 설정해야 해야합니다. NodeConfig는 nodeadm이 EKS에 조인할 때 사용하는 설정 파일입니다. MIME 타입으로 설정해야 하며, 필수 파라미터가 필요합니다.

  1. name — EKS 클러스터 이름
  2. apiServerEndpoint — EKS 클러스터 API endpoint
  3. certificateAuthority — 클러스터 CA 인증서 (base64)
  4. cidr — 서비스 CIDR
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="BOUNDARY"

--BOUNDARY
Content-Type: application/node.eks.aws

---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name: <클러스터 이름>
    apiServerEndpoint: <API endpoint>
    certificateAuthority: <CA 인증서>
    cidr: <서비스 CIDR>

--BOUNDARY--

 

Terraform을 사용한다면 아래 예제처럼 Terraform 리소스를 참조하여 자동화할 수 있습니다.
- Terraform 예제: https://github.com/choisungwook/terraform_practice/pull/117/changes

 

Karpenter에서 custom AMI 사용

Karpenter에서 custom AMI를 사용하는 방법은 간단합니다. EC2NodeClass에서 AMI ID를 지정하면 됩니다. Managed Node Group과 달리, Karpenter는 NodeConfig를 자동으로 생성합니다. 사용자가 직접 user data에 NodeConfig를 작성할 필요가 없습니다.

apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: custom-ami
spec:
  amiFamily: AL2023
  amiSelectorTerms:
    - id: "${CUSTOM_AMI_ID}"

 

custom AMI를 만들때 주의 사항

custom AMI를 만들 때 추가 패키지만 설치하고, EKS 핵심 컴포넌트는 건드리지 않아야 합니다. 이 컴포넌트들은 EKS 버전에 맞게 사전 구성되어 있습니다. 변경하면 node 조인이 실패할 수 있습니다.

  • nodeadm을 삭제하거나 업데이트하지 않습니다
  • kubelet, containerd 버전을 변경하지 않습니다
  • /etc/eks/ 하위 기존 설정 파일을 수정하지 않습니다
반응형