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.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
# Перегляд доступних версій (опціонально)
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>
📝 Наступні кроки
- Налаштування Ingress Controller (nginx-ingress або traefik)
- Встановлення cert-manager для SSL сертифікатів
- Налаштування моніторингу (Prometheus + Grafana)
- Налаштування логування (ELK або Loki stack)
- Налаштування CI/CD (GitLab Runner, ArgoCD)
- Backup рішення (Velero)
📚 Корисні посилання