• 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

Understanding the Blue-Green Deployment Pattern

The blue-green deployment strategy is a technique for releasing software with minimal downtime and risk. It involves maintaining two identical production environments, referred to as “Blue” and “Green.” At any given time, one environment (e.g., Blue) is running the current live version of the application, while the other (Green) is idle. To deploy a new version, we provision the Green environment with the new code. Once tested and validated, traffic is switched from Blue to Green. The Blue environment is then kept on standby for a rollback if necessary, or it can be updated to the new version for the next deployment cycle.

Leveraging Google Cloud for Blue-Green Deployments

Google Cloud Platform (GCP) offers a robust set of services that are well-suited for implementing blue-green deployments, particularly for C applications. We’ll focus on using Google Kubernetes Engine (GKE) for container orchestration, Cloud Load Balancing for traffic management, and Cloud Build for CI/CD automation. This approach ensures that our C applications, often performance-critical and requiring precise control, can be deployed without interrupting service.

Prerequisites and Setup

Before diving into the deployment pipeline, ensure you have the following in place:

  • A GCP project with billing enabled.
  • The gcloud command-line tool installed and authenticated.
  • Docker installed locally for building container images.
  • A C application source code repository (e.g., on Cloud Source Repositories, GitHub, GitLab).
  • A Dockerfile to containerize your C application.

Containerizing the C Application

A typical Dockerfile for a C application might look like this. This example assumes a simple C executable that listens on a port.

# Use a minimal base image
FROM debian:bullseye-slim AS builder

