Sign inSign up

codefresh/k8s-blue-green

By codefresh

•Updated over 7 years ago

Docker image for Codefresh Pipeline Step to Execute Blue/Green Deployment

Image
0

2.3K

codefresh/k8s-blue-green repository overview

⁠Kubernetes blue green deployments

This repository holds a bash script that allows you to perform blue/green deployments on a Kubernetes cluster. See also the respective blog post⁠

⁠Description

The script expects you to have an existing deployment and service on your K8s cluster. It does the following:

  1. Finds the current deployment (by looking at the selector of the service)
  2. Copies the old deployment to a new one changing the Docker image to the new version
  3. Applies the new deployment on the cluster. At this point both deployments co-exist
  4. Waits for a configurable amount of seconds
  5. Checks the health of the new pods. If there are restarts, it considers the new deployment unhealthy. In that case it removes it and the cluster is unaffected by the deployment
  6. If the health is ok it swiches the service to point to the new deployment
  7. It removes the old deployment

Of course during the wait period when both deployments are active, you are free to run your own additional checks or integration tests to see if the new deployment is ok.

⁠How to use the script on its own

The script needs one environment variable called KUBE_CONTEXT that selects the K8s cluster that will be used (if you have more than one)

The rest of the parameters are provided as command line arguments

ParameterArgument NumberDescription
Service1Name of the existing service
Deployment2Name of the existing deployment
New version3Tag of the new docker image
Health command4Currently unused
Health seconds5Time where both deployments will co-exist
Namespace6Kubernetes namespace that will be used

Here is an example:

./k8s-blue-green.sh myService myApp 73df943 true 30 my-namespace

In order for the script to work, your service and deployment should have a version label that is used as a selector. This is what the script is using to detect the current version and in order to deploy the next one.

You can see examples of the tags with the sample application:

⁠How to do Blue/Green deployments in Codefresh

The script also comes with a Dockerfile that allows you to use it as a Docker image in any Docker based workflow such as Codefresh.

For the KUBE_CONTEXT environment variable just use the name of your cluster as found in the Codefresh Kubernetes dashboard. For the rest of the arguments you need to define them as parameters in your codefresh.yml⁠ file.

  blueGreenDeploy:
    title: "Deploying new version ${{CF_SHORT_REVISION}}"
    image: codefresh/k8s-blue-green:master
    environment:
      - SERVICE_NAME=trivial
      - DEPLOYMENT_NAME=trivial
      - NEW_VERSION=${{CF_SHORT_REVISION}}
      - HEALTH_SECONDS=30
      - NAMESPACE=colors
      - KUBE_CONTEXT=myDemoAKSCluster

The CF_SHORT_REVISION variable is offered by Codefresh and contains the git hash of the version that was just pushed. See all variables in the official documentation⁠

⁠Dockerhub

The blue/green step is now deployed in dockerhub as well

https://hub.docker.com/r/codefresh/k8s-blue-green/⁠

⁠Future work

Further improvements

  • Make the script create an initial deployment/service if nothing is deployed in the kubernetes cluster
  • Add more complex and configurable healthchecks

Tag summary

Content type

Image

Digest

Size

56.1 MB

Last updated

over 7 years ago

docker pull codefresh/k8s-blue-green:master