Redeploying a Google Container Controller when the repository Image Changes

6/25/2016

Is there any way for me to replicate the behavior I get on cloud.docker where a service can be redeployed either manually with the latest image or automatically when the repository image is updated?

Right now I'm doing something like this manually in a shell script with my controller and service files:

kubectl delete -f ./ticketing-controller.yaml || true
kubectl delete -f ./ticketing-service.yaml || true
kubectl create -f ./ticketing-controller.yaml
kubectl create -f ./ticketing-service.yaml

Even that seems a bit heavy handed, but works fine. I'm really missing the autoredeploy feature I have on cloud.docker.

-- Robert Moskal
kubernetes

2 Answers

6/27/2016

According to Kubernetes documentation:

Let’s say you were running version 1.7.9 of nginx:

$ kubectl run my-nginx --image=nginx:1.7.9 --replicas=3
deployment "my-nginx" created

To update to version 1.9.1, simply change .spec.template.spec.containers[0].image from nginx:1.7.9 to nginx:1.9.1, with the kubectl commands.

$ kubectl edit deployment/my-nginx

That’s it! The Deployment will declaratively update the deployed nginx application progressively behind the scene. It ensures that only a certain number of old replicas may be down while they are being updated, and only a certain number of new replicas may be created above the desired number of pods.

-- Petr Shevtsov
Source: StackOverflow

6/29/2016

Deleting the controller yaml file itself won't delete the actual controller in kubernetes unless you have a special configuration to do so. If you have more than 1 instance running, deleting the controller probably isn't what you would want because it would delete all the instances of your running application. What you really want to do is perform a rolling update of your application that incrementally replaces containers running the old image with containers running the new one.

You can do this manually by:

  1. For a Deployment controller update the yaml file image and execute kubectl apply.
  2. For a ReplicationController update the yaml file and execute kubectl rollingupdate. See: http://kubernetes.io/docs/user-guide/rolling-updates/
  3. With v1.3 you will be able to use kubectl set image

Alternatively you could use a PaaS to automatically push the image when it is updated in the repo. Here is an incomplete list of a few Paas options:

  • Red Hat OpenShift
  • Spinnaker
  • Deis Workflow
-- pwittrock
Source: StackOverflow