В блоке ниже — настройка и исправление сетевых компонентов кластера: Flannel (CNI), CoreDNS, kube-proxy.
Когда запускать
После первой установки кластера, если поды не могут достучаться до API (dial tcp 10.96.0.1:443: i/o timeout), или после перезагрузки сервера, когда сеть «отвалилась». Сохраните код в файл и выполните от root.
Что проверять вручную
| Компонент | Что проверить |
|---|---|
| Сервис kubernetes | kubectl get svc kubernetes -n default, kubectl get endpoints kubernetes |
| CoreDNS | kubectl get pods -n kube-system | grep coredns, логи kubectl logs -n kube-system -l k8s-app=kube-dns |
| Flannel | Поды в kube-flannel, наличие /run/flannel/subnet.env |
| kube-proxy | kubectl get pods -n kube-system | grep proxy, логи |
Скрипт настройки сети
Сохраните в файл и выполните от root (sudo bash файл). Код настраивает Flannel (переменные KUBERNETES_SERVICE_HOST/PORT), создаёт /run/flannel/subnet.env, перезапускает поды CoreDNS и kube-proxy, загружает модули IPVS.
#!/bin/bash
# Настройка и исправление сетевых компонентов кластера Kubernetes
set -e
echo "=== Настройка сетевых компонентов кластера Kubernetes ==="
if [ "$EUID" -ne 0 ]; then echo "Запустите от root: sudo $0"; exit 1; fi
if [ -f "$HOME/.kube/config" ]; then export KUBECONFIG="$HOME/.kube/config"
elif [ -f "/etc/kubernetes/super-admin.conf" ]; then export KUBECONFIG="/etc/kubernetes/super-admin.conf"
else echo "Ошибка: kubeconfig не найден"; exit 1; fi
if ! command -v kubectl >/dev/null 2>&1; then echo "Ошибка: kubectl не найден"; exit 1; fi
API_IP=$(kubectl cluster-info 2>/dev/null | grep 'Kubernetes control plane' | grep -oP '[0-9.]+:6443' | cut -d: -f1 || hostname -I | awk '{print $1}')
echo "IP адрес API сервера: $API_IP"
echo ""; echo "=== 1. Настройка Flannel (CNI) ==="
if ! kubectl get daemonset kube-flannel-ds -n kube-flannel >/dev/null 2>&1; then
echo "Flannel не установлен. Установка Flannel..."
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
sleep 10
fi
ENV_EXISTS=$(kubectl get daemonset kube-flannel-ds -n kube-flannel -o jsonpath='{.spec.template.spec.containers[0].env[?(@.name=="POD_NAME")].name}' 2>/dev/null || echo "")
if [ -z "$ENV_EXISTS" ]; then
kubectl patch daemonset kube-flannel-ds -n kube-flannel --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/env", "value": [{"name": "POD_NAME", "valueFrom": {"fieldRef": {"fieldPath": "metadata.name"}}}, {"name": "POD_NAMESPACE", "valueFrom": {"fieldRef": {"fieldPath": "metadata.namespace"}}}, {"name": "KUBERNETES_SERVICE_HOST", "value": "'"$API_IP"'"}, {"name": "KUBERNETES_SERVICE_PORT", "value": "6443"}]}]' 2>/dev/null || true
kubectl delete pod -n kube-flannel -l app=flannel --force --grace-period=0 2>/dev/null || true
sleep 10
fi
mkdir -p /run/flannel
if [ ! -f /run/flannel/subnet.env ]; then
cat > /run/flannel/subnet.env <<'FLANNEL_EOF'
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
FLANNEL_EOF
echo "✓ subnet.env создан"
fi
sleep 20
for i in {1..12}; do
STATUS=$(kubectl get pods -n kube-flannel -l app=flannel -o jsonpath='{.items[0].status.phase}' 2>/dev/null || echo "Unknown")
READY=$(kubectl get pods -n kube-flannel -l app=flannel -o jsonpath='{.items[0].status.containerStatuses[0].ready}' 2>/dev/null || echo "false")
[ "$STATUS" = "Running" ] && [ "$READY" = "true" ] && { echo "✓ Flannel готов"; break; }
sleep 5
done
echo ""; echo "=== 2. Настройка CoreDNS ==="
if kubectl get deployment coredns -n kube-system >/dev/null 2>&1; then
kubectl delete pod -n kube-system -l k8s-app=kube-dns --ignore-not-found=true
sleep 40
fi
echo ""; echo "=== 3. Настройка kube-proxy ==="
if kubectl get daemonset kube-proxy -n kube-system >/dev/null 2>&1; then
kubectl delete pod -n kube-system -l k8s-app=kube-proxy --ignore-not-found=true
sleep 30
fi
echo ""; echo "=== 4. Модули IPVS ==="
modprobe ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack 2>/dev/null || true
echo "Nodes:"; kubectl get nodes
echo "Flannel:"; kubectl get pods -n kube-flannel
echo "CoreDNS:"; kubectl get pods -n kube-system | grep coredns || true
echo "kube-proxy:"; kubectl get pods -n kube-system | grep proxy || true
echo "=== Настройка сети завершена ==="
Команды
Выполните сохранённый код от root. При необходимости перезапуск компонентов: удаление подов coredns, flannel, kube-proxy с последующим пересозданием.
Итого: Один скрипт приводит в порядок CNI, DNS и proxy; при повторяющихся сбоях — держать команды диагностики в runbook.