Search code examples
postgresqldockerkubernetesdocker-composekompose

Kompose for docker-compose not use volumes


I use Kompose to convert docker-compose to Kubernetes files. When I used images runned on Docker (no Kubernetes), it used postgres volume to have persistent data. Now, with the same docker-compose, if I run with Kubernetes using the file created with Kompose, every time I launch Kubernetes the database is empty. How is this possible? If I look at Docker Desktop, in fact, I see that the volumes do not have the tag "IN USE".

How do I do that?

Thank you in advance!

docker-compose.yaml:

version: '3'
services:
  eureka-server:
    image: com.petcare/eureka-server:0.0.1-SNAPSHOT
    container_name: eureka-server
    expose:
      - 8761

  auth-service:
    image: com.petcare/auth-service:0.0.1-SNAPSHOT
    container_name: auth-service
    expose:
      - 8081
    depends_on:
      - eureka-server
      - postgresqldb

  map-service:
    image: com.petcare/map-service:0.0.1-SNAPSHOT
    container_name: map-service
    expose:
      - 8082
    depends_on:
      - eureka-server
      - postgresqldb

  reservation-service:
    image: com.petcare/reservation-service:0.0.1-SNAPSHOT
    container_name: reservation-service
    expose:
      - 8083
    depends_on:
      - eureka-server
      - postgresqldb

  user-service:
    image: com.petcare/user-service:0.0.1-SNAPSHOT
    container_name: user-service
    expose:
      - 8084
    depends_on:
      - eureka-server
      - postgresqldb

  api-gateway:
    image: com.petcare/api-gateway:0.0.1-SNAPSHOT
    container_name: api-gateway
    expose:
      - 8080
    depends_on:
      - eureka-server
    labels:
      kompose.service.type: NodePort
      kompose.service.nodeport.port: "30000"

  postgresqldb:
    image: postgres
    container_name: postgres
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_DB=websitepetcare
    volumes:
      - database-data:/var/lib/postgresql/data/
    labels:
      kompose.service.type: NodePort
      kompose.service.nodeport.port: "30002"

  pgadmin:
    container_name: pgadmin4_container
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: [email protected]
      PGADMIN_DEFAULT_PASSWORD: root
      PGADMIN_LISTEN_PORT: 50
    ports:
      - "5050:50"
    volumes:
      - pgadmin-data:/var/lib/pgadmin
    links:
      - "postgresqldb:pgsql-server"
    depends_on:
      - postgresqldb
    labels:
      kompose.service.type: NodePort
      kompose.service.nodeport.port: "30001"

volumes:
  database-data:
    external: true
  pgadmin-data:
    external: true

file created with kompose convert:

apiVersion: v1
items:
  - apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
        kompose.cmd: C:\ProgramData\chocolatey\lib\kubernetes-kompose\tools\kompose.exe convert -o kubernetes-services-deployments.yaml
        kompose.service.nodeport.port: "30001"
        kompose.service.type: NodePort
        kompose.version: 1.26.0 (40646f47)
      creationTimestamp: null
      labels:
        io.kompose.service: pgadmin
      name: pgadmin
    spec:
      replicas: 1
      selector:
        matchLabels:
          io.kompose.service: pgadmin
      strategy:
        type: Recreate
      template:
        metadata:
          annotations:
            kompose.cmd: C:\ProgramData\chocolatey\lib\kubernetes-kompose\tools\kompose.exe convert -o kubernetes-services-deployments.yaml
            kompose.service.nodeport.port: "30001"
            kompose.service.type: NodePort
            kompose.version: 1.26.0 (40646f47)
          creationTimestamp: null
          labels:
            io.kompose.service: pgadmin
        spec:
          containers:
            - env:
                - name: PGADMIN_DEFAULT_EMAIL
                  value: [email protected]
                - name: PGADMIN_DEFAULT_PASSWORD
                  value: root
                - name: PGADMIN_LISTEN_PORT
                  value: "50"
              image: dpage/pgadmin4
              name: pgadmin4-container
              ports:
                - containerPort: 50
              resources: {}
              volumeMounts:
                - mountPath: /var/lib/pgadmin
                  name: pgadmin-data
          restartPolicy: Always
          volumes:
            - name: pgadmin-data
              persistentVolumeClaim:
                claimName: pgadmin-data
    status: {}
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: pgadmin-data
      name: pgadmin-data
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 100Mi
    status: {}
  - apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
        kompose.cmd: C:\ProgramData\chocolatey\lib\kubernetes-kompose\tools\kompose.exe convert -o kubernetes-services-deployments.yaml
        kompose.service.nodeport.port: "30002"
        kompose.service.type: NodePort
        kompose.version: 1.26.0 (40646f47)
      creationTimestamp: null
      labels:
        io.kompose.service: postgresqldb
      name: postgresqldb
    spec:
      replicas: 1
      selector:
        matchLabels:
          io.kompose.service: postgresqldb
      strategy:
        type: Recreate
      template:
        metadata:
          annotations:
            kompose.cmd: C:\ProgramData\chocolatey\lib\kubernetes-kompose\tools\kompose.exe convert -o kubernetes-services-deployments.yaml
            kompose.service.nodeport.port: "30002"
            kompose.service.type: NodePort
            kompose.version: 1.26.0 (40646f47)
          creationTimestamp: null
          labels:
            io.kompose.service: postgresqldb
        spec:
          containers:
            - env:
                - name: POSTGRES_DB
                  value: websitepetcare
                - name: POSTGRES_PASSWORD
                  value: postgres
                - name: POSTGRES_USER
                  value: postgres
              image: postgres
              name: postgres
              ports:
                - containerPort: 5432
              resources: {}
              volumeMounts:
                - mountPath: /var/lib/postgresql/data/
                  name: database-data
          restartPolicy: Always
          volumes:
            - name: database-data
              persistentVolumeClaim:
                claimName: database-data
    status: {}
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: database-data
      name: database-data
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 100Mi
    status: {}
kind: List
metadata: {}

Solution

  • In a comment you write:

    When I want to delete all, I run this command:

    kubectl delete -f kubernetesFile.yaml
    

    When I start again all services with:

    kubectl apply -f kubernetesFile.yaml
    

    I have the database empty.

    The Kompose-converted kubernetesFile.yaml contains all of the Kubernetes resources, including the PersistentVolumeClaim that tells it to hold persistent data. So when you kubectl delete -f kubernetesFile.yaml, it deletes the PersistentVolumeClaim and the data, and then when you re-apply it, you get a new empty volume.

    You don't need to run kubectl delete here. Just run kubectl apply -f kubernetesFile.yaml when your setup changes. Anything that's updated will be changed, and the cluster will delete and recreate Pods as needed. Anything that's not updated will stay unchanged. If you delete a Deployment or another resource you'll have to delete that by hand (kubectl delete deployment unused-deployment).