Проблема с доступом к реестру Docker изнутри Kubernetes

#kubernetes #docker-registry #haproxy-ingress

#kubernetes #docker-реестр #haproxy-вход

Вопрос:

Я настроил частный реестр docker внутри своего кластера Kubernetes. Развертывание выглядит следующим образом

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: registry
  labels:
    app: registry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: registry
  template:
    metadata:
      labels:
        app: registry
    spec:
      volumes:
        - name: auth-vol
          secret:
            secretName: "registry-credentials"

      containers:
        - image: registry:2
          name: registry
          imagePullPolicy: IfNotPresent
          env:
            - name: REGISTRY_AUTH
              value: "htpasswd"
            - name: REGISTRY_AUTH_HTPASSWD_REALM
              value: "k8s_user"
            - name: REGISTRY_AUTH_HTPASSWD_PATH
              value: "/auth/htpasswd"
          ports:
            - containerPort: 5000
          volumeMounts:
            - name: auth-vol
              mountPath: /auth
 

Я выполняю маршрутизацию, используя следующий вход

 apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: registry-ingress
spec:
  rules:
    - host: "registry.<my domain>"
      http:
        paths:
          - path: "/"
            pathType: Prefix
            backend:
              service:
                name: registry
                port:
                  number: 80
 

Внешне у меня есть балансировщик нагрузки, завершающий SSL, а затем перенаправляющий запрос на соответствующий входной порт для HTTP-трафика. Извне сети у меня нет проблем с извлечением / извлечением из реестра. Однако из сети я получаю следующую ошибку, когда пытаюсь что-то развернуть и запустить kubectl pod describe <pod>

   Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  26s                default-scheduler  Successfully assigned default/server-6df575c99c-ltwqr to k8s-root-default-pool-3de67
  Normal   BackOff    24s (x2 over 25s)  kubelet            Back-off pulling image "registry.<mydomain>/server:0.0.1"
  Warning  Failed     24s (x2 over 25s)  kubelet            Error: ImagePullBackOff
  Normal   Pulling    11s (x2 over 25s)  kubelet            Pulling image "registry.<mydomain>/server:0.0.1"
  Warning  Failed     11s (x2 over 25s)  kubelet            Failed to pull image "registry.<mydomain>/server:0.0.1": rpc error: code = Unknown desc = Error response from daemon: Get https://registry.<mydomain>/v2/: x509: certificate is valid for haproxy-controller.default, not registry.<mydomain>.io
  Warning  Failed     11s (x2 over 25s)  kubelet            Error: ErrImagePull
 

Похоже, что запрос попадает в сертификат контроллера входа HAProxy, а не отправляется во внешний мир и попадает в SSL-сертификат балансировщика нагрузки. Есть ли какой-нибудь лучший способ, которым я должен это делать?

Ответ №1:

Я понял это. Раньше я использовал kubectl expose deployment/registry для автоматического создания службы. Я понял, что если я создам службу NodePort, это откроет ее на фиксированном порту на всех узлах

 apiVersion: v1
kind: Service
metadata:
  name: registry
spec:
  type: NodePort
  selector:
    app: registry
  ports:
    - port: 5000
      targetPort: 5000
      nodePort: 32500
 

Затем это позволило мне использовать «localhost: 32500» для доступа к реестру на всех узлах. Мне также пришлось обновить свое развертывание, чтобы извлечь образ из «localhost: 32500».