• Skip to secondary menu
  • Skip to main content
  • Skip to primary sidebar
  • Home
  • Projects
  • Products
  • Themes
  • Tools
  • Request for Quote

Vengala Vinay

Having 9+ Years of Experience in Software Development

  • Home
  • WordPress
  • PHP
    • Codeigniter
  • Django
  • Magento
  • Selenium
  • Server
Home » Zero-Downtime Blue-Green Deployment Pipelines for C++ Applications on Google Cloud

Zero-Downtime Blue-Green Deployment Pipelines for C++ Applications on Google Cloud

Establishing the Blue-Green Infrastructure on Google Cloud

A zero-downtime blue-green deployment strategy hinges on maintaining two identical production environments: “Blue” (the current live version) and “Green” (the new version under deployment). Traffic is initially directed to Blue. Once Green is fully deployed, tested, and validated, traffic is switched from Blue to Green. This allows for instant rollback by simply re-routing traffic back to Blue if any issues arise in Green.

On Google Cloud Platform (GCP), this can be effectively implemented using Google Kubernetes Engine (GKE) and a robust load balancing solution. We’ll leverage GKE’s ability to run multiple isolated deployments and Google Cloud Load Balancing for intelligent traffic management.

GKE Cluster Setup

First, ensure you have a GKE cluster provisioned. For production, consider using a regional cluster for high availability. We’ll need two distinct Kubernetes Deployments and Services, one for each environment (Blue and Green).

Let’s define our Kubernetes manifests. We’ll use a simple C++ application containerized with Docker. Assume your C++ application is compiled into an executable named my_cpp_app and you have a Dockerfile like this:

Dockerfile Example:

