Go
Go (Golang) is a modern, statically typed language designed for simplicity, performance, and scalability. It's a top choice for DevOps and SRE engineers working with AWS, Azure, GCP, Kubernetes, and cloud-native tooling.
Why DevOps & SREs Should Learn Go
Cloud Native: Go powers Kubernetes, Docker, Prometheus, and many cloud SDKs (AWS, Azure, GCP).
Performance: Compiled binaries, fast startup, and low memory usage make Go ideal for microservices and CLI tools.
Concurrency: Goroutines and channels enable efficient parallel processing for automation and monitoring.
DevOps Ecosystem: Many DevOps tools (Terraform, Helm, Vault, etc.) are written in Go, making it easy to extend or contribute.
Cross-Platform: Build for Linux, NixOS, WSL, and all major clouds with a single codebase.
Real-Life DevOps & SRE Examples
1. Build & Deploy a Go App on Kubernetes
Dockerfile:
FROM golang:1.21-alpine as builder
WORKDIR /app
COPY . .
RUN go build -o app
FROM alpine:3.18
WORKDIR /app
COPY --from=builder /app/app .
CMD ["./app"]
deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myrepo/myapp:v1
ports:
- containerPort: 8080
2. Kubernetes Operator with Go (kubebuilder)
// ...existing code for imports...
func (r *MyResourceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
// Custom reconciliation logic
// ...
return ctrl.Result{}, nil
}
3. Custom Kubernetes Controller
// ...existing code for imports...
func main() {
// Setup manager, scheme, and controller
// Watch for resource changes and automate tasks
// ...
}
4. Prometheus Exporter in Go
package main
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
func main() {
myMetric := prometheus.NewGauge(prometheus.GaugeOpts{
Name: "my_custom_metric",
Help: "A custom metric for SREs",
})
prometheus.MustRegister(myMetric)
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":2112", nil)
}
5. CI/CD Pipeline Step (GitHub Actions)
- name: Build Go binary
run: go build -o app
- name: Run tests
run: go test ./...
Best Practices (2025)
Use Go modules for dependency management
Write unit and integration tests (use
testing
andtestify
)Lint and format code with
golangci-lint
andgofmt
Use context for cancellation/timeouts in automation
Pin dependencies in
go.mod
Document code and APIs
Common Pitfalls
Not handling errors (always check returned errors)
Hardcoding credentials (use env vars or secret managers)
Ignoring context cancellation in long-running tasks
Not using modules (avoid GOPATH for new projects)
References
Go Joke: Why did the SRE love Go? Because handling errors is a feature, not a bug!
Last updated