Skip to main content

Install on Debian 13

Kubernetes на Debian 13

📋 Передумови

Системні вимоги

  • ОС: Debian 13 (Trixie)
  • CPU: мінімум 2 ядра
  • RAM: мінімум 2 GB (рекомендовано 4 GB+)
  • Диск: мінімум 20 GB вільного місця
  • Мережа: статичний IP або резервація DHCP

Початкові налаштування

  • Доступ до root або sudo
  • Підключення до інтернету
  • Відкриті порти (для single-node):
    • 6443 (Kubernetes API)
    • 2379-2380 (etcd)
    • 10250-10252 (kubelet, controller, scheduler)
    • 30000-32767 (NodePort сервіси)

🚀 Етап 1: Базова підготовка системи

1.1 Оновлення системи

# Оновлення пакетного менеджера
sudo apt update && sudo apt upgrade -y

# Перезавантаження після оновлення ядра (якщо потрібно)
sudo reboot

1.2 Встановлення базових утиліт

# Встановлення необхідних пакетів
sudo apt install -y \
    curl \
    wget \
    apt-transport-https \
    ca-certificates \
    gnupg \
    lsb-release \
    software-properties-common \
    vim \
    htop \
    net-tools

1.3 Налаштування hostname

# Встановлення імені хоста
sudo hostnamectl set-hostname k8s-node01

# Додавання запису в /etc/hosts
echo "127.0.1.1 k8s-node01" | sudo tee -a /etc/hosts

1.4 Вимкнення swap

# Тимчасове вимкнення swap
sudo swapoff -a

# Постійне вимкнення swap
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# Перевірка
free -h

1.5 Налаштування часової зони

# Встановлення часової зони (приклад для Києва)
sudo timedatectl set-timezone Europe/Kyiv

# Перевірка
timedatectl

⚙️ Етап 2: Налаштування системних параметрів

2.1 Налаштування модулів ядра

# Створення конфігурації для модулів
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

# Завантаження модулів
sudo modprobe overlay
sudo modprobe br_netfilter

# Перевірка завантаження модулів
lsmod | grep br_netfilter
lsmod | grep overlay

2.2 Налаштування параметрів мережі

# Створення конфігурації sysctl
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# Застосування параметрів
sudo sysctl --system

# Перевірка параметрів
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.bridge.bridge-nf-call-ip6tables
sysctl net.ipv4.ip_forward

🐳 Етап 3: Встановлення Container Runtime (containerd)

3.1 Додавання репозиторію Docker

# Створення директорії для ключів
sudo mkdir -p /etc/apt/keyrings

# Додавання GPG ключа Docker
curl -fsSL https://download.docker.com/linux/debian/gpg | \
    sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Додавання репозиторію
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
    https://download.docker.com/linux/debian $(lsb_release -cs) stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

3.2 Встановлення containerd

# Оновлення списку пакетів
sudo apt update

# Встановлення containerd
sudo apt install -y containerd.io

# Перевірка статусу
sudo systemctl status containerd

3.3 Налаштування containerd

# Створення директорії для конфігурації
sudo mkdir -p /etc/containerd

# Генерація дефолтної конфігурації
sudo containerd config default | sudo tee /etc/containerd/config.toml

# Увімкнення SystemdCgroup
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# Перезапуск containerd
sudo systemctl restart containerd
sudo systemctl enable containerd

# Перевірка
sudo systemctl status containerd

☸️ Етап 4: Встановлення Kubernetes

4.1 Додавання репозиторію Kubernetes

# Додавання GPG ключа Kubernetes
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | \
    sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# Додавання репозиторію
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
    https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | \
    sudo tee /etc/apt/sources.list.d/kubernetes.list

4.2 Встановлення компонентів Kubernetes

# Оновлення списку пакетів
sudo apt update

# Встановлення kubeadm, kubelet, kubectl
sudo apt install -y kubelet kubeadm kubectl

# Фіксація версій (запобігання автооновленню)
sudo apt-mark hold kubelet kubeadm kubectl

# Увімкнення kubelet
sudo systemctl enable kubelet

# Перевірка версій
kubectl version --client
kubeadm version
kubelet --version

🎯 Етап 5: Ініціалізація кластера

5.1 Ініціалізація master ноди

# Ініціалізація з визначенням pod network
sudo kubeadm init \
    --pod-network-cidr=10.244.0.0/16 \
    --apiserver-advertise-address=<YOUR_IP_ADDRESS>

# Збережіть вивід команди kubeadm join для додавання worker нод!

5.2 Налаштування kubectl для користувача

# Створення конфігурації для поточного користувача
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# Перевірка
kubectl get nodes

5.3 Налаштування для single-node кластера

# Дозвіл запуску подів на master ноді
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

# Перевірка
kubectl describe node k8s-node01 | grep Taints

🌐 Етап 6: Встановлення мережевого плагіна (CNI)

6.1 Встановлення Flannel

# Застосування маніфесту Flannel
kubectl apply -f \
    https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

# Очікування запуску (1-2 хвилини)
kubectl get pods -n kube-flannel

