baremetal에서 k3s 설치 - 단계별 가이드 및 terraform 사용법
홈랩 클러스터에 little k3s 쿠버네티스 설치
3노드 K3s 클러스터의 설치 단계별 가이드를 아래에 제공합니다.
이 가이드는 물리 서버(1 마스터 + 2 워커)에서 실행되는
**3노드 K3s 클러스터 설치**에 대한 것입니다.
이 가이드는 각 서버에 최소한의
Linux 설치
(예: Ubuntu 22.04 또는 Debian)을 기반으로 하며,
자신의 컨트롤 플레인과 워크로드를 자가 호스팅하고자 하는 경우를 가정합니다.
K3s
은
라이트급의 Kubernetes 버전
으로, 이 작은 홈 랩에 잘 어울립니다.
⚙️ 클러스터 구조
노드 이름 | 역할 | 호스트명/IP |
---|---|---|
master-1 |
서버 (컨트롤 플레인) | 192.168.1.100 |
worker-1 |
에이전트 (워커 노드) | 192.168.1.101 |
worker-2 |
에이전트 (워커 노드) | 192.168.1.102 |
✅ 사전 조건
🧱 하드웨어 (최소 요구 사항):
- CPU: 2코어
- RAM: 노드당 2GB 이상
- 디스크: 노드당 20GB 이상
🛠 OS 요구 사항:
- Linux (Ubuntu 22.04, Debian 12 등)
curl
,ssh
,sudo
설치- 루트 또는 sudo 접근 권한
🧼 네트워크 설정:
-
모든 노드가 IP 또는 호스트명을 통해 서로를 해석하고 ping할 수 있도록 해야 합니다.
-
스왑 비활성화:
sudo swapoff -a sudo sed -i '/ swap / s/^/#/' /etc/fstab
🚀 단계별 설치
📍 단계 1: 마스터 노드(master-1)에 K3s 설치
curl -sfL https://get.k3s.io | sh -
설치 후:
sudo cat /var/lib/rancher/k3s/server/node-token
- 이 토큰은 워커 노드에 필요한 조인 토큰입니다.
클러스터가 실행 중인지 확인합니다:
sudo kubectl get nodes
k3s
는k3s kubectl
또는kubectl
로 심볼릭 링크된kubectl
을 포함합니다.
📍 단계 2: 워커 노드(worker-1 & worker-2)에 K3s 에이전트 설치
각 워커 노드에서 아래 명령을 반복합니다:
단계 1에서 얻은 <MASTER_IP>
및 <NODE_TOKEN>
으로 대체합니다.
curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.100:6443 K3S_TOKEN=<NODE_TOKEN> sh -
예시:
K3S_URL=https://192.168.1.100:6443 \
K3S_TOKEN=K10abcde123456789::server:abcde123456789 \
sh -c "$(curl -sfL https://get.k3s.io)"
📍 단계 3: master-1에서 클러스터 확인
kubectl get nodes
다음과 같은 결과가 나타나야 합니다:
NAME STATUS ROLES AGE VERSION
master-1 Ready control 5m v1.29.2+k3s1
worker-1 Ready <none> 2m v1.29.2+k3s1
worker-2 Ready <none> 2m v1.29.2+k3s1
🔐 (선택 사항) 고가용성(HA) 활성화
생산 환경과 유사한 고가용성(HA)을 원하는 경우 (홈 랩에서는 선택 사항):
- 외부 DB 사용 (예: MySQL/PostgreSQL/etcd)
--server
플래그와 공유 DB를 사용하여 여러 서버 노드 실행- 자세한 내용: K3s HA 문서
🧪 배포 테스트
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
kubectl get svc
curl http://<worker-ip>:<port>
또는 MetalLB를 사용하여 외부 LoadBalancer IP를 설정하여 접근 가능성을 확인합니다.
🧰 유용한 참고 사항
-
Kubeconfig:
/etc/rancher/k3s/k3s.yaml
- 로컬 머신으로 복사하고
export KUBECONFIG=...
을 사용하여 원격으로 관리할 수 있습니다.
- 로컬 머신으로 복사하고
-
Systemd 서비스:
sudo systemctl status k3s
sudo systemctl status k3s-agent
(워커 노드에서)
💡 추가 사항 (선택 사항)
-
K9s: Kubernetes를 관리하는 터미널 UI:
brew install k9s
또는sudo snap install k9s
-
대시보드: 다음 명령어로 활성화:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
-
MetalLB: 물리 서버에 대한 로드 밸런서 지원 추가:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
📦 정리
k3s를 제거하려면:
# 마스터 노드에서:
/usr/local/bin/k3s-uninstall.sh
# 워커 노드에서:
/usr/local/bin/k3s-agent-uninstall.sh
Terraform을 사용한 3노드 물리 서버 K3s 클러스터 설치
이것은 Terraform 템플릿입니다.
이 템플릿은 이미 설정된 Linux 서버 (예: LAN/홈 랩)을 SSH 및 Ansible을 통해 관리하는 경우에 3노드 물리 서버 K3s 클러스터를 제공합니다. Terraform은 Ansible 플레이북을 실행하여 K3s를 설치합니다.
🧱 가정 조건
-
이미 다음과 같은 항목을 보유하고 있습니다:
- 고정 IP를 가진 3대 서버, SSH로 접근 가능.
- SSH 접근 (키 기반).
- 로컬에 Terraform 및 Ansible이 설치되어 있음.
-
대상 OS: Ubuntu/Debian (커스터마이징 가능).
-
사용 중인 Terraform
local-exec
또는 Ansible provisioner 플러그인 (여기서는local-exec
을 사용하여 호환성을 위해 사용).
📁 디렉토리 구조
k3s-cluster/
├── main.tf
├── inventory.ini
├── ansible/
│ └── install_k3s.yml
└── variables.tf
📄 variables.tf
variable "master_ip" {
default = "192.168.1.100"
}
variable "worker_ips" {
default = ["192.168.1.101", "192.168.1.102"]
}
variable "ssh_user" {
default = "your_user"
}
variable "ssh_private_key" {
default = "~/.ssh/id_rsa"
}
📄 main.tf
provider "null" {}
resource "null_resource" "install_k3s" {
provisioner "local-exec" {
command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i inventory.ini ansible/install_k3s.yml --private-key ${var.ssh_private_key} -u ${var.ssh_user}"
}
triggers = {
always_run = "${timestamp()}"
}
}
📄 inventory.ini
[masters]
192.168.1.100
[workers]
192.168.1.101
192.168.1.102
[all:vars]
ansible_python_interpreter=/usr/bin/python3
📄 ansible/install_k3s.yml
---
- hosts: masters
become: yes
tasks:
- name: K3s 마스터 설치
shell: |
curl -sfL https://get.k3s.io | sh -
- name: 노드 토큰 가져오기
shell: cat /var/lib/rancher/k3s/server/node-token
register: node_token
delegate_to: localhost
- hosts: workers
become: yes
tasks:
- name: 워커 노드 클러스터에 조인
shell: |
curl -sfL https://get.k3s.io | K3S_URL=https://{{ hostvars['192.168.1.100']['ansible_host'] }}:6443 K3S_TOKEN={{ hostvars['192.168.1.100']['node_token']['stdout'] }} sh -
참고: Ansible 버전에 따라 IP 또는 토큰 변수 접근 방식을 조정해야 할 수 있습니다. 마스터에서 토큰을 생성하여 워커 설치 전에 파일에 저장하는 것도 가능합니다.
🚀 실행 방법
k3s-cluster/
디렉토리에서:
terraform init
terraform apply
🧰 개선 사항 (선택 사항)
- 동적 인벤토리 생성 사용 (예: DHCP/dnsmasq)
- Ansible을 통해 MetalLB 배포 추가
- 호스트 이름 및 HA 기능 추가
- Ansible 역할 (예:
xanmanning.k3s
)으로 대체하여 더 많은 유연성 제공