kubernetes не достигает внутреннего реестра - PullRequest
0 голосов
/ 16 апреля 2020

Я развернул реестр docker внутри своих kubernetes:

$ kubectl get service
NAME                       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
registry-docker-registry   ClusterIP   10.43.39.81   <none>        443/TCP   162m

Я могу получить изображения с моего компьютера (сервис предоставляется через правило доступа):

$ docker pull registry-docker-registry.registry/skaffold-covid-backend:c5dfd81-dirty@sha256:76312ebc62c4b3dd61b4451fe01b1ecd2e6b03a2b3146c7f25df3d3cfb4512cd
...
Status: Downloaded newer image for registry-do...

Когда я пытаюсь протестировать его, чтобы развернуть мой образ в том же kubernetes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: covid-backend
  namespace: skaffold
spec:
  replicas: 3
  selector:
    matchLabels:
      app: covid-backend
  template:
    metadata:
      labels:
        app: covid-backend
    spec:
      containers:
      - image: registry-docker-registry.registry/skaffold-covid-backend:c5dfd81-dirty@sha256:76312ebc62c4b3dd61b4451fe01b1ecd2e6b03a2b3146c7f25df3d3cfb4512cd
        name: covid-backend
        ports:
        - containerPort: 8080

Затем я попытался развернуть его:

$ cat pod.yaml | kubectl apply -f -

Однако kubernetes не может получить доступ к реестру:

Извлечение kubectl get events:

6s          Normal    Pulling             pod/covid-backend-774bd78db5-89vt9    Pulling image "registry-docker-registry.registry/skaffold-covid-backend:c5dfd81-dirty@sha256:76312ebc62c4b3dd61b4451fe01b1ecd2e6b03a2b3146c7f25df3d3cfb4512cd"
1s          Warning   Failed              pod/covid-backend-774bd78db5-89vt9    Failed to pull image "registry-docker-registry.registry/skaffold-covid-backend:c5dfd81-dirty@sha256:76312ebc62c4b3dd61b4451fe01b1ecd2e6b03a2b3146c7f25df3d3cfb4512cd": rpc error: code = Unknown desc = failed to pull and unpack image "registry-docker-registry.registry/skaffold-covid-backend@sha256:76312ebc62c4b3dd61b4451fe01b1ecd2e6b03a2b3146c7f25df3d3cfb4512cd": failed to resolve reference "registry-docker-registry.registry/skaffold-covid-backend@sha256:76312ebc62c4b3dd61b4451fe01b1ecd2e6b03a2b3146c7f25df3d3cfb4512cd": failed to do request: Head https://registry-docker-registry.registry/v2/skaffold-covid-backend/manifests/sha256:76312ebc62c4b3dd61b4451fe01b1ecd2e6b03a2b3146c7f25df3d3cfb4512cd: dial tcp: lookup registry-docker-registry.registry: Try again
1s          Warning   Failed              pod/covid-backend-774bd78db5-89vt9    Error: ErrImagePull

Как видите, kubernetes не может получить доступ к внутреннему развернутому реестру. ...

Есть идеи?

1 Ответ

0 голосов
/ 20 апреля 2020

Я бы порекомендовал следовать документам из k3d, они здесь .

Точнее это

Использование собственного локального реестра

Если вы не хотите, чтобы k3d управлял вашим реестром, вы можете запустить его с помощью некоторых команд docker, например:

docker volume create local_registry
docker container run -d --name registry.local -v local_registry:/var/lib/registry --restart always -p 5000:5000 registry:2

Эти команды запустит ваш реестр в registry.local: 5000. Чтобы добавить в этот реестр sh, вам нужно добавить строку в / etc / hosts, как мы описали в предыдущем разделе . Как только ваш реестр будет запущен, нам нужно будет добавить его в файл конфигурации registries.yaml. Наконец, вы должны подключить сеть реестра к сети кластера k3d: docker network connect k3d-k3s-default registry.local. И тогда вы можете проверить ваш локальный реестр .

Нажав на ваш локальный адрес реестра

Реестр будет расположен по умолчанию в registry.local: 5000 (настраивается с помощью параметров --registry-name и --registry-port). Все узлы в вашем кластере k3d могут разрешать это имя хоста (благодаря DNS-серверу, предоставленному демоном Docker), но для того, чтобы иметь возможность отправить sh в этот реестр, это имя хоста, но также должно быть разрешено с вашего хоста .

Самым простым решением для этого является добавление записи в ваш файл / etc / hosts , например:

127.0.0.1 registry.local

Еще раз это будет работать только с k3s> = v0.10.0 (см. раздел ниже при использовании k3s <= v0.9.1) </p>

Том локального реестра

В локальном реестре k3d для создания изображений используются тома. Этот том будет уничтожен при выходе из реестра k3d. Чтобы сохранить этот том и заставить эти образы пережить удаление реестра, вы можете указать том с параметром --registry-volume и использовать флаг --keep-registry-volume при удалении кластера. Это создаст том с указанным именем при первом использовании реестра, в то время как последовательные вызовы просто монтируют этот существующий том в контейнер реестра k3d.

Docker Кэш-концентратор

Локальный реестр k3d также можно использовать для кэширования изображений из Docker Hub. Вы можете запустить реестр как сквозной кеш, когда кластер создается с помощью --enable-registry-cache. Используемый вместе с --registry-volume / - keep-registry-volume может ускорить все загрузки с концентратора, сохраняя постоянный кэш изображений на локальном компьютере.

Тестирование реестра

Вы должны проверить, что вы можете

  • pu sh в свой реестр с локального компьютера разработки.
  • использовать изображения из этого реестра в Deployments в вашем кластере k3d.

Мы проверим эти две вещи для локального реестра (расположенного в registry.local: 5000), работающего на вашей машине разработки. Для проверки внешнего реестра все будет в основном так же, но при использовании аутентифицированного или безопасного реестра может потребоваться дополнительная настройка на локальном компьютере (для этого обратитесь к документации Docker).

Во-первых, мы можем загрузить изображение (например, nginx) и добавить его в наш локальный реестр с помощью:

docker pull nginx:latest
docker tag nginx:latest registry.local:5000/nginx:latest
docker push registry.local:5000/nginx:latest

Затем мы можем развернуть модуль, ссылающийся на этот образ в ваш кластер:

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test-registry
  labels:
    app: nginx-test-registry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test-registry
  template:
    metadata:
      labels:
        app: nginx-test-registry
    spec:
      containers:
      - name: nginx-test-registry
        image: registry.local:5000/nginx:latest
        ports:
        - containerPort: 80
EOF

Затем вы должны убедиться, что модуль работает с kubectl get pods -l "app = nginx -test-registry".


Дополнительно есть 2 ссылки на github, которые стоит посетить

...