Docker dans le déploiement de Kubernetes

13

J'utilise une bibliothèque tierce qui crée des conteneurs dockers frères via:

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

J'essaie de créer un déploiement Kubernetes à partir du conteneur ci-dessus, mais j'obtiens actuellement:

Impossible de se connecter au démon Docker sous unix: ///var/run/docker.sock. Le démon docker est-il en cours d'exécution?

Cela est attendu car je ne déclare pas en /var/run/docker.socktant que volume dans le déploiement yaml.

Le problème est que je ne sais pas comment faire ça. Est-il possible de monter en /var/run/docker.socktant que volume dans un yaml de déploiement?

Sinon, quelle est la meilleure approche pour exécuter les conteneurs frères et sœurs docker à partir d'un déploiement / pod Kubernetes?

rys
la source

Réponses:

19

Non vérifié car cela me semble fragile de démarrer un conteneur en dehors de la supervision de k8s, mais vous devriez pouvoir monter /var/run/docker.sockavec un volume hostPath .

Exemple de variation de la documentation:

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

Je pense qu'un simple montage devrait être suffisant pour permettre la communication du client docker dans le conteneur au démon docker sur l'hôte, mais si vous obtenez une erreur de permission d'écriture, cela signifie que vous devez exécuter votre conteneur en tant que conteneur privilégié en utilisant un objet securityContext comme celui-ci (juste un extrait d'en haut pour montrer l'addition, valeurs extraites de la documentation ):

spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    securityContext:
      privileged: true
    name: test-container
Tensibai
la source
Cela a fonctionné, merci. Ouais c'est un outil tiers donc ce n'est pas idéal. Mais je veux au moins que le conteneur principal de Kubernetes le rende plus fiable. Le conteneur augmente les conteneurs temporaires avec des navigateurs pour les tests d'automatisation de l'interface utilisateur, puis le conteneur du navigateur est détruit.
rys
@rys oui, c'était un cas auquel j'avais pensé, vous pouvez toujours rencontrer des problèmes si la charge du nœud va trop haut car les k8 peuvent déplacer votre conteneur de "lanceur". Mais je suppose que l'échec de la suite de tests est quelque chose d'acceptable dans ce cas
Tensibai
2

Bien qu'il s'agisse d'une solution de travail (je l'utilise moi-même), il y a quelques inconvénients à exécuter Docker dans un pod Kubernetes en montant /var/run/docker.sock

Surtout le fait que vous travaillez avec des conteneurs Docker hors du contrôle de Kubernetes.

Une autre solution suggérée que j'ai trouvée consiste à utiliser un conteneur de side-car dans votre pod. Voir Un cas pour Docker-in-Docker sur Kubernetes . Il y a deux parties où la solution proposée est dans la partie 2 .

J'espère que ça aide.

Eldad Assis
la source