k8s извлекает изображение из частного реестра, используя служебное DNS-имя

#docker #kubernetes #docker-registry

#докер #kubernetes #docker-реестр

Вопрос:

У меня есть registry:2 развернутый модуль as в моем кластере kubernetes (работает на docker-for-win, WSL2). У меня есть две службы для этого модуля, как показано ниже:

 apiVersion: v1
kind: Service
metadata:
  name: registry-external
spec:
  type: NodePort
  selector:
    app: registry
  ports:
    - protocol: TCP
      port: 5000
      nodePort: 32020
---
apiVersion: v1
kind: Service
metadata:
  name: registry
spec:
  selector:
    app: registry
  ports:
    - name: http
      protocol: TCP
      port: 2100
      targetPort: 5000
 

Итак, первый для доступа к реестру извне кластера (на порту 32020, так что я могу docker login localhost:32020 на хост-компьютере) и один для доступа к реестру изнутри (на порту 2100).

Вход в систему извне работает просто отлично. Я проверил nslookup registry в кластере, что реестр должен быть доступен registry.default.svc.cluster.local . Итак, я создал свой образ pull secrets с помощью

 {
    "auths": {
        "registry.default.svc.cluster.local:2100": {
            "auth": "......"
        },
    ...
}
 

Когда я пытаюсь развернуть модуль с этим изображением, извлеките секрет и изображение registry.default.svc.cluster.local:2100/animage:latest
, с которым он завершается с ошибкой

 dial tcp: lookup registry.default.svc.cluster.local on 192.168.65.1:53: no such host
 

Я озадачен этим: разве URL-адрес не должен быть действительным во время извлечения изображения?

Комментарии:

1. Хост registry.default.svc.cluster.local — это имя хоста, управляемое DNS Kubernetes. Когда рабочий узел извлекает изображение, он использует DNS рабочего узла. Вы пробовали разрешить узел registry.default.svc.cluster.local на рабочем узле в терминале (НЕ внутри модуля). Это было бы полезно для репликации проблемы. Я подозреваю, что вам нужно будет указать порт узла и хост.

2. Спасибо за ваш комментарий, @JustinTamblyn. Похоже, это может быть проблемой. Знаете ли вы, как я могу выполнить nslookup на рабочем узле в кластере k8s в docker-for-win? Вся настройка k8s выполняется автоматически, поэтому я не знаком с тем, как напрямую взаимодействовать с рабочими узлами.

3. Ммм. Это сложно. Мне нравится Docker Desktop K8s, но, боюсь, я не знаю, как запускать там команды. Я подозреваю, что это то же самое, что запускать команды на рабочем столе?

4. Это приводит к отказу в подключении, но я предполагаю, что это может быть из-за отсутствия секретов извлечения изображений. Я попробую добавить это.

5. Возможно, опубликуйте это в качестве ответа — кто-то может извлечь из этого пользу в будущем 🙂

Ответ №1:

Проблема здесь в том, что извлечение выполняется в среде, где кластерный DNS-сервер kubernetes недоступен, т.Е. На узле кластера, но не в кластерном модуле (в случае kubernetes на docker-for-win он выполняется в той же сети, что и хост).

Поскольку реестр также доступен с NodePort помощью службы, к нему можно получить nodePort доступ через порт 32020 на localhost. Поэтому секрет извлечения изображения необходимо настроить на

 {
    "auths": {
        "localhost:32020": {
            "auth": "......"
        },
    ...
}
 

и изображение для извлечения становится localhost:32020/animage:latest .