Загрузка...

Блог

Настройка сети в Kubernetes: Flannel, CoreDNS, kube-proxy

Настройка сети в Kubernetes: Flannel, CoreDNS, kube-proxy

В блоке ниже — настройка и исправление сетевых компонентов кластера: Flannel (CNI), CoreDNS, kube-proxy.

Когда запускать

После первой установки кластера, если поды не могут достучаться до API (dial tcp 10.96.0.1:443: i/o timeout), или после перезагрузки сервера, когда сеть «отвалилась». Сохраните код в файл и выполните от root.

Что проверять вручную

КомпонентЧто проверить
Сервис kuberneteskubectl get svc kubernetes -n default, kubectl get endpoints kubernetes
CoreDNSkubectl 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-proxykubectl 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.