baremetal에서 k3s 설치 - 단계별 가이드 및 terraform 사용법

홈랩 클러스터에 little k3s 쿠버네티스 설치

Page content

3노드 K3s 클러스터의 설치 단계별 가이드를 아래에 제공합니다.
이 가이드는 물리 서버(1 마스터 + 2 워커)에서 실행되는
**3노드 K3s 클러스터 설치**에 대한 것입니다.

이 가이드는 각 서버에 최소한의
Linux 설치
(예: Ubuntu 22.04 또는 Debian)을 기반으로 하며,
자신의 컨트롤 플레인과 워크로드를 자가 호스팅하고자 하는 경우를 가정합니다.

kubernetes baremetal cluster

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

k3sk3s 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)으로 대체하여 더 많은 유연성 제공

유용한 링크