Docker In Kubernetes-Bereitstellung

13

Ich verwende eine Drittanbieter-Bibliothek, die Geschwister-Docker-Container erstellt über:

docker run -d /var/run/docker.sock:/var/run/docker.sock ...

Ich versuche, eine Kubernetes-Bereitstellung aus dem oben genannten Container zu erstellen, erhalte derzeit jedoch Folgendes:

Es kann keine Verbindung zum Docker-Dämon unter Unix: ///var/run/docker.sock hergestellt werden. Läuft der Docker-Daemon?

Dies wird erwartet, da ich /var/run/docker.sockim Deployment-YAML kein Volume deklariere.

Das Problem ist, dass ich nicht weiß, wie ich das machen soll. Ist es möglich, /var/run/docker.sockein Volume in einem Bereitstellungs-Yaml bereitzustellen?

Wenn nicht, was ist der beste Ansatz, um Docker-Geschwistercontainer in einem Kubernetes-Deployment / -Pod auszuführen?

rys
quelle

Antworten:

19

Unverifiziert, da es für mich brüchig klingt, einen Container außerhalb der k8s-Überwachung zu starten, aber Sie sollten in der Lage sein, ihn /var/run/docker.sockmit einem HostPath-Volume bereitzustellen .

Beispielvariante aus der Dokumentation:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /var/run/docker.sock
      name: docker-sock-volume
  volumes:
  - name: docker-sock-volume
    hostPath:
      # location on host
      path: /var/run/docker.sock
      # this field is optional
      type: File

Ich denke, ein einfacher Mount sollte ausreichen, um die Kommunikation vom Docker-Client innerhalb des Containers zum Docker-Daemon auf dem Host zu ermöglichen. Wenn Sie jedoch eine Schreibberechtigung erhalten, müssen Sie Ihren Container als privilegierten Container mit einem securityContext- Objekt wie diesem ausführen (just ein Auszug von oben, um den Zusatz zu zeigen, Werte aus der Dokumentation entnommen ):

spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    securityContext:
      privileged: true
    name: test-container
Tensibai
quelle
Das hat funktioniert, danke. Ja, es ist ein Drittanbieter-Tool, daher ist es nicht ideal. Aber ich möchte zumindest, dass der Hauptcontainer in Kubernetes ihn zuverlässiger macht. Der Container fährt temporäre Container mit Browsern hoch, um die Benutzeroberfläche für die Automatisierung zu testen. Anschließend wird der Browser-Container zerstört.
rys
@rys Ja, das war ein Fall, an den ich gedacht hatte. Es kann immer noch vorkommen, dass Sie Probleme haben, wenn die Knotenlast zu hoch ist, da k8s Ihren "Launcher" -Container verschieben kann. Ich
gehe jedoch
2

Obwohl dies eine funktionierende Lösung ist (ich benutze sie selbst), gibt es einige Nachteile, wenn Docker in einem Kubernetes-Pod durch Mounten ausgeführt wird /var/run/docker.sock

Hauptsächlich, weil Sie mit Docker-Containern arbeiten, die sich der Kontrolle von Kubernetes entziehen.

Ein anderer Lösungsvorschlag, den ich gefunden habe, ist die Verwendung eines Beiwagencontainers in Ihrer Kapsel. Siehe Ein Fall für Docker-in-Docker unter Kubernetes . Es gibt zwei Teile, in denen sich die vorgeschlagene Lösung in Teil 2 befindet .

Ich hoffe das hilft.

Eldad Assis
quelle