Doing a Canary deployment using Openshift is pretty much straight forward, where we can leverage Openshift’s Route feature to do routing to multiple different application versions.
Before we go far, we need to understand the difference between a Blue Green deployment, and Canary deployment. Basically in Blue Green deployment, we are having the same application but with 2 different version (blue and green version) and we can route all the request to either blue, or green version. So at Blue Green deployment, all the requests would go either to blue, or to green version.
But on Canary, it’s like Blue Green deployment but we can change the traffic percentage partially. For example 90percent of the traffic would go to blue version while 10percent go to green one.
For this demo, lets create two different apps. Both apps are using PHP, with a different content for simulating blue-green deployment.
First create our first PHP app,
$ mkdir php-hello-world-1
and create index.php file inside it
<?php echo "<h2>We are at version one</h2>"; echo "Hello world!<br>";
Build it and deploy into Openshift
$ oc new-build --name=php-app-01 --image-stream=php:7.4-ubi8 --binary=true $ oc start-build php-app-01 --from-dir=. $ oc new-app php-app-01 --name=php-app-01
Next is creating our second PHP app,
$ mkdir php-hello-world-2
With index.php inside it,
<?php echo "<h2>We are at version TWO</h2>"; echo "Hello world!<br>";
Build and deploy our second PHP app into Openshift
$ oc new-build --name=php-app-02 --image-stream=php:7.4-ubi8 --binary=true $ oc start-build php-app-02 --from-dir=. $ oc new-app php-app-02 --name=php-app-02
We can see the result on our Openshift dashboard

Now lets create a route,
$ oc create route edge --service php-app-01 php-app
And split the route traffic, 80 percent goes to app version 1, and 20 percent goes to app version 2.
$ oc set route-backends php-app php-app-01=80 php-app-02=20
And check the result on Openshift dashboard,

Now, lets do curl testing to see whether request to that corresponding route are being distibuted into 2 different application version,
$ for i in `seq 1 20`; do curl -k https://php-app-route-url ;echo ; done <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br>
And we can see that 4 out of 20 request are being served from the second PHP application. For more testing, lets change the distribution weight
oc set route-backends php-app php-app-01=50 php-app-02=50
And do more testing,
$ for i in `seq 1 20`; do curl -k https://php-app-route-url ;echo ; done <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br> <h2>We are at version one</h2>Hello world!<br> <h2>We are at version TWO</h2>Hello world!<br>
And there we can see that requests are being split, half goes to version 1 and the rest goes to version 2.