# Перевірка статусу ноди
kubectl get nodes

6.2 Альтернатива: Calico (для складніших мережевих політик)

# Встановлення Tigera Operator
kubectl create -f \
    https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml

# Встановлення Calico
kubectl create -f \
    https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml

# Перевірка
kubectl get pods -n calico-system

📊 Етап 7: Встановлення Dashboard (опціонально)

7.1 Розгортання Dashboard

# Встановлення Dashboard
kubectl apply -f \
    https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

# Перевірка
kubectl get pods -n kubernetes-dashboard

7.2 Створення адміністративного користувача

# Створення ServiceAccount
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF

# Створення ClusterRoleBinding
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

7.3 Отримання токену доступу

# Створення токену
kubectl create token admin-user -n kubernetes-dashboard

# Або створення довгострокового токену
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: admin-user-token
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: admin-user
type: kubernetes.io/service-account-token
EOF

# Отримання токену
kubectl get secret admin-user-token -n kubernetes-dashboard -o jsonpath="{.data.token}" | base64 --decode

7.4 Доступ до Dashboard

# Запуск proxy
kubectl proxy

# Доступ через браузер:
# http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

🛠️ Етап 8: Встановлення додаткових інструментів

8.1 Helm - пакетний менеджер

# Завантаження та встановлення Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# Перевірка
helm version

# Додавання репозиторіїв
helm repo add stable https://charts.helm.sh/stable
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

8.2 Kompose - конвертер Docker Compose

# Завантаження Kompose
curl -L https://github.com/kubernetes/kompose/releases/download/v1.31.2/kompose-linux-amd64 -o kompose

# Встановлення
chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose

# Перевірка
kompose version

8.3 Local Path Provisioner для Persistent Volumes

# Встановлення Local Path Provisioner
kubectl apply -f \
    https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.24/deploy/local-path-storage.yaml

# Встановлення як default StorageClass
kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

# Перевірка
kubectl get storageclass

8.4 Metrics Server для моніторингу

# Встановлення Metrics Server
kubectl apply -f \
    https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# Для single-node: додати --kubelet-insecure-tls
kubectl patch deployment metrics-server -n kube-system --type='json' \
    -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--kubelet-insecure-tls"}]'

# Перевірка (почекайте 1-2 хвилини)
kubectl top nodes
kubectl top pods --all-namespaces

✅ Етап 9: Перевірка та тестування

9.1 Перевірка статусу кластера

# Статус нод
kubectl get nodes -o wide

# Статус системних подів
kubectl get pods -n kube-system

# Інформація про кластер
kubectl cluster-info

# Статус компонентів
kubectl get componentstatuses

9.2 Тестове розгортання

# Створення тестового deployment
kubectl create deployment nginx-test --image=nginx:alpine

# Масштабування
kubectl scale deployment nginx-test --replicas=3

# Створення сервісу
kubectl expose deployment nginx-test --port=80 --type=NodePort

# Перевірка
kubectl get all
kubectl get svc nginx-test

# Отримання NodePort
kubectl get svc nginx-test -o jsonpath='{.spec.ports[0].nodePort}'

# Тест доступу (замініть NODE_IP та NODE_PORT)
curl http://<NODE_IP>:<NODE_PORT>

# Видалення тестових ресурсів
kubectl delete deployment nginx-test
kubectl delete svc nginx-test

🔧 Корисні команди

Діагностика

# Логи пода
kubectl logs <pod-name> -n <namespace>

# Опис пода
kubectl describe pod <pod-name> -n <namespace>

# Виконання команд в поді
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash

# Події кластера
kubectl get events --all-namespaces --sort-by='.metadata.creationTimestamp'

Управління ресурсами

# Застосування маніфесту
kubectl apply -f manifest.yaml

# Видалення ресурсів
kubectl delete -f manifest.yaml

# Редагування ресурсу
kubectl edit deployment <name>

# Перегляд YAML конфігурації
kubectl get deployment <name> -o yaml

 

⚠️ Усунення неполадок

Проблема: Нода в статусі NotReady

# Перевірка kubelet
sudo systemctl status kubelet
sudo journalctl -u kubelet -f

# Перевірка CNI плагіна
kubectl get pods -n kube-system | grep -E 'flannel|calico'

Проблема: Поди в статусі Pending

# Перевірка подій
kubectl describe pod <pod-name>

# Перевірка ресурсів ноди
kubectl describe node <node-name>
kubectl top nodes

Проблема: Помилки з pull образів

# Перевірка секретів
kubectl get secrets

# Створення secret для приватного registry
kubectl create secret docker-registry regcred \
    --docker-server=<registry-server> \
    --docker-username=<username> \
    --docker-password=<password>

📝 Наступні кроки

  1. Налаштування Ingress Controller (nginx-ingress або traefik)
  2. Встановлення cert-manager для SSL сертифікатів
  3. Налаштування моніторингу (Prometheus + Grafana)
  4. Налаштування логування (ELK або Loki stack)
  5. Налаштування CI/CD (GitLab Runner, ArgoCD)
  6. Backup рішення (Velero)

📚 Корисні посилання