How to implement Canary deployment in kubernetes with different versions specified in deployment

5/15/2018

I have two deployment files 1. deployment-1.yaml apiVersion: apps/v1 kind: Deployment metadata: name: process labels: app: process spec: replicas: 3 selector: matchLabels: app: process template: metadata: labels: app: process version: v1 spec: containers: - name: pull image: parma/k8s-php:red ports: - containerPort: 80

2. deployment-2.yaml apiVersion: apps/v1 kind: Deployment metadata: name: process labels: app: process spec: replicas: 3 selector: matchLabels: app: process template: metadata: labels: app: process version: v2 spec: containers: - name: pull image: parma/k8s-php:green ports: - containerPort: 80

As i have specified two different versions in spec.template.metadata, it does not keep running 6 pods for both replica set, it only enables latest replicaset up and running.

Is there any way to achieve canary deployment by keeping both the replicaset in single deployment up and running with 3 pods from v1 and 3 pods from v2

-- Paramanand Dhuri
canary-deployment
deployment
kubernetes
replicaset

2 Answers

5/15/2019

The name of what you want to implement is Canary Deployment. It is a great feature for A / B testing and assists in continuous delivery and production testing, it does not have to be in the same deploy the secret this in the load balancer and at the gateway. There are options in the market for this (Spring Zuul or Istio Envoy) that can provide a solution that filters content from one deploy to a certain percentage and the other to the rest ...

-- Rogério Ferreira
Source: StackOverflow

5/15/2018
  1. You can't have multiple deployments with the same name. Rename them to process-v1 and process-v2.
  2. You need to have different selectors for each of them. First one should have matchLabels: {app: process, version: v1}, the second one matchLabels: {app: process, version: v2}.

So technically that will be two completely separate deployments. What makes them "baseline" and "canary" is how you send traffic to them. If you specify common selector (just {app: process}) in your service, then both of the deployments will see a fraction of traffic.

-- Alexandr Lurye
Source: StackOverflow