Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro ao criar StatefulSet no Kubernetes

Olá a todos. Toda vez que tento criar um file do statefulset mostra o erro:

The StatefulSet "stateful-postgres-api-pessoas" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"name":"stateful-postgres-api-pessoas"}: `selector` does not match template `labels`

Meu pod:

kind: Pod
apiVersion: v1
metadata:
  name: postgres-api-pessoas
  labels:
    name: postgres-api-pessoas
spec:
  containers:
  - name: postgres-api-pessoas
    image: rjdesenvolvimento/postgres-apipessoas
    imagePullPolicy: Never
    ports:
      - containerPort: 5432

meu service

kind: Service
apiVersion: v1
metadata:
  name: zeus
spec:  
  type: ClusterIP
  ports:
    - port: 5432
  selector:
    name: stateful-postgres-api-pessoas

minhas permissões

kind: persistentVolumeClaim
apiVersion: v1
metadata:
  name: configuracao-postgres-api-pessoa
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

e finalmente, meu stateful

kind: StatefulSet
apiVersion: apps/v1
metadata:
  name: stateful-postgres-api-pessoas
  labels:
    name: stateful-postgres-api-pessoas
spec:
  selector:
    matchLabels:
      app: postgres-api-pessoas
  serviceName: zeus
  template:
    metadata:
      labels:
        name: stateful-postgres-api-pessoas
    spec:
      containers:
        - name: container-postgres-api-pessoas
          image: rjdesenvolvimento/postgres-apipessoas
          imagePullPolicy: Never
          ports:
            - containerPort: 5432
          volumeMounts: 
            - name: volume-postgres-api-pessoas
              mountPath: /var/lib/postgresql/data
      volumes:
        - name: volume-postgres-api-pessoas
          persistentVolumeClaim: 
            claimName: configuracao-postgres-api-pessoa

Poderia por favor me ajudar com esse problema.

1 resposta
solução!

Esse problema eu consegui resolver. Porém surgiu outro. Desenvolvi uma api rest com spring boot e postgres. Ela depende que o banco exista, pois no momento que ela sobe, ela cria as tabelas caso nao exista. Com docker consegui orquestrar um composer e funciona perfeito. Segue o exemplo:

dockerfile da api

FROM alpine
RUN apk add openjdk8
MAINTAINER rjdesenvolvimento.com
COPY target/apipessoas-0.0.1.jar /opt/gaia/apipessoas.jar
ENTRYPOINT ["/usr/bin/java"]
CMD ["-jar", "/opt/gaia/apipessoas.jar"]
EXPOSE 8080

dockerfile do postgres

FROM postgres:10-alpine
MAINTAINER rjdesenvolvimento.com
ENV POSTGRES_PASSWORD=postgres
ENV POSTGRES_PORT=5432
CMD ["postgres"]
ADD postgres.sql /docker-entrypoint-initdb.d/
EXPOSE 5432

docker compose

version: "3.0"
services:
  postgres:
    build:
      dockerfile: postgres.dockerfile
      context: .
    image: rjdesenvolvimento/postgres-apipessoas
    container_name: postgres
    ports:
      - "5432:5432"
    volumes:
      - /home/rodrigo/Projetos/Volumes:/var/lib/postgresql/data
    networks:
      - gaia_network

  apipessoas:
    build:
      dockerfile: api-pessoa.dockerfile
      context: .
    image: rjdesenvolvimento/api-pessoas
    container_name: api_pessoas
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    networks:
      - gaia_network
networks:
  gaia_network:
    driver: bridge

usando o kubernetes, a configuracao do banco de dados ficou assim:

apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  ports:
  - port: 5432
    name: postgres-api-pessoas
  clusterIP: None
  selector:
    app: postgres
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres-api-pessoas
spec:
  serviceName: postgres
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: container-postgres-api-pessoas
        image: rjdesenvolvimento/postgres-apipessoas
        imagePullPolicy: Never
        env:
         - name: POSTGRES0_USER
           value: postgres
         - name: POSTGRES_PASSWORD
           value: 5N(w=<6kUt7:7Qax
         - name: POSTGRES_DB
           value: zeus
        ports:
        - containerPort: 5432          
          name: zeus
        volumeMounts:
          - name: volume-postgres-api-pessoas
            mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: volume-postgres-api-pessoas
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

e da api ficou assim

servico

kind: Service
apiVersion: v1
metadata:
  name: servico-api-pessoas
spec:
  type: LoadBalancer
  selector:
    app: api-pessoas-pod
  ports:
  - port: 80
    targetPort: 8080

e o deploy

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-api-pessoas
  labels:
    app: api-pessoas-pod
spec:
  selector:
    matchLabels:
      app: api-pessoas-pod
  template:
    metadata:
      labels:
        app: api-pessoas-pod
    spec:
      containers:
      - name: contaienr-api-pessoas
        image: rjdesenvolvimento/api-pessoas
        imagePullPolicy: Never
        ports:
          - containerPort: 8080

Acontece que o pod da api está reiniciando toda hora, pois há erro.

deployment-api-pessoas-8cfd5c6c5-dpln4   0/1       CrashLoopBackOff   6          10m
postgres-api-pessoas-0                   1/1       Running            0          28m

O que há de errado?