일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 1차원 DP
- 2차원 dp
- 99클럽
- @BeforeAll
- @BeforeEach
- @Builder
- @Entity
- @GeneratedValue
- @GenericGenerator
- @NoargsConstructor
- @Query
- @Table
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- api gateway 설계
- api gateway 필터
- ApplicationEvent
- argocd
- assertThat
- async/await
- AVG
- AWS
- aws autoscaling
- aws eks
- aws iam role
- AWS KMS
- Today
- Total
기록
K3s 기반 멀티 노드 클러스터 구축기 (1) - 컨트롤 플레인 자동화와 Helm 설치까지 본문
시작하면서
이번 글에서는 AWS 프리티어를 최대한 활용하여 K3s 기반 멀티노드 쿠버네티스 클러스터를 구성하는 과정을 소개한다. 이 글은 그 첫 번째로, Control 계정에서 마스터 노드를 초기화하고 Helm을 설치하는 내용을 포함한다.
목표
- AWS Control 계정에 퍼블릭 서브넷과 EC2 인스턴스를 생성한다.
- EC2 인스턴스에서 K3s 마스터 노드를 초기화한다.
- Helm을 설치하여 이후 Helm Chart를 통한 배포 기반을 마련한다.
- swap 설정과 timezone 초기화를 포함한다.
CloudFormation 템플릿 요약
다음 리소스를 CloudFormation 템플릿을 사용하여 자동으로 생성한다:
- VPC (CIDR: 10.30.0.0/16)
- 퍼블릭 서브넷 (CIDR: 10.30.1.0/24)
- 인터넷 게이트웨이, 라우팅 테이블
- EC2 인스턴스 (t2.micro, Amazon Linux 2)
- 보안 그룹 (22, 6443, NodePort 포트 허용)
- EIP (고정 퍼블릭 IP 할당)
사용자 데이터(UserData) 구성
EC2 인스턴스는 부팅 시 다음과 같은 스크립트를 실행한다. 이 스크립트는 swap 설정, 시간대 설정, K3s 마스터 노드 초기화, Helm 설치를 포함한다.
#!/bin/bash
set -ex
# swap 생성 및 활성화
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 시간대 설정
timedatectl set-timezone Asia/Seoul
# K3s 설치 (Traefik, servicelb, metrics-server 비활성화)
export INSTALL_K3S_SKIP_SELINUX_RPM=true
curl -sfL https://get.k3s.io | sh -s - server \
--disable traefik \
--disable servicelb \
--disable metrics-server \
--write-kubeconfig-mode 644
# KUBECONFIG 환경변수 설정
echo 'export KUBECONFIG=/etc/rancher/k3s/k3s.yaml' >> /etc/profile.d/kubeconfig.sh
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
# Helm 설치
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Helm PATH 보장
echo 'export PATH=$PATH:/usr/local/bin' >> /etc/profile.d/helm-path.sh
export PATH=$PATH:/usr/local/bin
설치 확인 절차
EC2 인스턴스에 SSH 접속 후 다음 명령어를 실행하여 설치가 정상적으로 완료되었는지 확인한다:
# SSH 접속
ssh -i <your-key.pem> ec2-user@<public-ip>
# 노드 상태 확인
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get nodes
# 클러스터 정보 확인
kubectl cluster-info
# 파드 목록 확인
kubectl get pods -A
# Helm 버전 확인
helm version
출력 예시:
NAME STATUS ROLES AGE VERSION
ip-10-30-1-88.ap-northeast-2.compute.internal Ready control-plane,master 5m v1.32.3+k3s1
이 출력이 나온다면 K3s 마스터 노드가 정상적으로 초기화된 것이다.
개념 정리: Helm, swap, NodePort
Helm?
Helm은 Kubernetes의 패키지 매니저이다. 복잡한 애플리케이션을 배포할 때, 여러 개의 Kubernetes 리소스(Deployment, Service, ConfigMap 등)를 일일이 작성하는 대신 Helm Chart라는 템플릿을 사용하여 일괄적으로 배포할 수 있다. Helm을 사용하면 버전 관리, 롤백, 환경별 변수 처리 등도 손쉽게 가능하다. 이후 설치할 ArgoCD, Prometheus, Grafana 등도 대부분 Helm Chart로 제공된다.
swap?
t2.micro 인스턴스는 물리 메모리가 1GB로 제한되어 있어, 쿠버네티스 시스템 컴포넌트(Kubelet, Containerd, 파드 등)가 메모리 부족으로 중단될 수 있다. swap은 디스크 공간의 일부를 마치 메모리처럼 사용하는 가상 메모리 영역으로, 메모리가 부족할 때 임시로 데이터를 저장하는 데 활용된다. 실사용 성능은 느리지만 시스템이 강제 종료되는 것을 방지하는 효과가 있다.
NodePort?
NodePort는 Kubernetes의 Service 타입 중 하나이다. 클러스터 외부에서 Pod에 접근할 수 있도록 EC2 인스턴스의 IP와 지정된 포트를 통해 연결을 허용하는 방식이다. AWS에서는 LoadBalancer 타입을 쓰면 ALB/ELB가 생성되면서 비용이 발생하므로, 프리티어 환경에서는 NodePort를 사용하여 EC2 퍼블릭 IP와 포트(예: 31000~32767)를 조합해 외부 접속을 구현한다. 다만 해당 포트가 EC2 보안 그룹에서 허용되어 있어야 한다.
'DevOps' 카테고리의 다른 글
K3s 기반 멀티 노드 클러스터 구축기 (2) - dev 계정에서 워커 노드 연결하기 (0) | 2025.04.14 |
---|---|
Docker Compose로 MySQL 개발 환경 구성하기 + 초기 설정 자동화 (0) | 2025.04.14 |
K3s 기반 멀티 계정 클라우드 인프라 설계 (AWS Free Tier 최적화) (0) | 2025.04.14 |
Gradle test 먼저 실행했더니 실패한 이유: JDK와 javac의 함정 (0) | 2025.04.11 |
AWS 프리티어로 ECS on EC2 구성하기 (CloudFormation 기반 자동화) (0) | 2025.04.01 |