Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

erro ao rodar "kubectl create -f statefulset.yaml" - 2

Fiz o yaml, do statefulset e verifiquei identação, verifiquei se havia algo errado, porém, nem a porrete o comando roda, alguém pode me ajudar?

error: unable to recognize "statefulset.yaml": no matches for kind "StatefulSet" in version "apps/v1beta1"

12 respostas

Olá Felipe, tudo bem? Você poderia tentar da seguinte forma:

apiVersion: apps/v1
kind: StatefulSet
metadata:
<restante do arquivo>

E fala pra gente o resultado!

~/kubernetes/db$ kubectl create -f statefulset.yaml

error: error validating "statefulset.yaml": error validating data: ValidationError(StatefulSet.spec): missing required field "selector" in io.k8s.api.apps.v1.StatefulSetSpec; if you choose to ignore these errors, turn validation off with --validate=false

segue o meu yaml:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-mysql
spec:
  serviceName: db
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
        - name: container-mysql
          image: mysql:5.7.19
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_DATABASE
              value: "loja"
            - name: MYSQL_USER
              value: "root"
            - name: MYSQL_ALLOW_EMPTY_PASSWORD
              value: "1"
          volumeMounts:
            - name: volume-mysql
              mountPath: /var/lib/mysql
      volumes:
        - name: volume-mysql
          persistentVolumeClaim:
            claimName: configuracao-mysql

Olá Felipe, tdb?

Estava com o mesmo problema e encontrei a resposta lendo outro tópico do fórum (https://cursos.alura.com.br/forum/topico-erro-ao-rodar-kubectl-create-f-statefulset-yaml-96379).

Na versão 1 da apiVersion a key selector é obrigatória. Sendo assim, adicione o seguinte conteúdo logo após serviceName: db:

  selector:
    matchLabels:
      name: mysql

Dica: você pode usar sites como o https://kubeyaml.com para validar se o seu YAML está OK.

No caso Felipe, seu arquivo deveria ficar da seguinte forma:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-mysql
spec:
  serviceName: db
  selector:
    matchLabels:
      name: mysql
  template:
    spec:
      containers:
        - name: container-mysql
          image: mysql:5.7.19
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_DATABASE
              value: "loja"
            - name: MYSQL_USER
              value: "root"
            - name: MYSQL_ALLOW_EMPTY_PASSWORD
              value: "1"
          volumeMounts:
            - name: volume-mysql
              mountPath: /var/lib/mysql
      volumes:
        - name: volume-mysql
          persistentVolumeClaim:
            claimName: configuracao-mysql

Fala pra gente se funcionou!

Copiado como você disse, retorna este erro:

The StatefulSet "statefulset-mysql" is invalid: spec.template.metadata.labels: Invalid value: map[string]string(nil): selector does not match template labels

Felipe, sugiro tu seguir o código no github (https://github.com/RafaelNercessian/kubernetes-gravacao). Ele é fornecido na última aula do curso. Testei e funcionou bem aqui. Tenta dar uma olhada para ver se te dá uma luz do que pode estar ocorrendo.

Felipe, o erro que você mencionou por último indica o ponto com problema: (...) invalid: spec.template.metadata.labels (...). Veja se você não colocou a label selector no lugar errado ou com indentação errada.

Esse é o meu arquivo que está funcionando:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-mysql
spec:
  serviceName: db
  selector:
    matchLabels:
      name: mysql
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
        - name: container-mysql
          image: mysql:5.7
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_DATABASE
              value: "loja"
            - name: MYSQL_USER
              value: "root"
            - name: MYSQL_ALLOW_EMPTY_PASSWORD
              value: "1"
          volumeMounts:
            - name: volume-mysql
              mountPath: /var/lib/mysql
      volumes:
        - name: volume-mysql
          persistentVolumeClaim:
            claimName: configuracao-mysql

Nenhuma das alternativas acima funciona, o código é de aproximadamente 3 anos atrás, o que me ocorre que a versão do minikube que está sendo rodada é obsoleta em comparação a minha, a alguma configuração ou versão que eu deva priorizar para que o código seja concluido?

Minha versão do Minikube para você comparar (estou usando Ubuntu 18.04):

rogerio@machine:~$ minikube version
 minikube version: v1.9.2
 commit: 93af9c1e43cab9618e301bc9fa720c63d5efa393

Então Felipe, como o Rogerio, também utilizo o Ubuntu 18.04 porém a versão do minukube é:

minikube version: v1.6.2

Qual a versão que você está utilizando Felipe?

minikube start minikube v1.9.2 on Ubuntu 18.04 Using the docker driver based on existing profile Starting control plane node m01 in cluster minikube Pulling base image ... Restarting existing docker container for "minikube" ... Preparing Kubernetes v1.18.0 on Docker 19.03.2 ... Kubeadm.pod-network-cidr=10.244.0.0/16 Enabling addons: default-storageclass, storage-provisioner Done! kubectl is now configured to use "minikube"

solução

Felipe, você poderia copiar exatamente o conteúdo do arquivo statefulset.yaml abaixo e tentar executar, porque fiz os mesmos passos e dessa forma abaixo funcionou corretamente:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-mysql
spec:
  serviceName: db
  selector:
    matchLabels:
      name: mysql
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
        - name: container-mysql
          image: mysql:5.7.19
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_DATABASE
              value: "loja"
            - name: MYSQL_USER
              value: "root"
            - name: MYSQL_ALLOW_EMPTY_PASSWORD
              value: "1"
          volumeMounts:
            - name: volume-mysql
              mountPath: /var/lib/mysql
      volumes:
          - name: volume-mysql
            persistentVolumeClaim:
              claimName: configuracao-mysql