Kubernetes logo

We have written about Kompose earlier here , when it was as young as 0.1.0. This blog post will showcase where Kompose stands now.

Kompose is a tool that converts a Docker Compose file to Kubernetes or OpenShift artifacts. Kompose was originally started as an onboarding tool for Kubernetes users by Skippbox (now part of Bitnami). It went on to receive early contributions from both Google and Red Hat.

Kompose has graduated from the Kubernetes Incubator, we reached the epic milestone of 1.0.0, and so it's now officially part of the Kubernetes Community Project.

 Let's see what Kompose is all about! Here's a standard example that the Kubernetes community uses consisting of a web interface (Go) as well as a cluster of databases (Redis).

Let's use an official Kompose example!

version: "2"
services:
redis-master:
 image: grc.io/google_containers/redis:e2e
 ports:
 -"6379"
redis-slave:
 image: gcr.io/google_samples/gb-redisslave:v1
 ports:
  - "6379"
  environment:
  - GET_HOSTS_FROM=dns
frontend:
 image: gcr.io/google-samples/gb-frontend:v4
 ports:
 - 80:80
 environment:
 -GET_HOSTS_FROM=dns
 labels:
  kompose.service.type:LoadBalancer

Features of Kompose:

The following sections discuss the various features of Kompose:

Deploying Kubernetes Artifacts Directly

The following example demonstrates how you can run 'kompose up' to deploy an application to a kubernetes cluster. This example will use either *minishift* or *minikube* to test it locally.

$ kompose up

INFO We are going to create Kubernetes Deployments, Services and PersistentVolumeClaims for your Dockerized application. If you need a different kind of resource, use 'kompose convert' and 'kubectl create - f commands instead.

INFO Deploying application in "default" namespace
INFO Successfully created Service: frontend
INFO Successfully created Service: redis-master
INFO Successfully created Service: redis-slave
INFO Successfully created Deployment: frontend
INFO Successfully created Deployment: redis-master
INFO Successfully created Deployment: redis-slave

Your application has been deployed to Kubernetes. You can run 'kubetcl get deployment, svc, pods, pvc' for details.

Generating Kubernetes Artifacts

If you want to simply generate artifacts than deploying immediately, you can run 'kompose convert' as follows:

$ kompose convert
INFO Kubernetes file "frontend-service.yaml" created
INFO Kubernetes file "redis-master-service.yaml" created

You can deploy this later, when required, using:

$ kubectl create -f frontend-service.yaml, redis-master-service.yaml, redis-slave-service.yaml, frontend-deployment.yaml, redis-master-deployment.yaml, redis-slave-deployment.yaml
service "frontend" created
service "redis-master" created

Deploying/Generating OpenShift artifacts

OpenShift is another distribution of Kubernetes and it is one of the supported providers of Kompose. You can deploy the artifacts on OpenShift by providing the command line argument '--provider':

$ kompose up --provider openshift

You can generate artifacts using:

$ kompose convert --provider openshift

Store output artifacts to a specific location

In case, you need to store output artifacts to some location, use the command line argument '-o' as shown below.

$ kompose convert -o out/
INFO Kubernetes file "out/frontend-service.yaml" created
INFO Kubernetes file "out/redis-master-service.yaml" created

Replicas

You can specify the number of replicas by using the command line argument '--replicas'.

$ kompose convert --replicas=4

Delete deployed manifests

You can delete instanced artifacts like service, deployments etc. as follows:

$ Kompose down
INFO Deleting application id=n "default" namespace
INFO Successfully deleted Service: frontend
INFO Successfully deleted Service: redis-master
INFO Successfully deleted Service: redis-alive
INFO Successfully deleted Deployment: frontend
INFO Successfully deleted Deployment: redis-master
INFO Successfully deleted ployment: redis-slave

Labels

As of now, not all the Docker Compose keys can be mapped to Kubernetes artifacts. Hence, for service type and ingress, we have defined two types of Kompose specific labels as follows:

'kompose.service.expose' defines if service needs to be made accessible from outside of a cluster
labels:
 Kompose.service.expose: true
 Kompose.service.expose: "example.com"
'kompose.service.type' defines types of services to be created
labels:
Kompse.service.type: nodeport # or clusterip or loadbalancer

Kompose 1.0.0

The following sections discuss the support provided by Kompose 1.0.0 for Docker build and push as well as for Docker Compose Version 3.

Some Docker Compose files contain the 'build' key, which means that the Dockerfile file is in the code repository. When you do, 'docker-compose build' or 'docker-compose up', it is supposed to build the Docker image.

Earlier, the `build` supported only the OpenShift provider and ignored the Kubernetes provider. In the 1.0.0 release, Kompose supports building container images for both Kubernetes and OpenShift providers.

For example, in case our Docker compose file is:
   version: "3"
services:
   foo:
       build: "./build"
       image" docker.io/foo/bar

It would simply generate artifacts as follows (default value of '--build' flag is none):

 $ kompose convert
 INFO file "foo-service.yaml" created
 INFO file "foo-deployment.yaml created

Whereas in the case of OpenShift provider, buildconfig gets generated using the following command:

$ kompose convert --provider=openshift --build build-config
INFO Buildconfig using git@github.com:surajnarwade/Kompose.git::master as a source.
INFO file "foo-service.yaml" created
INFO file "foo-deploymentconfig.yaml" created
INFO file "foo-imagestream.yaml" created
INFO file "foo-buildconfig.yaml" created

When you run 'kompose up', the local building of images takes place and is pushed to the respective docker registry for which credentials are stored in the  '~/.docker/config.json' file in the user’s home directory. ('--build' flag is set to local)

You can deploy it as follows:

$ kompose up
INFO Build key detected. Attempting to build and push image 'docker.io/foo/bar'
INFO Building image 'docker.io/foo/bar' from directory 'build'
INFO Image 'docker.io./foo/bar' from directory 'build' built successfully
INFO Pushing image 'foo/bar:latest' to registry 'docker.io'
INFO Attempting authentication credentials 'https://index.docker.io/v1/
INFO Successfully pushed image 'foo/bar:latest' to registry 'docker.io'
INFO We are going to create Kubernetes Deployments, Services and PersistentVolumeClaims for your Dockerized application. If you need a different kind of resources, use the 'kompose convert' and 'kubectl create -f' commands instead.
INFO Deploying application in "default" namespace
INFO Successfully created Service: foo
INFO Successfully created Deployment: foo
Your application has been deployed to Kubernetes. You can run 'kubectl get deployment, svc, pods, pvc' for details.

In case you already have the required images, you need to disable building and pushing of the images using the '--build'parameter:

$ kompose up --build none

Docker Compose Version 3 support:

As of 1.0.0, we provide support to Docker Compose Version 3.

Here is a demonstration using our default example.(https://github.com/kubernetes/kompose/blob/master/examples/docker-compose-counter-v3.yaml)

version: "3"
services:
web:
 image: tuna/docker-counter23
 ports:
   - "5000:5000"
 deploy:
   restart_policy:
     condition: any
 labels:
   kompose.service.type: Nodeport
redis:
 image: redis:3.0
 deploy:
    replicas: 1
 ports:
   - "6379"

Here's the other stuff we've added including bug fixes and new keys such as 'replicas', 'restart_policy', etc.

Previously, we have to mention 'replicas' using '--replicas' flag, but now with Docker Compose version 3 support, we can mention replicas in Docker Compose file itself.

Give it a try :)


Download this Kubernetes cheat sheet for automating deployment, scaling and operations of application containers across clusters of hosts, providing container-centric infrastructure.

Last updated: September 3, 2019