Загрузка...

Блог

Прокси для containerd и работа с образами в Kubernetes

Прокси для containerd и работа с образами в Kubernetes

Если образы нужно тянуть через прокси или использовать образы, собранные в Docker, пригодятся скрипты настройки прокси для containerd, импорта образов в containerd и выгрузки в приватный registry.

Сводка

ДействиеКогда использовать
Настройка прокси для containerdДоступ в интернет только через прокси (порт 1080); прописывает HTTP_PROXY/HTTPS_PROXY в systemd override containerd
Импорт образов из Docker в containerdОбразы собраны в Docker, а Kubernetes использует containerd — импорт одного образа или всех
Выгрузка образов в registryВыгрузка образов кластера в приватный registry; URL и учётные данные задаются в коде

Настройка прокси для containerd

Сохраните в файл и выполните от root. Нужен только при доступе в интернет через прокси (например, к nvcr.io). Прокси — socks5 на порту 1080.

#!/bin/bash
# Настройка прокси для containerd
set -e
echo "=== Настройка прокси для containerd ==="
if [ "$EUID" -ne 0 ]; then echo "Запустите от root: sudo bash $0"; exit 1; fi

if ! ss -tulpn | grep -q ":1080"; then
    echo "⚠ Прокси на порту 1080 не найден. Запустите прокси и повторите."
    exit 1
fi

mkdir -p /etc/systemd/system/containerd.service.d
cat > /etc/systemd/system/containerd.service.d/http-proxy.conf << 'EOF'
[Service]
Environment="HTTP_PROXY=socks5://127.0.0.1:1080"
Environment="HTTPS_PROXY=socks5://127.0.0.1:1080"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"
EOF

systemctl daemon-reload
systemctl restart containerd
sleep 3
systemctl is-active --quiet containerd && echo "✓ containerd перезапущен с прокси" || exit 1
echo "=== Прокси для containerd настроен ==="

Импорт образов из Docker в containerd

Использование: выполнить от root — импорт образов по умолчанию (llm-api-server:latest, llm-embeddings-server:latest); или передать имена образов аргументами. Нужны Docker и containerd.

#!/bin/bash
# Импорт Docker образов в containerd (для Kubernetes)
# Использование: bash файл [имя_образа ...]
set -e
if [ "$EUID" -ne 0 ]; then echo "Запустите от root: sudo bash $0"; exit 1; fi

IMAGES=("llm-api-server:latest" "llm-embeddings-server:latest")
[ $# -gt 0 ] && IMAGES=("$@")

for image in "${IMAGES[@]}"; do
    if ! docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^${image}$"; then
        echo "Образ $image не найден в Docker, пропускаем"; continue
    fi
    echo "Импорт $image..."
    docker save "$image" | ctr -n=k8s.io images import - && echo "✓ $image импортирован" || echo "✗ Ошибка импорта $image"
done
echo "Готово. Список в containerd: crictl images"

Выгрузка образов в registry

Перед запуском задайте в начале скрипта: REGISTRY_URL, REGISTRY_USER, REGISTRY_PASS. Список образов берётся из подов кластера (kubectl get pods --all-namespaces -o json). Для push нужен Docker.

#!/bin/bash
# Выгрузка образов кластера в приватный registry
set -e
REGISTRY_URL="registry.example.com"   # замените на свой
REGISTRY_USER="ваш_логин"             # замените на свой
REGISTRY_PASS="ваш_пароль"            # замените на свой

[ -f "$HOME/.kube/config" ] && export KUBECONFIG="$HOME/.kube/config"
[ -f "/etc/kubernetes/super-admin.conf" ] && export KUBECONFIG="/etc/kubernetes/super-admin.conf"

IMAGES=$(kubectl get pods --all-namespaces -o json | jq -r '.items[] | .spec.containers[]?.image, .spec.initContainers[]?.image' | grep -v '^null$' | sort -u)
[ -z "$IMAGES" ] && { echo "Образы не найдены"; exit 1; }

echo "$REGISTRY_PASS" | docker login -u "$REGISTRY_USER" --password-stdin "$REGISTRY_URL"

while IFS= read -r IMAGE; do
    [ -z "$IMAGE" ] && continue
    IMAGE_NAME=$(echo "$IMAGE" | sed -E 's|^[^/]+/||' | sed 's|:|/|' | awk -F'/' '{print $NF}')
    IMAGE_TAG=$(echo "$IMAGE" | awk -F':' '{print $NF}')
    [ "$IMAGE_TAG" = "$IMAGE" ] && IMAGE_TAG="latest"
    TARGET="${REGISTRY_URL}/${IMAGE_NAME}:${IMAGE_TAG}"
    echo "$IMAGE -> $TARGET"
    docker pull "$IMAGE" 2>/dev/null || true
    docker tag "$IMAGE" "$TARGET"
    docker push "$TARGET" && echo "✓ $TARGET" || echo "✗ Ошибка $TARGET"
done <<< "$IMAGES"
echo "Выгрузка завершена"

Итого: Прокси — по необходимости; импорт из Docker — после сборки образов; push в registry — при использовании приватного реестра.