Skip to main content

Install on Debian 13

  • Kubernetes

    📋 Передумови

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

    • ОС: 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.34/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.34/deb/ /' | \
      sudo tee /etc/apt/sources.list.d/kubernetes.list
    

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

    # Оновлення списку пакетів
    sudo apt update
    
    # Перегляд доступних версій (опціонально)
    apt-cache madison kubeadm
    
    # Встановлення 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
    

    Міграція з Docker Compose

    # Конвертація docker-compose.yml
    kompose convert -f docker-compose.yml
    
    # Розгортання згенерованих маніфестів
    kubectl apply -f .
    
    # Перевірка
    kubectl get all
    

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

    Проблема: Нода в статусі 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)

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