Docker na implantação do Kubernetes

13

Estou usando uma biblioteca de terceiros que cria contêineres de docker por irmãos via:

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

Estou tentando criar uma implantação do Kubernetes a partir do contêiner acima, mas atualmente estou obtendo:

Não é possível conectar-se ao daemon do Docker no unix: ///var/run/docker.sock. O daemon do docker está em execução?

Isso é esperado porque não estou declarando /var/run/docker.sockcomo um volume no yaml de implantação.

O problema é que não sei como fazer isso. É possível montar /var/run/docker.sockcomo um volume em um yaml de implantação?

Caso contrário, qual é a melhor abordagem para executar contêineres irmãos do docker de dentro de um pod / implantação do Kubernetes?

rys
fonte

Respostas:

19

Não verificado, pois me parece frágil iniciar um contêiner fora da supervisão do k8s, mas você deve poder montar /var/run/docker.sockcom um volume hostPath .

Exemplo de variação da documentação:

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

Eu acho que uma montagem simples deve ser suficiente para permitir a comunicação do cliente docker dentro do contêiner para o daemon docker no host, mas caso você receba um erro de permissão de gravação, significa que você precisa executar seu contêiner como contêiner privilegiado usando um objeto securityContext como esse (apenas um extrato acima para mostrar a adição, valores retirados da documentação ):

spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    securityContext:
      privileged: true
    name: test-container
Tensibai
fonte
Isso funcionou, obrigado. Sim, é uma ferramenta de terceiros, portanto não é o ideal. Mas pelo menos quero que o contêiner principal no Kubernetes o torne mais confiável. O contêiner aumenta os contêineres temporários com navegadores para teste de automação da interface do usuário e, em seguida, o contêiner do navegador é destruído.
rys
@rys sim, era um caso em que eu pensava, você ainda pode ter problemas se a carga do nó for muito alta, pois os k8s podem mover seu contêiner de 'iniciador'. Mas eu assumo a falha do conjunto de testes é algo aceitável neste caso
Tensibai
2

Embora essa seja uma solução funcional (eu mesmo a uso), existem algumas desvantagens em executar o Docker em um pod do Kubernetes montando /var/run/docker.sock

Principalmente o fato de você estar trabalhando com contêineres do Docker fora do controle do Kubernetes.

Outra solução sugerida que encontrei é usar um contêiner de carro lateral em seu casulo. Consulte Um caso para o Docker-in-Docker no Kubernetes . Existem duas partes em que a solução proposta está na parte 2 .

Eu espero que isso ajude.

Eldad Assis
fonte