Если образы нужно тянуть через прокси или использовать образы, собранные в 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 — при использовании приватного реестра.