Separating Unoconv as a kubernetes service

At CloudInn we had unoconv (depends on openoffice) in our backend so we coult convert our reports from ods to PDF or xlsx. That meant that we had to add other 400mb to our base image. Also, It meant longer time for deployments to finish. We were annoyed, we must do something about that.

I took the initiave to rip out unoconv from the base image, Picked one of the unoconv images on docker hub, then created a new namespace, deployment and service on Kubernetes for unocov with 3 replicas. Now our base image decreased from 800mb to 400mb good job 👍.

No the only thing left is to make our backend from test, staging, live to consume the new unoconv service from the new namespace. At first, I didn’t know how to make services from differnet namespaces to talk to each others, After some googling, the solution was easy.

for example let’s take the test namespace, and let’s assume that the new namespace we created for unoconv is dcs document-converter-service. create a new service inside test namespace. this service won’t have a selector, it will have ExternalName. Think of this service as an alias of the unoconv kubernetes service.

kind: Service   
apiVersion: v1   
metadata:     
    name: unoconv    
    namespace: test  
spec:  
    type: ExternalName
    externalName: unoconv.unoconv.svc.cluster.local 
    ports:   
        - port: 80

as you can see, the externalName here corresponds to the-unoconv-service.in-this-namespace.svc.c.. let’s say you want to alias service called elephant in the namespace zoo the externalName would be:

elephant.zoo.svc.cluster.local

now create the service using kubectl, assuming the file you created named unoconv-local-service.yml:

kubectl -n test create -f unoconv-local-service.yml

in the backend code you can make api calls to the service using unoconv.unoconv.cluster.local as the host, like this:

POST http://unoconv.unoconv.svc.cluster.local/unoconv/pdf

in order for the backend to be able to consume the new service, you have to re-deploy the backend, you can get the deployment name from kubectl -n test get deployments, assuming it’s called ‘backend’

kubectl -n test scale deployment backend --replicas=0
kubectl -n test scale deployment backend --replicas=1

That’s all Folks, Have Fun !