Установка k3s на baremetal - пошаговое руководство и с использованием Terraform

Установка little k3s Kubernetes в кластере homelab

Содержимое страницы

Вот пошаговое руководство по установке кластера K3s из 3 узлов на серверах с “голым” железом (1 мастер + 2 рабочих узла).

Это руководство предполагает, что вы начинаете с минимальной установки 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 ядра
  • ОЗУ: 2ГБ+ на узел
  • Диск: 20ГБ+ на узел

🛠 Требования к ОС:

  • Linux (Ubuntu 22.04, Debian 12 и т.д.)
  • Установлены curl, ssh и sudo
  • Доступ root или sudo

🧼 Чистая сеть:

  • Убедитесь, что все узлы могут разрешать и пинговать друг друга по IP или имени хоста.

  • Отключите swap:

    sudo swapoff -a
    sudo sed -i '/ swap / s/^/#/' /etc/fstab
    

🚀 Пошаговая установка


📍Шаг 1: Установка K3s на контрольную плоскость (master-1)

curl -sfL https://get.k3s.io | sh -

После установки:

sudo cat /var/lib/rancher/k3s/server/node-token
  • Это дает вам токен для присоединения, необходимый для рабочих узлов.

Подтвердите, что кластер работает:

sudo kubectl get nodes

k3s включает kubectl, установленный как k3s kubectl или символическую ссылку как kubectl.


📍Шаг 2: Установка агентов K3s (worker-1 & worker-2)

Повторите на каждом рабочем узле:

Замените <MASTER_IP> и <NODE_TOKEN> значениями из шага 1.

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 (необязательно в домашних лабораториях):

  • Используйте внешнюю базу данных (например, MySQL/PostgreSQL/etcd).
  • Запустите несколько серверных узлов с флагом --server и общей базой данных.
  • См.: K3s HA Doc

🧪 Тестирование развертывания

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
kubectl get svc

Проверьте доступ через curl http://<worker-ip>:<port> или настройте MetalLB для внешних IP LoadBalancer.


🧰 Полезные заметки

  • Kubeconfig: /etc/rancher/k3s/k3s.yaml

    • Скопируйте на ваш локальный компьютер и export KUBECONFIG=... для удаленного управления.
  • Сервисы systemd:

    • sudo systemctl status k3s
    • sudo systemctl status k3s-agent (на рабочих узлах)

💡 Дополнительно (необязательно)

  • K9s: Терминальный интерфейс для управления Kubernetes: brew install k9s или sudo snap install k9s

  • Dashboard: Включите с манифестами:

    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

Установка кластера K3s из 3 узлов на “голом” железе с помощью Terraform

Вот Terraform шаблон, который помогает развернуть кластер K3s из 3 узлов на “голом” железе, предполагая, что вы управляете уже развернутыми серверами Linux (например, в вашей локальной сети/домашней лаборатории) через SSH и Ansible. Terraform вызовет плейбуки Ansible для установки K3s.


🧱 Предположения

  • У вас уже есть:

    • 3 сервера с фиксированными IP-адресами, доступными через SSH.
    • Доступ SSH (на основе ключей).
    • Установлены Terraform и Ansible локально.
  • Целевая ОС: Ubuntu/Debian (можно настроить).

  • Вы используете Terraform local-exec или плагин провижионера Ansible (мы будем использовать 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 master
      shell: |
        curl -sfL https://get.k3s.io | sh -        
    - name: Получить node-token
      shell: cat /var/lib/rancher/k3s/server/node-token
      register: node_token
      delegate_to: localhost

- hosts: workers
  become: yes
  tasks:
    - name: Присоединить worker к кластеру
      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 -        

Примечание: Возможно, вам потребуется настроить доступ к IP или переменной токена в зависимости от версий Ansible. Вы также можете сгенерировать токен на мастере и сохранить его в файл перед запуском установки рабочего узла.


🚀 Как запустить

Из каталога k3s-cluster/:

terraform init
terraform apply

🧰 Улучшения (необязательно)

  • Используйте динамическое создание инвентаря (например, из DHCP/dnsmasq).
  • Добавьте развертывание MetalLB через Ansible.
  • Добавьте имена хостов и функции HA.
  • Замените на роль Ansible как xanmanning.k3s для большей гибкости.

Полезные ссылки