Введение / Зачем это нужно
Частный Docker-регистр позволяет хранить и распространять образы внутри корпоративной инфраструктуры, повышая безопасность и контроль версий. В Kubernetes использование собственного реестра устраняет зависимость от публичных Docker Hub или Docker Hub Mirror, а также упрощает интеграцию с CI/CD-пайплайнами.
Требования / Подготовка
- ОС Linux (например, Ubuntu 22.04) с установленным Docker (≥20.10) и kubectl (≥1.24).
- Доступ к сети, где можно запустить контейнер реестра (обычно порт 5000).
- Регистрационные данные для доступа к реестру (имя пользователя, пароль).
- Базовые знания работы с Kubernetes-манифестами.
Пошаговая инструкция
Шаг 1: Установка и запуск частного реестра
Запустите стандартный Docker-регистр в режиме демона, чтобы он был доступен по хосту или внутренним сервисам кластера.
docker run -d \
--restart=always \
--publish 5000:5000 \
--volume $(docker info --format '{{.DockerRootDir}}/registry:/var/lib/registry') \
registry:2
Команда создает контейнер, который хранит образы в том же файловом хранилище, что и локальный Docker-демон.
Шаг 2: Создание секрета аутентификации в Kubernetes
Сгенерируйте секрет Docker в кластере, используя учетные данные реестра.
kubectl create secret docker-registry my-registry-secret \
--docker-server=https://registry.example.com:5000 \
--docker-username=youruser \
--docker-password=yourpassword \
--docker-email=you@example.com
Секрет кодируется в base64 и хранится в namespace default (или указанном вами).
Шаг 3: Добавление секрета в узлы или Pod
Укажите imagePullSecrets в манифесте Pod (или в сервисном аккаунте), чтобы поды могли извлекать секреты из Kubernetes.
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: app
image: registry.example.com:5000/myapp:latest
imagePullSecrets:
- name: my-registry-secret
Шаг 4: Использование реестра в манифесте Pod
Установите URL-адрес образа, который указывает на приватный реестр, а не на публичный Docker Hub. Синтаксис тот же, что и для любого репозитория Docker.
image: registry.example.com:5000/myapp:latest
Шаг 5: Интеграция с CI/CD
Добавьте учетные данные реестра в вашу CI/CD-систему, чтобы автоматически собирать и отправлять образы в приватный реестр.
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Build and push
env:
REGISTRY: registry.example.com:5000
USERNAME: ${{ secrets.REGISTRY_USER }}
PASSWORD: ${{ secrets.REGISTRY_PASS }}
run: |
echo "$PASSWORD" | docker login $REGISTRY --username $USERNAME --password-stdin
docker build -t $REGISTRY/myapp:latest .
docker push $REGISTRY/myapp:latest
Проверка результата
- Проверьте, что реестр работает:
curl http://registry.example.com:5000/v2/_catalog. - Проверьте, что под получил секрет:
kubectl get pod myapp -o yaml | grep imagePullSecrets. - Просмотрите логи пода:
kubectl logs myapp. Если образ успешно загружен, в логах должна появиться запись о старте контейнера.
Возможные проблемы
- Неверный пароль или имя пользователя – Проверьте данные для входа в реестр и корректность секрета в Kubernetes.
- ImagePullBackoff – Убедитесь, что URL-адрес образа соответствует секрету, а DNS-имя реестра разрешается из подов.
- Недоступен порт 5000 – Убедитесь, что контейнер реестра запущен (
docker ps) и сетевое правило позволяет подключение. - Недостаточные привилегии – Запустите под с ServiceAccount, имеющим права на чтение секретов в необходимом namespace.
Если проблема сохраняется, проверьте логи контроллера управления контейнерами (kubectl logs -n kube-system <контроллер>) для выявления причин неудачной попытки извлечения образа.