In this blog post, we’ll replicate the simple API Builder + MongoDB multi-container application described in the Create an API Builder Multi-Container Application Using Docker – Part 1 blog post. But this time, we’ll deploy to Kubernetes using minikube on our machine.
In this Part 1 of the series, we’ll make sure that kubectl and minikube are installed and working and then we’ll launch an API Builder Docker image using kubectl commands and then make API calls to API Builder.
In Part 2, we’ll add a local MongoDB container and connect the two. And, we’ll do this with deployment YAML files to automate the process.
Pre-requisites
Make sure kubectl and minikube are installed, running and working on your machine.
You can follow the instructions here to make sure minikube and kubectl are installed and working properly.
The commands are:
minikube start
kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port=8080
kubectl expose deployment hello-minikube --type=NodePort
kubectl get pod
curl $(minikube service hello-minikube --url)
kubectl delete deployment hello-minikube
The response should be:
CLIENT VALUES: client_address=172.17.0.1 command=GET real path=/ query=nil request_version=1.1 request_uri=http://192.168.99.100:8080/
SERVER VALUES: server_version=nginx: 1.10.0 – lua: 10001
HEADERS RECEIVED: accept=/ host=192.168.99.100:30073 user-agent=curl/7.43.0
BODY: -no body in request-
MongoDB Database
Make sure you have a MongoDB database with a collection with data in it. We’ll need the MongoDB connection URL. If you don’t have access to a MongoDB database, then head on over to MongoDB Atlas and create one so we don’t have to worry running MongoDB locally. We’ll run MongoDB locally in Part 2.
My MongoDB Atlas URL looks like the following:
mongodb://{username}:{password}@cluster0-shard-00-00-merks.mongodb.net:27017,cluster0-shard-00-01-merks.mongodb.net:27017,cluster0-shard-00-02-merks.mongodb.net:27017/test01?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true
My database is called test01.
Run your API Builder MongoDB Project
Use the following kubectl command from terminal to run your API Builder project in Minikube (Kubernetes).
kubectl run apibmongo --image=lbrenman/apibmongodb:1.0.1 --port=8080 --env="MONGO_URL=mongodb://{username}:{password}@cluster0-shard-00-00-merks.mongodb.net:27017,cluster0-shard-00-01-merks.mongodb.net:27017,cluster0-shard-00-02-merks.mongodb.net:27017/test01?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true"
From the command above, you can see the following:
* My deployment is called apimongo
* I am using my docker image from docker hub: lbrenman/apibmongodb:1.0.1
* I am exposing port 8080, which is the default port API Builder will listen for API calls on
* I am passing in the MongoDB URL I retrieved from the MongoDB Atlas portal
The response should be:
deployment.apps/apibmongo created
Check Your API Builder Pod
kubectl get pods
The response should be:
NAME READY STATUS RESTARTS AGE
apibmongo-58ff6b6d67-l5npp 1/1 Running 0 50s
Check API Builder Logs
Let’s make sure the API Builder app is running properly and did not have any connectivity issues to your MongoDB instance as follows:
kubectl logs apibmongo-58ff6b6d67-l5npp
The response should be:
1551407745961 configuration applied in this order: /app/conf/default.js,/app/conf/mongo.default.js
1551407746811 API Builder/Kobe (4.5.8) apibmongodb/1.0.0
1551407746811 APIKey is: 3wEwROK+ZEyt4pr5k9lA5NQE9te8dG7p
1551407747326 No APIKey or APIKeyAuthPlugin set in your config. Your server has no authentication strategy.
1551407747329 Registering upgrade handler for flow
1551407747337 waiting on server to finish loading
1551407748280 Registered plugin: @axway/api-builder-plugin-dc-mongo
1551407748281 Registered plugin: @axway/api-builder-plugin-fn-base64
1551407748281 Registered plugin: @axway/api-builder-plugin-fn-dot
1551407748281 Registered plugin: @axway/api-builder-plugin-fn-json
1551407748281 Registered plugin: @axway/api-builder-plugin-fn-restclient
1551407748281 Registered plugin: @axway/api-builder-plugin-fn-swagger
1551407748500 Starting connector/mongo@1.1.3
(node:1) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
1551407759341 Started connector/mongo
1551407759346 attempting to load model /app/models/dog.js
1551407759360 starting 8080
1551407759360 server is starting!
1551407759384 port 8080 available for use
1551407759384 loading schemas
1551407759385 loading 8 schema
...
...
...
1551407759485 binding api (delete) /api/dog/:id [model] sort:-2
1551407759486 binding api (get) /api/dog/:id [model] sort:-2
1551407759486 binding api (put) /api/dog/:id [model] sort:-2
1551407759487 binding api (delete) /api/mongo/dog/:id [model] sort:-2
1551407759488 binding api (put) /api/mongo/dog/:id [model] sort:-2
1551407759488 binding api (get) /api/mongo/dog/:id [model] sort:-2
1551407759489 binding api (get) /api/dog/distinct/:field [model] sort:-2
1551407759491 binding api (get) /api/mongo/dog/distinct/:field [model] sort:-2
1551407759493 Access the swagger API documentation at http://localhost:8080/apidoc/swagger.json
1551407759497 server started!
1551407759497 server started on port 8080
Expose API Builder Deployment
In order to access the API Builder container, we need to expose its URL as follows:
kubectl expose deployment apibmongo --type=NodePort
The response should be:
service/apibmongo exposed
Get URL
Retrieve the URL as follows:
minikube service apibmongo --url
The response should be:
http://192.168.99.100:32355
Call Your API
Test your API using Postman or Curl as follows:
curl http://192.168.99.100:32355/api/mongo/dog
The response should be:
{
"success": true,
"request-id": "44047fcb-c395-4b58-a824-090476e134f8",
"key": "dogs",
"dogs": [
{
"id": "5a24a9a67779e860d007b13e",
"breed": "Poodle",
"name": "Fido"
},
.
.
.
{
"id": "5b3aafcb9de9003840480fe7",
"breed": "Doberman",
"name": "Doobie"
}
]
}
Common Commands
Try the following commands to learn more about your deployment:
kubectl get services
kubectl get deployments
kubectl describe deployment apibmongo
Teardown
When you are done, you can tear down your application using the following:
kubectl delete deployment apibmongo
kubectl delete service apibmongo
kubectl delete hpa apibmongo
Conclusion
In this blog post, we used kubectl and minikube to deploy an API Builder docker image to Kubernetes and learned some common kubectl commands.
In the next blog post, we’ll switch to using deployment YAML files to help automate our deployment and we’ll add a local MongoDB container to our app.
Follow us on social