# Install build essentials
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    cmake \
    && rm -rf /var/lib/apt/lists/*

# Set working directory
WORKDIR /app

# Copy source code
COPY . /app

# Build the application
RUN cmake . && make

# --- Production Stage ---
FROM debian:bullseye-slim

# Install runtime dependencies if any (e.g., libc, openssl)
# RUN apt-get update && apt-get install -y --no-install-recommends \
#     ... \
#     && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Copy the compiled binary from the builder stage
COPY --from=builder /app/your_c_app /app/your_c_app

# Expose the port your application listens on
EXPOSE 8080

# Command to run the application
CMD ["/app/your_c_app"]

Setting Up Google Kubernetes Engine (GKE)

We’ll deploy our application to a GKE cluster. For blue-green, we’ll manage two distinct deployments within the same cluster, differentiated by labels, and use a single LoadBalancer service that points to the currently active deployment.

Creating a GKE Cluster

Create a GKE cluster. It’s recommended to use a regional cluster for high availability.

gcloud container clusters create blue-green-cluster \
    --region=us-central1 \
    --num-nodes=2 \
    --enable-autoscaling --min-nodes=1 --max-nodes=5 \
    --release-channel=regular \
    --project=YOUR_GCP_PROJECT_ID

Kubernetes Manifests for Blue-Green

We need Kubernetes manifests to define our deployments and services. The key to blue-green here is using a single Kubernetes Service that targets pods based on labels, and then updating the deployment’s labels to switch traffic.

Deployment Manifests (Blue and Green)

We’ll create two deployment resources, one for the ‘blue’ version and one for the ‘green’ version. They will differ only in their image tag and a distinguishing label.

# deployment-blue.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-c-app-blue
  labels:
    app: my-c-app
    version: v1.0.0 # Specific version label
    environment: blue # Environment label
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-c-app
      environment: blue # Selector matches the environment label
  template:
    metadata:
      labels:
        app: my-c-app
        environment: blue # Pods get the environment label
    spec:
      containers:
      - name: my-c-app
        image: gcr.io/YOUR_GCP_PROJECT_ID/my-c-app:v1.0.0 # Replace with your image
        ports:
        - containerPort: 8080
---
# deployment-green.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-c-app-green
  labels:
    app: my-c-app
    version: v1.0.1 # New version label
    environment: green # Environment label
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-c-app
      environment: green # Selector matches the environment label
  template:
    metadata:
      labels:
        app: my-c-app
        environment: green # Pods get the environment label
    spec:
      containers:
      - name: my-c-app
        image: gcr.io/YOUR_GCP_PROJECT_ID/my-c-app:v1.0.1 # Replace with your new image
        ports:
        - containerPort: 8080

Service Manifest

A single Kubernetes Service will be used to route traffic. It will select pods based on a common label (app: my-c-app) and a specific active environment label. We’ll manage which environment is active via an annotation or by dynamically updating the selector.

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-c-app-service
  annotations:
    # This annotation is key for GKE to provision a Google Cloud Load Balancer
    cloud.google.com/load-balancer-type: "External"
spec:
  selector:
    app: my-c-app
    # The 'environment' label will be dynamically managed to point to either 'blue' or 'green'
    environment: blue # Initially points to blue
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: LoadBalancer

Applying the Manifests

Apply the initial blue deployment and the service. The green deployment will be created later during the deployment process.

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

After applying the service, obtain the external IP address. This might take a few minutes.

kubectl get service my-c-app-service
# Wait until EXTERNAL-IP is assigned

Automating Deployments with Cloud Build

Cloud Build is GCP’s CI/CD service. We’ll configure a build trigger to automate the process of building a new Docker image, pushing it to Container Registry, and then updating the Kubernetes deployment.

Cloud Build Configuration File

Create a cloudbuild.yaml file in the root of your repository.

steps:
# 1. Build the Docker image
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/my-c-app:$COMMIT_SHA', '.']
  id: 'Build Image'

# 2. Push the Docker image to Google Container Registry
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/my-c-app:$COMMIT_SHA']
  id: 'Push Image'
  waitFor: ['Build Image']

# 3. Deploy the new version to the 'green' environment
# This step assumes you have a deployment-green.yaml template
# and you're using kustomize or sed to update the image tag.
# For simplicity, we'll use kubectl set image.
- name: 'gcr.io/cloud-builders/kubectl'
  args:
  - 'set'
  - 'image'
  - 'deployment/my-c-app-green'
  - 'my-c-app=gcr.io/$PROJECT_ID/my-c-app:$COMMIT_SHA'
  - '--namespace=default' # Or your specific namespace
  env:
  - 'CLOUDSDK_COMPUTE_ZONE=us-central1-a' # Or your cluster zone
  - 'CLOUDSDK_CONTAINER_CLUSTER=blue-green-cluster' # Your cluster name
  id: 'Deploy Green'
  waitFor: ['Push Image']

# 4. Wait for the green deployment to be ready (optional but recommended)
# This can be a simple sleep or a more sophisticated check.
# For a robust solution, consider a custom script or a Kubernetes Job.
- name: 'gcr.io/cloud-builders/kubectl'
  args: ['wait', '--for=condition=available', 'deployment/my-c-app-green', '--timeout=300s']
  env:
  - 'CLOUDSDK_COMPUTE_ZONE=us-central1-a'
  - 'CLOUDSDK_CONTAINER_CLUSTER=blue-green-cluster'
  id: 'Wait for Green'
  waitFor: ['Deploy Green']

# 5. Switch traffic from Blue to Green
# This involves updating the Service selector.
# We'll use kubectl patch to update the service's selector.
- name: 'gcr.io/cloud-builders/kubectl'
  args:
  - 'patch'
  - 'service'
  - 'my-c-app-service'
  - '--namespace=default'
  - '--type=strategic'
  - '--patch={"spec":{"selector":{"app":"my-c-app","environment":"green"}}}'
  env:
  - 'CLOUDSDK_COMPUTE_ZONE=us-central1-a'
  - 'CLOUDSDK_CONTAINER_CLUSTER=blue-green-cluster'
  id: 'Switch Traffic'
  waitFor: ['Wait for Green']

# 6. (Optional) Update the 'blue' deployment to the new version for future rollback readiness
# This step is for preparing the 'blue' environment for the *next* deployment.
# If you want to keep 'blue' on the old version for immediate rollback, skip this.
# For this example, we'll assume we want to update blue to the new version after traffic switch.
- name: 'gcr.io/cloud-builders/kubectl'
  args:
  - 'set'
  - 'image'
  - 'deployment/my-c-app-blue'
  - 'my-c-app=gcr.io/$PROJECT_ID/my-c-app:$COMMIT_SHA'
  - '--namespace=default'
  env:
  - 'CLOUDSDK_COMPUTE_ZONE=us-central1-a'
  - 'CLOUDSDK_CONTAINER_CLUSTER=blue-green-cluster'
  id: 'Update Blue for Next Cycle'
  waitFor: ['Switch Traffic']

# 7. (Optional) Clean up old deployments if desired, or keep them for rollback.
# For a true blue-green, you'd typically keep the old 'blue' deployment running for a period.
# This example doesn't include automatic cleanup.

images:
- 'gcr.io/$PROJECT_ID/my-c-app:$COMMIT_SHA'

Setting up the Cloud Build Trigger

1. Navigate to Cloud Build in the GCP Console.

  • Go to “Triggers” and click “Create trigger”.
  • Connect your repository (e.g., Cloud Source Repositories, GitHub).
  • Configure the trigger:
    • Name: e.g., blue-green-deploy
    • Event: Push to a branch (e.g., main or master)
    • Configuration: Cloud Build configuration file (cloudbuild.yaml)
    • Location of build config file: /cloudbuild.yaml
  • Click “Create”.

Deployment Workflow and Rollback Strategy

The Deployment Process

When a new commit is pushed to the configured branch:

  1. Cloud Build triggers.
  2. The Docker image for the new version is built and tagged with the commit SHA.
  3. The image is pushed to Google Container Registry.
  4. The my-c-app-green deployment is updated to use the new image.
  5. Cloud Build waits for the green deployment’s pods to become ready.
  6. The my-c-app-service‘s selector is updated to point to the environment: green label. This instantly redirects all new incoming traffic to the green environment.
  7. (Optional) The my-c-app-blue deployment is updated to the new image, preparing it for the *next* deployment cycle.

Zero-Downtime Verification

The zero-downtime aspect is achieved because:

  • The Kubernetes Service (LoadBalancer) handles the traffic redirection. When the selector changes, the underlying Google Cloud Load Balancer is updated with minimal disruption.
  • Existing connections to the blue environment are not immediately terminated. They will complete their requests before being routed to the green environment on subsequent requests.
  • The green deployment is fully scaled and ready before traffic is switched.

Rollback Strategy

In case of issues with the new deployment:

  1. Immediate Rollback: If the new ‘green’ deployment shows errors, you can quickly revert traffic by patching the service selector back to environment: blue.
# Execute this command manually or via another Cloud Build trigger/script
kubectl patch service my-c-app-service --type=strategic --patch='{"spec":{"selector":{"app":"my-c-app","environment":"blue"}}}'

The ‘blue’ deployment, which is still running the previous stable version, will immediately receive all traffic. The ‘green’ deployment can then be scaled down or deleted.

Rollback with a Previous Version: If you need to roll back to a specific older version, you would:

  1. Ensure the desired older version’s deployment (e.g., my-c-app-blue) is running that version.
  2. Patch the service selector to point to the correct environment label for that older deployment.

Advanced Considerations

Canary Deployments

For even lower risk, you can extend this pattern to a canary deployment. Instead of switching 100% of traffic at once, you could use a service mesh like Istio or Linkerd, or configure the GCP Load Balancer (if using advanced features) to gradually shift traffic. Alternatively, you can manually manage the switch by having multiple ‘green’ deployments with different traffic percentages assigned via separate services or ingress rules.

Automated Testing Integration

Integrate automated tests into your Cloud Build pipeline. After step 4 (Wait for Green), you could add a step to run integration tests against the green environment’s external IP. If tests fail, the pipeline can be halted, and traffic will not be switched. This requires careful scripting to execute tests against the newly deployed, but not yet live, version.

Database Migrations

Database schema changes are a common challenge with blue-green deployments. The strategy here is to ensure backward compatibility: the new application version must be able to run with the old schema, and the old application version must be able to run with the new schema. This typically involves a multi-step process:

  1. Deploy the new application version (Green) that is backward-compatible with the current database schema.
  2. Run database migration scripts to update the schema to the new version.
  3. Switch traffic to the Green environment.
  4. Once confident, the Blue environment can be updated to the new application version, which now expects the new schema.

Alternatively, for destructive schema changes, you might need to deploy the new application version, perform the migration, and then perform a rollback if issues arise, requiring careful coordination.

Stateful Applications

For stateful C applications, managing persistent data during blue-green deployments requires careful consideration of Persistent Volumes (PVs) and Persistent Volume Claims (PVCs). Typically, you would want both Blue and Green environments to access the same persistent data store (e.g., a shared database, a distributed file system). If PVs are strictly tied to a single deployment, you might need to duplicate data or use strategies that allow shared access.

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