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
testingandtestify) - Lint and format code with
golangci-lintandgofmt - 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!