Kubernetes is an open-source project for automating deployment, scaling, and management of containers. It has rapidly become the standard to run production workloads and the community around it is just great!

But developing on Kubernetes presents some challenges. The typical development workflow looks like this: write code, build a Docker image, push it to the registry, redeploy, validate your changes and repeat. This flow is not only slow, but it also prevents us from benefiting from standard features of Go tools such as fast incremental builds, hot reloaders or debuggers.

Okteto was created to solve this problem. On this blog post, we will show you how Okteto improves the developer experience in Kubernetes for Go developers. You will be able to take full advantage of tools like go build , dependency caching, or IDE debuggers (VS Code, GoLand, Atom …) while developing your application directly on Kubernetes.

Step 1: Deploy the Go Sample App

Get a local version of the Go Sample App by executing the following commands:

1

2

git clone https://github.com/okteto/go-getting-started

cd go-getting-started



The k8s.yml file contains the Kubernetes manifests to deploy the Go Sample App.

Run the application by executing:

You can deploy to your own Kubernetes cluster or give Okteto Cloud a try. Okteto Cloud is a development platform for Kubernetes applications. Sign up today to get a free developer account with 4 CPUs and 8GB of RAM.

1

kubectl apply -f k8s.yml



1

2

deployment.apps "hello-world" created

service "hello-world" created



This is cool! You typed one command and a dev version of your application just runs 😎.

Step 2: Install the Okteto CLI

The Okteto CLI is an open-source project that lets you develop your applications directly on Kubernetes while taking advantage of well-known local tooling. We will use it to speed up our development cycle instead of using the typical development workflow based on building docker images and redeploying containers.

Install the Okteto CLI >= 1.9.0:

MacOS / Linux 1

curl https://get.okteto.com -sSfL | sh



Windows Download https://downloads.okteto.com/cli/okteto.exe and add it to your `$PATH`.

Step 3: Create your okteto manifest

To start developing on the Go Sample App you first need to create an okteto manifest.

With the Go Sample App deployed, run the following command to create your okteto manifest:

1

okteto init



1

2

3

4

5

6

7

This command walks you through creating an okteto manifest.

It only covers the most common items, and tries to guess sensible defaults.

See https://okteto.com/docs/reference/manifest for the official documentation about the okteto manifest.

Use the arrow keys to navigate: ↓ ↑ → ←

Select the deployment you want to develop:

▸ hello-world

Use default values



The okteto init command will scan the available deployments in your Kubernetes namespace, and ask you to pick one.

Select the hello-world deployment. It’s the one we deployed on the previous step.

1

2

3

4

✓ hello-world

✓ Deployment 'hello-world' successfully analyzed

✓ okteto manifest (okteto.yml) created

i Run 'okteto up' to activate your development container



The okteto init command creates the following okteto.yml file:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

name: hello-world

image: okteto/golang:1

command: bash

securityContext:

capabilities:

add:

- SYS_PTRACE

volumes:

- /go/pkg/

- /root/.cache/go-build/

sync:

- .:/usr/src/app

forward:

- 8080 :8080

- 2345 :2345



This file defines how to activate a development container for the Go Sample App:

name : the name of the Kubernetes deployment you want to put on development mode.

: the name of the Kubernetes deployment you want to put on development mode. image : the image used by the development container.

: the image used by the development container. command : the start command of the development container.

: the start command of the development container. securityContext : SYS_PTRACE is a capability required by the Go debugger.

: is a capability required by the Go debugger. volumes : a list of paths in your development container to be mounted as persistent volumes. For example, this is useful to persist the Go cache.

: a list of paths in your development container to be mounted as persistent volumes. For example, this is useful to persist the Go cache. sync : the folders that will be synchronized between your local machine and the development container.

: the folders that will be synchronized between your local machine and the development container. forward : a list of ports to forward from your development container.

Also, the okteto init command creates a .stignore file to indicate which files shouldn’t be synchronized to your development container.

This is useful to avoid synchronizing binaries, build artifacts or git metadata or dependencies like the vendor folder.

Step 4: Activate your development container in Kubernetes

Next, execute the following command to activate your development container:

1

okteto up



1

2

3

4

5

6

7

8

9

✓ Development container activated

✓ Files synchronized

Namespace: pchico83

Name: hello-world

Forward: 8080 -> 8080

2345 -> 2345



Welcome to your development container. Happy coding!

default:hello-world app>



Working in your development container is the same as working on your local machine.

Start the application by running the following command:

1

cindy:hello-world app> go run main.go



1

Starting hello-world server...



The first time you run the application, Go will download your dependencies and compile your application. Wait for this process to finish.

Okteto automatically forwards port 8080 from your local computer to the development container, making it accessible via localhost . Test your application by running the command below in a local shell:

1

curl localhost:8080



1

Hello world!



Step 5: Develop directly in Kubernetes

Open the main.go file in your favorite local IDE and modify the response message on line 17 to be Hello world from the cluster!. Save your changes.

1

2

3

func helloServer (w http.ResponseWriter, r *http.Request) {

fmt.Fprint(w, "Hello world from the cluster!" )

}



Okteto will synchronize your changes to your development container in Kubernetes. Cancel the execution of go run main.go from the development container shell by pressing ctrl + c . Rerun your application:

1

go run main.go



1

Starting hello-world server...



Call your application from a local shell to validate the changes:

1

curl localhost:8080



1

Hello world from the cluster!



Cool! Your code changes were instantly applied to Kubernetes. No commit, build or push required 😎!

Step 6: Debug directly in Kubernetes

Okteto enables you to debug your applications directly from your favorite IDE. Let’s take a look at how that works in VS Code, one of the most popular IDEs for Go development. If you haven’t done it yet, install the Go extension available from Visual Studio marketplace.

Cancel the execution of go run main.go from the development container shell by pressing ctrl + c . Rerun your application in debug mode:

1

dlv debug --headless --listen=:2345 -- log --api-version=2



1

2

API server listening at: [::]:2345

2019-10-17T14:39:24Z info layer=debugger launching process with args: [/usr/src/app/__debug_bin]



Open the Debug view in VS Code and run the Connect to okteto debug configuration (or press the F5 shortcut):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

{

"version" : "0.2.0" ,

"configurations" : [

{

"name" : "Connect to okteto" ,

"type" : "go" ,

"request" : "attach" ,

"mode" : "remote" ,

"remotePath" : "/usr/src/app" ,

"port" : 2345 ,

"host" : "127.0.0.1"

}

]

}



Add a breakpoint on main.go , line 17. Call your application by executing from your local shell:

1

curl localhost:8080



The execution will halt at your breakpoint. You can then inspect the request, the available variables, etc…

Conclusions

Kubernetes has the potential to be a great development platform, providing replicable, resource-efficient and production-like development environments. We have shown you how to use Okteto to create a development workflow that also lets you take advantage of features like incremental builds, hot reloaders or debuggers while developing your application directly on Kubernetes.

Visit our website to know more about how to improve your team developer productivity with Okteto. Follow us on Twitter and join our #okteto channel in the Kubernetes community Slack to share your feedback with our community.