使用 docker 驱动程序在 minikube 中的 Docker 本地私有注册表

问题描述

问题

如何在使用 docker 驱动程序的同时在 minikube 中运行本地 Docker 私有注册表? (--driver=docker)

问题

连接被拒绝将图像推送到私有注册表时

docker push docker-registry.kubemaster.me/docker-cats:latest

# Results
The push refers to repository [docker-registry.kubemaster.me/docker-cats]
Get http://docker-registry.kubemaster.me/v2/: dial tcp 127.0.0.1:80: connect: connection refused

我的设置

Windows WSL2 上的 Minikube 使用 minikube's docker driver

minikube start --driver=docker --kubernetes-version=v1.20.2

我部署了 nginx-ingress-controller,它侦听端口 80 和 443。该应用程序可通过 HTTP 和 HTTPS 使用(使用 cert-manager 作为 TLS 证书)。当然,我将 127.0.0.1 docker-registry.kubemaster.me 添加到我的 C:\Windows\System32\drivers\etc\hosts 文件中。

注意:我在后台运行 minikube tunnel,这就是为什么可以通过 nginx-ingress-controller 从主机与整个集群通信。

访问本地注册

  • 来自 Windows 主机

    access-from-windows-host

  • 来自 WSL2 Ubuntu 客户机。

    curl  http://docker-registry.kubemaster.me/v2/_catalog
    

    access-from-ubuntu-guest

  • 来自 minikube 的 docker 容器

    docker exec -it minikube bash
    root@minikube:/$ curl  http://docker-registry.kubemaster.me/v2/_catalog
    

    access-from-minikube-container

  • minikube 的 docker 容器

    推送
    docker exec -it minikube bash
    root@minikube:/$ docker push docker-registry.kubemaster.me/docker-cats
    Using default tag: latest
    The push refers to repository [docker-registry.kubemaster.me/docker-cats]
    346be19f13b0: Layer already exists 
    935f303ebf75: Layer already exists 
    0e64bafdc7ee: Pushed 
    latest: digest: 
    sha256:5403064f94b617f7975a19ba4d1a1299fd584397f6ee4393d0e16744ed11aab1 size: 943
    

YAML - 部署、服务和入口

apiVersion: apps/v1
kind: Deployment
Metadata:
  labels:
    k8s-app: docker-registry
  name: docker-registry
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: docker-registry
  template:
    Metadata:
      labels:
        k8s-app: docker-registry
    spec:
      containers:
        - image: registry:2
          imagePullPolicy: Always
          name: docker-registry
          env:
            - name: REGISTRY_HTTP_SECRET
              value: "some-secret"
            - name: REGISTRY_HTTP_ADDR
              value: "0.0.0.0:80"
          ports:
            - containerPort: 80
              hostPort: 80
              protocol: TCP
          resources:
            limits:
              memory: 400Mi
              cpu: "200m"
            requests:
              memory: 200Mi
              cpu: 100m
---
apiVersion: v1
kind: Service
Metadata:
  labels:
    k8s-app: docker-registry
  name: docker-registry
  namespace: kube-system
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    k8s-app: docker-registry
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
Metadata:
  name: docker-registry
  namespace: kube-system
  annotations:
    Nginx.ingress.kubernetes.io/proxy-body-size: 2000m # support large images
spec:
  ingressClassName: Nginx
  rules:
    - host: docker-registry.kubemaster.me
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              serviceName: docker-registry
              servicePort: 80

P.S- 我关于如何为开发目的部署本地 Kubernetes 集群的设置 - https://github.com/unfor19/kubernetes-localdev

解决方法

放弃这个想法,相反,我通过执行使用 minikube 的 Docker 守护进程

eval $(minikube docker-env)