2017-03-14 4 views
1

Ich benutze private Docker registry addon in meinem kubernetes-Cluster, und ich möchte Port 5000 auf jedem Knoten offen legen, um Bild von localhost: 5000 leicht zu ziehen. Also legte ich eine Pod-Manifest-Datei /etc/kubernetes/manifests/kube-registry-proxy.manifest auf jedem Knoten, um einen lokalen Proxy für Port 5000 zu starten. Es funktioniert, wenn ich Kubernetes auf Bare-Metal Ubuntu vor einigen Monaten manuell bereitgestellt, aber gescheitert, wenn ich Kargo versuchen, der Port 5000 nicht zu hören.kube-registry-proxy stellt Port 5000 auf keinem Knoten frei

Ich verwende kargo mit Kattun Netzwerk-Plugin, die Docker Registrierung der Konfigurationen sind:

kind: PersistentVolume 
apiVersion: v1 
metadata: 
    name: kube-system-kube-registry-pv 
    labels: 
    kubernetes.io/cluster-service: "true" 
spec: 
    capacity: 
    storage: 500Gi 
    accessModes: 
    - ReadWriteMany 
    persistentVolumeReclaimPolicy: Retain 
    hostPath: 
    path: /registry 

kind: PersistentVolumeClaim 
apiVersion: v1 
metadata: 
    name: kube-registry-pvc 
    namespace: kube-system 
    labels: 
    kubernetes.io/cluster-service: "true" 
spec: 
    accessModes: 
    - ReadWriteMany 
    resources: 
    requests: 
     storage: 500Gi 

apiVersion: v1 
kind: ReplicationController 
metadata: 
    name: kube-registry-v0 
    namespace: kube-system 
    labels: 
    k8s-app: kube-registry 
    version: v0 
    kubernetes.io/cluster-service: "true" 
spec: 
    replicas: 1 
    selector: 
    k8s-app: kube-registry 
    version: v0 
    template: 
    metadata: 
     labels: 
     k8s-app: kube-registry 
     version: v0 
     kubernetes.io/cluster-service: "true" 
    spec: 
     containers: 
     - name: registry 
     image: registry:2.5.1 
     resources: 
      # keep request = limit to keep this container in guaranteed class 
      limits: 
      cpu: 100m 
      memory: 100Mi 
      requests: 
      cpu: 100m 
      memory: 100Mi 
     env: 
     - name: REGISTRY_HTTP_ADDR 
      value: :5000 
     - name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY 
      value: /var/lib/registry 
     volumeMounts: 
     - name: image-store 
      mountPath: /var/lib/registry 
     ports: 
     - containerPort: 5000 
      name: registry 
      protocol: TCP 
     volumes: 
     - name: image-store 
     persistentVolumeClaim: 
      claimName: kube-registry-pvc 

apiVersion: v1 
kind: Service 
metadata: 
    name: kube-registry 
    namespace: kube-system 
    labels: 
    k8s-app: kube-registry 
    kubernetes.io/cluster-service: "true" 
    kubernetes.io/name: "KubeRegistry" 
spec: 
    selector: 
    k8s-app: kube-registry 
    ports: 
    - name: registry 
    port: 5000 
    protocol: TCP 

Ich habe eine pod Manifest-Datei /etc/kubernetes/manifests/kube-registry-proxy.manifest vor Lauf kargo erstellt:

apiVersion: v1 
kind: Pod 
metadata: 
    name: kube-registry-proxy 
    namespace: kube-system 
spec: 
    containers: 
    - name: kube-registry-proxy 
    image: gcr.io/google_containers/kube-registry-proxy:0.3 
    resources: 
     limits: 
     cpu: 100m 
     memory: 50Mi 
    env: 
    - name: REGISTRY_HOST 
     value: kube-registry.kube-system.svc.cluster.local 
    - name: REGISTRY_PORT 
     value: "5000" 
    - name: FORWARD_PORT 
     value: "5000" 
    ports: 
    - name: registry 
     containerPort: 5000 
     hostPort: 5000 

kube-Registry- Proxy läuft auf allen Knoten, aber nichts hört auf Port 5000. Einige Ausgabe:

[email protected]:~$ kubectl get all --all-namespaces | grep registry-proxy 
kube-system po/kube-registry-proxy-k8s15m1    1/1  Running    1   1h 
kube-system po/kube-registry-proxy-k8s15m2    1/1  Running    0   1h 
kube-system po/kube-registry-proxy-k8s15s1    1/1  Running    0   1h 

[email protected]:~$ docker ps | grep registry 
756fcf674288  gcr.io/google_containers/kube-registry-proxy:0.3  "/usr/bin/run_proxy"  19 minutes ago  Up 19 minutes       k8s_kube-registry-proxy.bebf6da1_kube-registry-proxy-k8s15m1_kube-system_a818b22dc7210ecd31414e328ae28e43_7221833c 

[email protected]:~$ docker logs 756fcf674288 | tail 
waiting for kube-registry.kube-system.svc.cluster.local to come online 
starting proxy 

[email protected]:~$ netstat -ltnp | grep 5000 

[email protected]:~$ curl -v localhost:5000/v1/ 
* Trying 127.0.0.1... 
* connect to 127.0.0.1 port 5000 failed: Connection refused 
* Failed to connect to localhost port 5000: Connection refused 
* Closing connection 0 
curl: (7) Failed to connect to localhost port 5000: Connection refused 

