DEV Community

Cover image for Go Faster: Kubernetes Development with DevSpace
IHEB MANSOUR
IHEB MANSOUR

Posted on

Go Faster: Kubernetes Development with DevSpace

Developing and deploying applications to Kubernetes can often feel like a hurdle. However, with the right tools, you can transform this complexity into a seamless and efficient workflow. This guide introduces DevSpace and Minikube as a powerful combination for Go application development, enabling you to build, deploy, and debug your applications directly within a local Kubernetes environment with remarkable ease.

Minikube provides a lightweight, local Kubernetes cluster, perfect for development and testing. DevSpace then layers on top, offering an intelligent CLI that streamlines the entire development lifecycle, from initial project setup to continuous development with hot reloading and integrated debugging. Let's dive into how you can leverage these tools to supercharge your Go development.

Step 1: Initialize Your Project with DevSpace

Navigate to your Go project directory in your terminal. We begin by initializing DevSpace. This command will set up the necessary devspace.yaml configuration file for your project.

devspace init
Enter fullscreen mode Exit fullscreen mode

If a devspace.yaml already exists, DevSpace will prompt you to decide whether to delete it and recreate it from scratch. For a fresh start, choose "Yes". DevSpace will then start detecting your programming language and guide you through a series of questions to configure your project.

Step 2: Configure DevSpace for Development

DevSpace will ask you about your development preferences. When prompted, choose "I want to develop this project and my current working dir contains the source code". For building the container image, select "Use this existing Dockerfile: ./Dockerfile". Finally, for pushing images, select hub.docker.com and confirm your authenticated status. This initial setup is crucial for DevSpace to understand your project structure and how you intend to develop it.

Image description

Step 3: Set Your Kubernetes Namespace

To keep your Kubernetes environment organized, it's a good practice to work within a specific namespace. Use the devspace use namespace command to set your default namespace to devspace. This ensures that all your deployments and operations within DevSpace will be confined to this dedicated area within your Minikube cluster.

devspace use namespace devspace
Enter fullscreen mode Exit fullscreen mode

You'll receive a confirmation once the default namespace is successfully set.

Image description

Step 4: Start DevSpace Development Mode

This is where the magic happens! The devspace dev command is your gateway to a seamless development experience. It will build your application image, deploy it to your Minikube cluster, and establish crucial development features like port-forwarding and file synchronization.

devspace dev
Enter fullscreen mode Exit fullscreen mode

DevSpace will display information about the namespace and kube context being used. It will then proceed to set up port forwarding (e.g., $2345->2345$, $8080->8080$) and start file synchronization from your local directory to the container. After an initial sync, you will be presented with a welcome message inside your development container, indicating that files are synchronized and ports are forwarded.

Image description

Step 5: Welcome to Your Development Container

Once devspace dev completes its setup, you'll find yourself inside a shell within your development container. This container is running within your Minikube cluster, and it's where your application's source code is synchronized. You'll see a welcome message explaining how to work within this environment, including that files are synchronized and ports are forwarded. This integrated shell allows you to directly interact with your application's environment.

Image description

Step 6: Review Your Go Application Code

Before running the application, let's take a quick look at the main.go file. This example demonstrates a simple Go web server that serves "Hello Medium!" on port 8080. This is the application we'll be running and subsequently modifying to showcase DevSpace's hot-reloading capabilities. Notice the http.ListenAndServe(":8080", nil) which sets up the server on port 8080.

Image description

Step 7: Run Your Go Application

From within the development container's shell (the devspace./app # prompt), execute your Go application:

go run main.go
Enter fullscreen mode Exit fullscreen mode

You will see output indicating that the "Server starting on port 8080...". This confirms that your application is now running inside the Kubernetes pod, accessible via the port-forwarding set up by DevSpace.

Image description

Step 8: Access Your Application Locally

With the server running, open your web browser and navigate to http://localhost:8080. Because DevSpace has forwarded port 8080 from the container to your local machine, you'll be able to access your Go application directly. You should see "Hello Medium!" displayed in your browser. This step verifies that your application is deployed and accessible.

Image description

Step 9: Implement Hot Reloading by Modifying Code

Now, let's experience the power of DevSpace's hot reloading. On your local machine, open your main.go file and change the message from "Hello Medium!" to "Thanks for Watching!". Also, ensure that the ListenAndServe port is correctly set to 8080 for consistency. Save the file.

Image description

DevSpace will automatically detect the change, synchronize the file to the container, and you'll need to restart your application in the terminal to pick up the changes.

go run main.go
Enter fullscreen mode Exit fullscreen mode

Image description

Step 10: Verify Hot Reloaded Changes

After restarting your Go application in the development container, refresh your browser at http://localhost:8080. You should now see the updated message: "Thanks for Watching!". This demonstrates the efficiency of DevSpace's file synchronization and the rapid feedback loop it provides for development. You make a change locally, and with a quick restart, your application in Kubernetes reflects that change, dramatically speeding up your development process.

Image description

Top comments (0)