# Example Dockerfile for a C++ application
FROM ubuntu:22.04 AS builder
WORKDIR /app
COPY . .
RUN apt-get update && apt-get install -y build-essential && \
    g++ -o my_cpp_app main.cpp && \
    rm -rf /var/lib/apt/lists/*

FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/my_cpp_app /app/my_cpp_app
EXPOSE 8080
CMD ["/app/my_cpp_app"]

After building and pushing your Docker image (e.g., gcr.io/your-project-id/my_cpp_app:v1.0.0), we can define the Kubernetes resources.

Kubernetes Manifests for Blue and Green Deployments

We’ll create two sets of Deployments and Services. The key is to use distinct labels for each environment. For simplicity, we’ll use app.kubernetes.io/version: blue and app.kubernetes.io/version: green as labels. The selector for our Ingress or LoadBalancer will target a common label, say app.kubernetes.io/name: my_cpp_app.

blue-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-cpp-app-blue
  labels:
    app.kubernetes.io/name: my_cpp_app
    app.kubernetes.io/version: blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: my_cpp_app
      app.kubernetes.io/version: blue
  template:
    metadata:
      labels:
        app.kubernetes.io/name: my_cpp_app
        app.kubernetes.io/version: blue
    spec:
      containers:
      - name: my-cpp-app
        image: gcr.io/your-project-id/my_cpp_app:v1.0.0 # Replace with your image
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: my-cpp-app-blue-service
  labels:
    app.kubernetes.io/name: my_cpp_app
    app.kubernetes.io/version: blue
spec:
  selector:
    app.kubernetes.io/name: my_cpp_app
    app.kubernetes.io/version: blue
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP

green-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-cpp-app-green
  labels:
    app.kubernetes.io/name: my_cpp_app
    app.kubernetes.io/version: green
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: my_cpp_app
      app.kubernetes.io/version: green
  template:
    metadata:
      labels:
        app.kubernetes.io/name: my_cpp_app
        app.kubernetes.io/version: green
    spec:
      containers:
      - name: my-cpp-app
        image: gcr.io/your-project-id/my_cpp_app:v1.0.1 # Replace with your new image
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: my-cpp-app-green-service
  labels:
    app.kubernetes.io/name: my_cpp_app
    app.kubernetes.io/version: green
spec:
  selector:
    app.kubernetes.io/name: my_cpp_app
    app.kubernetes.io/version: green
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP

Apply these manifests to your GKE cluster:

kubectl apply -f blue-deployment.yaml
kubectl apply -f green-deployment.yaml

Implementing Traffic Shifting with Google Cloud Load Balancer

The core of zero-downtime deployment lies in how traffic is managed. We’ll use a GCP Network Load Balancer (NLB) or an HTTP(S) Load Balancer configured to route traffic based on Kubernetes Services. For true blue-green, we need a mechanism to switch traffic between the Blue and Green services. This is often achieved by updating the backend service of a load balancer.

Option 1: Using a Single Kubernetes Service and Updating its Selector (Simpler, but less granular control)

A common pattern is to have a single Kubernetes Service that acts as the entry point, and then dynamically update its selector to point to either the Blue or Green deployment’s pods. This requires careful management of the Service definition.

Initial Setup (pointing to Blue):

apiVersion: v1
kind: Service
metadata:
  name: my-cpp-app-ingress
  labels:
    app.kubernetes.io/name: my_cpp_app
spec:
  selector:
    app.kubernetes.io/name: my_cpp_app
    app.kubernetes.io/version: blue # Initially points to Blue
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: LoadBalancer # This will provision a GCP Load Balancer

Apply this service. GCP will provision a Load Balancer with an external IP. All traffic will now hit pods labeled with app.kubernetes.io/name: my_cpp_app AND app.kubernetes.io/version: blue.

Deployment to Green:

  1. Deploy the new version of your C++ application as the “Green” deployment (as shown in green-deployment.yaml). Ensure its pods have the label app.kubernetes.io/version: green.
  2. Perform health checks and integration tests against the Green deployment (you can access it via its ClusterIP service or by temporarily exposing it).
  3. Once confident, update the my-cpp-app-ingress Service’s selector to point to Green:
kubectl patch service my-cpp-app-ingress -p '{"spec":{"selector":{"app.kubernetes.io/name": "my_cpp_app", "app.kubernetes.io/version": "green"}}}'

The GCP Load Balancer will automatically update its backend to route traffic to the Green pods. The old Blue pods will continue to serve existing connections for a short period until they naturally expire or are terminated.

Rollback: If issues are detected in Green, simply patch the service selector back to Blue:

kubectl patch service my-cpp-app-ingress -p '{"spec":{"selector":{"app.kubernetes.io/name": "my_cpp_app", "app.kubernetes.io/version": "blue"}}}'

Option 2: Using GCP HTTP(S) Load Balancer with GKE Ingress and BackendConfig (More advanced, better control)

For more sophisticated traffic management, including weighted routing (for canary deployments) and more robust health checks, using GKE Ingress with the GCP HTTP(S) Load Balancer is recommended. This involves defining an Ingress resource and potentially a BackendConfig custom resource.

First, ensure the GKE Ingress controller is enabled in your cluster. Then, define your Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-cpp-app-ingress
  annotations:
    kubernetes.io/ingress.class: "gce"
    # Optional: For HTTPS, configure TLS
    # networking.gke.io/managed-certificates: my-managed-cert
spec:
  rules:
  - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: my-cpp-app-blue-service # Initially points to Blue Service
            port:
              number: 80
      # Add another path for Green, initially unused or for testing
      # - path: /green-test
      #   pathType: Prefix
      #   backend:
      #     service:
      #       name: my-cpp-app-green-service
      #       port:
      #         number: 80

Apply this Ingress. GCP will provision an HTTP(S) Load Balancer. The Ingress resource defines which Kubernetes Service the load balancer’s backend points to.

Deployment to Green:

  1. Deploy the Green version and its associated Service (my-cpp-app-green-service).
  2. Perform validation on the Green deployment.
  3. Update the Ingress resource to switch the backend service from my-cpp-app-blue-service to my-cpp-app-green-service.
kubectl patch ingress my-cpp-app-ingress --type='json' -p='[{"op": "replace", "path": "/spec/rules/0/http/paths/0/backend/service/name", "value": "my-cpp-app-green-service"}]'

This operation updates the GCP Load Balancer’s backend configuration. The switch is near-instantaneous. Existing connections to Blue will drain gracefully.

Rollback: If issues arise, revert the Ingress change:

kubectl patch ingress my-cpp-app-ingress --type='json' -p='[{"op": "replace", "path": "/spec/rules/0/http/paths/0/backend/service/name", "value": "my-cpp-app-blue-service"}]'

Health Checks and Readiness Probes

Crucially, both your C++ application and Kubernetes Deployments must be configured with robust health checks and readiness probes. This ensures that the load balancer only sends traffic to healthy instances of your application and that Kubernetes doesn’t prematurely terminate pods during updates.

For a C++ application, you might expose a simple HTTP endpoint (e.g., /healthz) that returns a 200 OK status if the application is healthy. This endpoint should check critical dependencies like database connections or internal service availability.

Kubernetes Deployment with Probes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-cpp-app-blue
  labels:
    app.kubernetes.io/name: my_cpp_app
    app.kubernetes.io/version: blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: my_cpp_app
      app.kubernetes.io/version: blue
  template:
    metadata:
      labels:
        app.kubernetes.io/name: my_cpp_app
        app.kubernetes.io/version: blue
    spec:
      containers:
      - name: my-cpp-app
        image: gcr.io/your-project-id/my_cpp_app:v1.0.0
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /healthz # Your C++ app's health endpoint
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 20
        readinessProbe:
          httpGet:
            path: /healthz # Your C++ app's health endpoint
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10

The livenessProbe tells Kubernetes when to restart a container. The readinessProbe tells Kubernetes when a container is ready to serve traffic. The GCP Load Balancer also performs its own health checks, which can be configured via the BackendConfig resource when using GKE Ingress.

Automating the Pipeline

To fully realize continuous deployment, these steps must be automated within a CI/CD pipeline. Tools like Cloud Build, Jenkins, GitLab CI, or GitHub Actions can orchestrate this process.

A typical pipeline flow would be:

  • Build: Compile C++ application, run unit tests.
  • Dockerize: Build Docker image, tag with a unique version (e.g., Git commit SHA).
  • Push: Push Docker image to a registry (e.g., GCR, Artifact Registry).
  • Deploy Blue (Initial): Apply the Blue deployment manifest.
  • Deploy Green: Apply the Green deployment manifest with the new image.
  • Test Green: Run integration, end-to-end, and smoke tests against the Green environment (potentially via a temporary ingress or by querying its ClusterIP).
  • Traffic Shift: Update the Ingress or Service selector to point to Green.
  • Monitor: Observe application metrics, logs, and error rates.
  • Rollback (if necessary): If anomalies are detected, revert the traffic shift.
  • Cleanup (Optional): Once Green is stable, the Blue deployment can be scaled down or removed.

For example, a Cloud Build step to update the Ingress might look like this (using kubectl):

steps:
- name: 'gcr.io/cloud-builders/kubectl'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    kubectl patch ingress my-cpp-app-ingress --type='json' -p='[{"op": "replace", "path": "/spec/rules/0/http/paths/0/backend/service/name", "value": "my-cpp-app-green-service"}]'
    echo "Traffic shifted to Green."

This automated approach ensures consistency and reduces the risk of human error during critical deployment phases, enabling true zero-downtime deployments for your C++ applications on GCP.

Primary Sidebar

A little about the Author

Having 9+ Years of Experience in Software Development.
Expertised in Php Development, WordPress Custom Theme Development (From scratch using underscores or Genesis Framework or using any blank theme or Premium Theme), Custom Plugin Development. Hands on Experience on 3rd Party Php Extension like Chilkat, nSoftware.

Recent Posts

  • Step-by-Step: Diagnosing thread pools deadlock during concurrent ActiveRecord transaction processing on Linode Servers
  • Securing Your E-commerce APIs: Preventing SQL Injection (SQLi) in customized checkout queries in WooCommerce Implementations
  • Disaster Recovery 101: Architecting Auto-Failovers for MySQL and Ruby Deployments on Linode
  • High-Throughput Caching Strategies: Scaling MySQL for Perl Application APIs
  • Disaster Recovery 101: Architecting Auto-Failovers for DynamoDB and Laravel Deployments on DigitalOcean

Copyright © 2026 · Vinay Vengala