[email protected]:~$ kubectl get po kube-registry-proxy-k8s15m1 --namespace=kube-system -o wide 
NAME       READY  STATUS RESTARTS AGE  IP    NODE 
kube-registry-proxy-k8s15m1 1/1  Running 3   1h  10.233.69.64 k8s15m1 

[email protected]:~$ curl -v 10.233.69.64:5000/v1/ 
* Trying 10.233.69.64... 
* Connected to 10.233.69.64 (10.233.69.64) port 5000 (#0) 
> GET /v1/ HTTP/1.1 
> Host: 10.233.69.64:5000 
> User-Agent: curl/7.47.0 
> Accept: */* 
> 
< HTTP/1.1 404 Not Found 
< Content-Type: text/plain; charset=utf-8 
< Docker-Distribution-Api-Version: registry/2.0 
< X-Content-Type-Options: nosniff 
< Date: Tue, 14 Mar 2017 16:41:56 GMT 
< Content-Length: 19 
< 
404 page not found 
* Connection #0 to host 10.233.69.64 left intact 

Antwort

0

Ich denke, dass hier ein paar Dinge vor sich gehen.

Foremost, beachten Sie, dass Kubernetes Services in 3 Geschmacksrichtungen: ClusterIP (das ist die Standardeinstellung), NodePort (die wie sehr viel klingt, was Sie passieren erwarteten) und LoadBalancer (die ich nicht weiter erwähnen, aber die Doktoren tun).

ich erwarten würde, dass, wenn Sie Ihre aktualisierte Service zu verlangen ausdrücklich type: NodePort, erhalten Sie näher an, was Sie im Sinn hatte (aber bewusst sein, dass, wenn Sie es geändert, NodePort ports are limited to 30000-32767

So:.

apiVersion: v1 kind: Service metadata: name: kube-registry namespace: kube-system labels: k8s-app: kube-registry kubernetes.io/cluster-service: "true" kubernetes.io/name: "KubeRegistry" spec: type: NodePort # <--- updated line selector: k8s-app: kube-registry ports: - name: registry port: 5000 nodePort: 30500 # <-- you can specify, or omit this protocol: TCP

Wenn Sie eine Meinung über den Port, den Sie den Dienst auf hören möchten haben, können Sie es spezifizieren, oder lassen Sie es gerade aus und Kubernetes wird man von den verfügbaren Platz holen.

Ich werde diese nächste Sache der Vollständigkeit halber erwähnen, aber was ich sagen möchte, ist eine schlechte Übung, also bitte tu es nicht. Sie können auch die Pods hören direkt auf dem tatsächlichen TCP/IP-Stack der Node, von specifying hostPort; Also in Ihrem Fall wäre es hostPort: 5000 direkt unter containerPort: 5000, wodurch die Pod verhalten sich wie eine normale docker -p 5000:5000 Befehl würde. Aber das macht die Planung Pods zu einem Alptraum, also bitte nicht.

Zweitens über Ihre 404 von curl:

ich zu übernehmen werde, auf dem Ausgang des curl Befehl aus, dass 10.233.69.x ist der Service-CIDR, was erklärt, warum Port 5000 mit etwas reagiert. Die Anfrage war in der richtigen Stimmung, aber /v1/ war eine falsche URI zu versuchen. Die Docker Registry API docs enthält einen Abschnitt über checking it is a V2 API instance. Mein Favorit curl einer Registrierung ist https://registry.example.com/v2/_catalog, weil es den Namen jedes Bildes darin zurückgibt, sicherzustellen, dass meine Anmeldeinformationen korrekt sind, dass der Registrierungsserver ordnungsgemäß funktioniert, und so weiter.

Ich weiß, es ist eine Menge zu übernehmen, also wenn du das Gefühl hast, dass ich über etwas beschönigt habe, lass es mich wissen und ich werde versuchen, es anzugehen. Viel Glück!

+0

danke!Ich benutze [private Docker Registrierungs-Addon] (https://github.com/kubernetes/kubernetes/blob/7ef585be224dae4ec5deae0f135653116e21a6e0/cluster/addons/registry/README.md#expose-the-registry-on-each-node) in mein Cluster, und ich möchte Port 5000 auf jedem Knoten freilegen, um Bild von localhost: 5000 leicht zu ziehen. Also habe ich eine Pod-Manifest-Datei '/ etc/kubernetes/manifests/kube-registry-proxy.manifest' auf jedem Knoten platziert, um einen lokalen Proxy für Port 5000 zu starten. Er funktioniert, wenn ich vor ein paar Monaten kubernetes auf bare metal ubuntu manuell implementiert habe, aber gescheitert, wenn ich Kargo versuche. Irgendeine Ahnung? –

+0

Sie können [diese Frage] abonnieren (https://stackoverflow.com/questions/37533684/kubernetes-private-docker-registry-registry-proxy-doesnt-work) und [diese andere Frage] (https://stackoverflow.com/questions/36148216/kubernete-private-registry-doesnt-work) weil sie fast genau deine Frage sind. Das heißt, es scheint, CNI-Netzwerke haben keinen Zugriff auf das "Host" -Netzwerk, absichtlich; Siehe dieses [kubernetes GitHub-Problem] (https://github.com/kubernetes/kubernetes/issues/23920#issuecomment-217048099) für die blutigen Details –

Verwandte Themen