Using GitHub Actions with Kubernetes: A Developer’s Guide

Updated: January 30, 2024 By: Guest Contributor Post a comment

Introduction

As the landscape of software development continuously evolves, the adaptability and efficiency of Continuous Integration/Continuous Deployment (CI/CD) workflows have become more crucial than ever. GitHub Actions enables developers to automate their software build, test, and deployment pipelines. When combined with Kubernetes, an open-source platform for automating deployment, scaling, and managing containerized applications, it provides a robust environment for a modern DevOps approach. This guide explores how to harness the power of GitHub Actions in tandem with Kubernetes to streamline your deployment processes.

Getting Started with GitHub Actions for Kubernetes

Before delving into complex workflows, you need to understand the basics of GitHub Actions and Kubernetes:

name: Simple Kubernetes Deployment
on: [push]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Set up Kubeconfig
      uses: azure/setup-kubectl@v1
      with:
        version: '1.18.0'

    - name: Connect to Kubernetes Cluster
      run: |
        az aks get-credentials --name ClusterName --resource-group ResourceGroup

    - name: Deploy to Kubernetes
      run: |
        kubectl apply -f deployment.yml

Here’s a breakdown of this sample workflow:

  • ‘name’ assigns a name to your GitHub Actions workflow.
  • ‘on: [push]’ signifies that the workflow gets triggered when someone pushes to the repository.
  • ‘steps’ include various actions such as checking out the code, setting up Kubeconfig, connecting to your Kubernetes cluster, and deploying your application using kubectl apply.

Adding Secrets and ConfigMaps

Secrets and ConfigMaps handle sensitive information and configurations required by your deployments:

... 
steps:
  ...
  - name: Create a ConfigMap
    run: kubectl create configmap my-config --from-literal=key1=value1

  - name: Create a Secret
    run: kubectl create secret generic my-secret --from-literal=key1=${{ secrets.MY_SECRET_VALUE }}

After creating these Kubernetes objects, ensure they are properly referenced in your Kubernetes deployment files.

Building and Pushing Docker Images

Integrating Docker builds into your workflow requires setting up Docker within GitHub Actions:

... 
steps:
  ...
  - name: Build Docker Image
    run: docker build -t my-app:$GITHUB_SHA .

  - name: Login to DockerHub
    uses: docker/login-action@v1
    with:
      username: ${{ secrets.DOCKERHUB_USERNAME }}
      password: ${{ secrets.DOCKERHUB_PASSWORD }}

  - name: Push Docker Image to Repository
    run: docker push my-app:$GITHUB_SHA

This snippet highlights how to build a Docker image tagged with the commit SHA, login to DockerHub, and push the image to the repository.

Advanced Deployment Strategies

Moving onto advanced deployment techniques with Kubernetes:

... 
steps:
  ...
  - name: Deploy using a Rolling Update
    run: kubectl rollout restart deployment/my-app

By executing a rolling update, you can update your application with zero downtime.

Handling Rollbacks

A well-constructed CI/CD pipeline should account for potential failures by implementing an automated rollback mechanism:

... 
steps:
  ...
  - name: Verify Deployment
    run: |
      kubectl rollout status deployment/my-app
      if [ $? -ne 0 ]; then
        echo "Deployment failed! Initiating rollback!"
        kubectl rollout undo deployment/my-app
      else
        echo "Deployment successful!"
      fi

This script verifies the deployment status and rolls back to the previous state if it encounters a failure.

Automated Testing within the Pipeline

Including automated tests within your pipeline ensures reliability:

... 
steps:
  ...
  - name: Run Tests
    run: ./scripts/run-tests.sh

  - name: Deploy to Kubernetes if Tests Passed
    if: success()
    run: kubectl apply -f deployment.yml

Note the conditional deployment based on the success of the test step.

Conclusion

Mastering GitHub Actions and Kubernetes streamlines the process of building, testing, and deploying applications efficiently. By employing these examples as a starting point, developers can construct more intricate and resilient pipelines tailored to their project’s requirements, ultimately leading to a more robust software delivery approach.