Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Problema com DNS no K8S com Minikube

Olá, Lucas! Estou tentando usar o minikube para subir um projeto da empresa em que trabalho. Acontece que o k8s não enxerga o host do nosso registry pois não consegue resolver os nomes.

Nós temos um registry interno, cujo endereço é "git.dominio.da.empresa", e o K8S retorna com erro "no such host" quando tenta fazer o pull da imagem.

O log do erro está copiado abaixo (obtido do describe do Pod via comando "kubectl describe pods nome_do_pod"):

Events:
  Type     Reason   Age                    From               Message
  ----     ------   ----                   ----               -------
  Normal   BackOff  21h (x815 over 24h)    kubelet, minikube  Back-off pulling image "git.dominio.da.empresa:4567/cdsis/testepipeline:latest"
  Warning  Failed   21h (x838 over 24h)    kubelet, minikube  Error: ImagePullBackOff
  Normal   Pulling  3m44s (x4 over 5m21s)  kubelet, minikube  Pulling image "git.dominio.da.empresa:4567/cdsis/testepipeline:latest"
  Warning  Failed   3m44s (x4 over 5m13s)  kubelet, minikube  Failed to pull image "git.dominio.da.empresa:4567/cdsis/testepipeline:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://git.dominio.da.empresa:4567/v2/: dial tcp: lookup git.dominio.da.empresa on 181.213.132.2:53: no such host
  Warning  Failed   3m44s (x4 over 5m13s)  kubelet, minikube  Error: ErrImagePull
  Warning  Failed   3m29s (x6 over 5m13s)  kubelet, minikube  Error: ImagePullBackOff
  Normal   BackOff  13s (x20 over 5m13s)   kubelet, minikube  Back-off pulling image "git.dominio.da.empresa:4567/cdsis/testepipeline:latest"

Como faço para fazer com que o K8S enxergue as máquinas da empresa e resolva os nomes adequadamente?

Obs: Se eu colocar o IP da empresa em vez do nome, funciona sem problemas.

6 respostas

Olá Ebenézer, tudo bem? Nesse caso, você poderia ver a aquisição de um domínio para assim poder ter direcionamento usando o nome para o IP da empresa. Outra abordagem, poderia ser utilizando certificados, esse artigo mostra uma abordagem interessante só que utilizando o Swarm, mas penso que você pode adaptar para Kubernetes.

Espero ter ajudado!

Obrigado, Jonilson, mas creio que vc não me entendeu. Eu já tenho o domínio. Quando citei o domínio fictício git.dominio.da.empresa acima foi apenas para não expor o domínio da empresa aqui nesta plataforma.

A questão é que o k8s não está conseguindo resolver o nome git.dominio.da.empresa. De minha máquina física tudo funciona, mas o k8s não enxerga as máquinas do domínio.

Em termos práticos: Da minha máquina física, consigo sem dificuldades fazer pull das imagens que estão em nosso registry. Entretando, quando rodo o minikube e crio um Pod que faz uso de uma das imagens de nosso registry, o k8s não consegue pois não encontra o host git.dominio.da.empresa.

O meu Deployment é o seguinte:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: projeto10-deployment
  labels:
    app: projeto10-dplmnt
spec:
  selector:
    matchLabels:
      app: projeto10-pod
  template:
    metadata:
      labels:
        app: projeto10-pod
    spec:
      containers:
        - name: projeto10-container
          image: git.dominio.da.empresa:4567/cdsis/testepipeline:latest
          ports:
            - containerPort: 8080

Repare que a imagem do Pod é a git.dominio.da.empresa:4567/cdsis/testepipeline:latest

Minha dúvida é: Como faço para que o minikube/k8s consiga enxergar esse nome? Penso que seja necessário configurar o DNS no minikube (via arquivo /etc/resolv.conf), mas... Como fazer isso? Preciso fazer na mão, ou existe algum comando (algo como minikube config ... ou um kubectl config dns ...) para fazer tal configuração?

Posso estar enganado Ebenézer, mas acho que seguindo esse artigo: Pull an Image from a Private Registry da própria documentação você deve conseguir fazer esse procedimento, só que é com a utilização de secret. Você já tentou dessa forma? Poderia tentar? E falar pra gente o resultado.

Oi, Jonilson. O problema ainda não é esse. Eu uso o secret sim, mas o meu problema não tem relação alguma com isso. Não sei como dizer de outra forma...

Vou tentar ser mais prático: O mecanismo do k8s responsável por fazer o Pull das images do nosso registry não consegue resolver o nome do nosso registry. Se eu pudesse conectar na "máquina" que faz esse Pull e tentasse fazer um ping na máquina "git.dominio.da.empresa" a resposta seria "no such host".

Entende?

A questão é, como dito anteriormente, que "o k8s não enxerga as máquinas do domínio". Não as localiza quando uso os nomes. Se em vez de usar o nome "git.dominio.da.empresa" eu usar o IP dessa máquina, então tudo funciona.

Minha questão: Como informar o DNS ao Minikube para que o k8s consiga resolver os nomes das máquinas da empresa e, assim, consiga fazer Pull das imagens do nosso repositório de imagens?

Obs: Favor não confundir com a configuração de DNS para os PODs (aquela que fazemos com a seção dnsPolicy e dnsConfig). Estou em um problema bem anterior: O k8s sequer consegue fazer o Pull das imagens pois não consegue resolver o nome do repositório onde estão as imagens.

Um exemplo ainda mais claro: Veja abaixo um trecho do meu deployment:

[conteúdo anterior omitido]
    containers:
        - name: projeto10-container
          image: git.trt10.jus.br:4567/cdsis/projeto10:latest
          imagePullPolicy: Always
[conteúdo posterior omitido]

Se em imageeu substituir git.trt10.jus.br pelo IP dessa máquina git.trt10.jus.br, o Pull da imagem funciona. O meu problema é esse. Como fazer para esse Pull funcionar sem ter que usar o IP? Como fazer o k8s resolver o nome ainda na fase de pull das imagens?

solução!

Acho que agora entendi Ebenézer, e acho que você está com o mesmo problema que foi relatado nessa Issue no GitHub do minikube, e uma das soluções foi usar o File Sync para atualizar o arquivo resolv.conf do minikube. Acho que é um ponto de partida para resolver esse problema! Fala se deu certo!

Show! Deu certo sim!

Essa solução do File Sync era exatamente o que precisava.

Obrigado!