3
respostas

[Sugestão] Erro ao criar volume Linux

Caso tenha algum erro ao criar o volume pod-volume como:

MountVolume.SetUp failed for volume "pod-volume" : hostPath type check failed: /home/user/testes/ is not a directory

Eu consegui resolver aqui adicionando o type como: DirectoryOrCreate pelo que eu entendi, utilizando esta propriedade ele vai criar caso não exista o diretorio, em meu caso o diretorio já existia, então não entendi muito bem o motivo de ter funcionado, mas funcionou rsrs.

O manifesto do pod ficou assim:

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
      volumeMounts:
        - mountPath: /volume
          name: pod-volume
    - name: jenkins-container
      image: jenkins/jenkins:alpine
      volumeMounts:
        - mountPath: /volume
          name: pod-volume
  volumes:
    - name: pod-volume
      hostPath:
        path: /home/user/testes/
        type: DirectoryOrCreate
3 respostas

Olá, Vinicius! Tudo bem

Fico feliz que tenha resolvido o problema em questão! Além disso, agradeço por compartilhar a sua solução aqui no fórum, pois, eu sei que ela ajudará outros estudantes que tiverem o mesmo problema.

No mais, bons estudos!

Rodando o mesmo código nativamente no Docker Desktop para Windows não funciona, eu notei que realmente funcionou quando usei a opcao DirectoryOrCreate mas agora parece tem algum problema com o path no container, será isso?

Normal   Pulling    11s (x6 over 93s)  kubelet            Pulling image "nginx:latest"
 Warning  Failed     9s (x6 over 92s)   kubelet            Error: Error response from daemon: invalid mode: /volume
 Normal   Pulled     9s (x5 over 70s)   kubelet            Container image "jenkins/jenkins:alpine" already present on machine
 Warning  Failed     9s (x6 over 72s)   kubelet            Error: Error response from daemon: invalid mode: /volume

Oi, Vinicius!

A opção DirectoryOrCreate força o Kubernetes a criar o diretório automaticamente caso ele não exista, ou a usá-lo se já existir. No seu caso, mesmo o diretório já existindo, essa configuração foi necessária porque o type padrão (quando omitido) é "" (vazio), que faz o Kubernetes aplicar uma verificação mais restritiva, dependendo da configuração do kubelet e do ambiente (por exemplo, permissões ou políticas de segurança).

Além disso, o erro inicial indica que o Kubernetes não conseguiu validar o diretório como sendo do tipo Directory esperado. Ao usar DirectoryOrCreate, você "relaxa" essa validação, permitindo que o volume seja montado mesmo que a checagem anterior falhe.

Veja o que significa cada opção de type em hostPath:

  • Directory: exige que o diretório já exista.
  • DirectoryOrCreate: usa o diretório se ele existir, ou cria se não existir.
  • FileOrCreate: cria um arquivo vazio se não existir.
  • Socket, CharDevice, BlockDevice: valida tipos específicos de arquivos de dispositivo.

Seu manifesto está correto, e o ajuste foi adequado para contornar o bloqueio que você enfrentou.

Fico à disposição.