Adventures with IBM Kubernetes - Part 2
Background
This is a continuation of a previous post! In the previous blog post I wrote about deploying a Flask app using Docker and IBM Cloud’s Kubernetes service. In this post I’ll write about updating that deployment.
The gist of what I want to accomplish is:
- Rebuild the Docker image
- Tag a new image version
- Push it to the IBM Container Registry
- Update the Kubernetes workers
Pushing a new version
Rebuild the docker image and push to container registry
Much like in the previous blog post, rebuilding, tagging, and pushing the image can be done in a few commands:
docker build -t validator:latest .
ibmcloud cr login
docker tag validator registry.ng.bluemix.net/aida/validator
docker push registry.ng.bluemix.net/aida/validator
Find workers
Now let’s update our workers, first we have to find the workers associated with the cluster, run the ibmcloud ks workers
command to see the two IDs for my workers: kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w1
and kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w2
.
ibmcloud ks workers --cluster validator-beta
ID Public IP Private IP Machine Type State Status Zone Version
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w1 169.xx.yy.116 10.177.184.133 u2c.2x4.encrypted normal Ready dal10 1.10.12_1543*
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w2 169.xx.yy.241 10.177.184.141 u2c.2x4.encrypted normal Ready dal10 1.10.12_1543*
Update the workers
To update the workers, run the ibmcloud ks worker-update
command while passing in your cluster name and the workers you want to update.
the
-f
option is to bypass the user prompt
ibmcloud ks worker-update -f --cluster validator-beta --workers kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w1,kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w2
Viewing the workers while updating
I figured I would add this piece as I found it interesting. You can view the State
columns change as the worker update is being performed. State
is changed from normal
to reload_pending
to reloading
and finally back to normal
, one worker at a time.
Before the update
ibmcloud ks workers --cluster validator-beta
ID Public IP Private IP Machine Type State Status Zone Version
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w1 169.xx.yy.116 10.177.184.133 u2c.2x4.encrypted normal Ready dal10 1.10.12_1543*
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w2 169.xx.yy.241 10.177.184.141 u2c.2x4.encrypted normal Ready dal10 1.10.12_1543*
During the update
$ ibmcloud ks workers --cluster validator-beta
OK
ID Public IP Private IP Machine Type State Status Zone Version
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w1 169.xx.yy.116 10.177.184.133 u2c.2x4.encrypted reload_pending - dal10 1.10.12_1543 --> 1.10.12_1544 (pending)
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w2 169.xx.yy.241 10.177.184.141 u2c.2x4.encrypted normal Ready dal10 1.10.12_1543 --> 1.10.12_1544 (pending)
$ ibmcloud ks workers --cluster validator-beta
OK
ID Public IP Private IP Machine Type State Status Zone Version
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w1 169.xx.yy.116 10.177.184.133 u2c.2x4.encrypted reloading - dal10 1.10.12_1543 --> 1.10.12_1544 (pending)
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w2 169.xx.yy.241 10.177.184.141 u2c.2x4.encrypted normal Ready dal10 1.10.12_1543 --> 1.10.12_1544 (pending)
$ ibmcloud ks workers --cluster validator-beta
OK
ID Public IP Private IP Machine Type State Status Zone Version
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w1 169.xx.yy.116 10.177.184.133 u2c.2x4.encrypted normal Ready dal10 1.10.12_1544
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w2 169.xx.yy.241 10.177.184.141 u2c.2x4.encrypted reloading - dal10 1.10.12_1543 --> 1.10.12_1544 (pending)
After the update
$ ibmcloud ks workers --cluster validator-beta
OK
ID Public IP Private IP Machine Type State Status Zone Version
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w1 169.xx.yy.116 10.177.184.133 u2c.2x4.encrypted normal Ready dal10 1.10.12_1544
kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w2 169.xx.yy.241 10.177.184.141 u2c.2x4.encrypted normal Ready dal10 1.10.12_1544
Make it copy-pasta friendly
I’ve now gotten into the habbit of dumping the following into a terminal whenever I want a new version of the app online:
git pull origin master
docker build -t validator:latest .
docker tag validator registry.ng.bluemix.net/aida/validator
docker push registry.ng.bluemix.net/aida/validator
ibmcloud ks worker-update -f --cluster validator-beta --workers kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w1,kube-dal10-cre853b87cc0d44926975ee5a41044b1e8-w2
Thoughts
This is definitely not production worthy but fine for an internal tool. I’m hoping to write up about the following as I solve these problems in the near future:
- Pushing a new image on every commit (presently can’t do this because the code is in Enterprise Github).
- Figure out how to host this on a proper URL instead of an IP address.
- Read up on how to tag image versions.
Overall, pretty positive experience with Kubernetes and IBM Cloud’s Kubernetes Service.