使用来自其部署的kubernetes集群的docker注册表

时间:2020-04-14 19:56:31

标签: docker kubernetes

我有一个本地kubernetes集群,我想向其部署一个docker注册表,集群节点可以从中下载图像。在尝试执行此操作时,我尝试了几种识别服务的方法:NodePort,由MetalLB以Layer2模式提供的LoadBalancer,其Flannel网络IP(指默认为10.244上的IP。 0.0 / 16网络)及其群集IP(默认情况下,该IP是指10.96.0.0/16网络上的IP)。在每种情况下,通过docker连接到注册表都会失败。

我对IP执行了cURL,并意识到,在按预期方式解析请求时,tcp拨号步骤持续花费63.15 +/- 0.05秒,随后HTTP(s)请求本身在一定时间内完成在tcp拨号的误差范围内。这在所有部署中都是一致的,防火墙规则从相对严格的设置到除了由Kubernetes直接添加的规则之外没有其他设置。在从具有用于所有群集节点的VM的单个物理服务器到用于每个节点和物理交换机的独特物理硬件的网络体系结构中,它也是一致的。如前所述,在公开服务的方式上它也是一致的。无论我是使用ingress-nginx服务公开它还是直接公开docker注册表,它都是一致的。

此外,当我将另一个Pod部署到集群时,我能够毫无延迟地通过其集群IP到达Pod,但是当尝试通过其外部LoadBalancer IP或NodePort到达Pod时,我确实遇到了相同的延迟。 。当尝试从非群集节点上的计算机(例如,使用LoadBalancer或NodePort)访问注册表时,除了预期的网络延迟外,没有其他延迟。

实际上,我主要的询问是做什么是我尝试做的“正确”方法?此外,作为一个学术问题,我还想知道我所看到的很长很长时间的延误的根源吗?

我的部署yaml文件已包含在下面以供参考。入口处理程序是ingress-nginx。

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: registry-pv-claim
  namespace: docker-registry
  labels:
    app: registry
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: docker-registry
  namespace: docker-registry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: docker-registry
  template:
    metadata:
      labels:
        app: docker-registry
    spec:
      containers:
        - name: docker-registry
          image: registry:2.7.1
          env:
            - name: REGISTRY_HTTP_ADDR
              value: ":5000"
            - name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY
              value: "/var/lib/registry"
          ports:
          - name: http
            containerPort: 5000
          volumeMounts:
          - name: image-store
            mountPath: "/var/lib/registry"
      volumes:
        - name: image-store
          persistentVolumeClaim:
            claimName: registry-pv-claim
---
kind: Service
apiVersion: v1
metadata:
  name: docker-registry
  namespace: docker-registry
  labels:
    app: docker-registry
spec:
  selector:
    app: docker-registry
  ports:
  - name: http
    port: 5000
    targetPort: 5000
---
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    annotations:
      nginx.ingress.kubernetes.io/proxy-body-size: "0"
      nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
      nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
      kubernetes.io/ingress.class: docker-registry
    name: docker-registry
    namespace: docker-registry
  spec:
    rules:
    - host: example-registry.com
      http:
        paths:
        - backend:
            serviceName: docker-registry
            servicePort: 5000
          path: /
    tls:
    - hosts:
      - example-registry.com
      secretName: tls-secret

1 个答案:

答案 0 :(得分:1)

对于将来的访客,您的问题似乎与法兰绒有关。

整个问题描述如下:

https://github.com/kubernetes/kubernetes/issues/88986

https://github.com/coreos/flannel/issues/1268

包括解决方法:

https://github.com/kubernetes/kubernetes/issues/86507#issuecomment-595227060