Introducción: por qué Go y Kubernetes son la pareja ideal
Go (Golang) y Kubernetes son dos herramientas clave en el desarrollo moderno. Go, creado en Google, es un lenguaje compilado, tipado estáticamente, ideal para crear microservicios de alto rendimiento. Kubernetes, por su parte, es el estándar de facto para la orquestación de contenedores. Su combinación proporciona un ecosistema potente: escribes código ligero y rápido en Go, lo empaquetas en una imagen Docker, y Kubernetes gestiona su ejecución, escalado y recuperación.
En esta guía, desplegaremos paso a paso una aplicación Go simple en Kubernetes. Aprenderás cómo escribir un Dockerfile, crear los manifiestos Deployment y Service, y aplicarlos en un clúster. El artículo está dirigido a desarrolladores que ya conocen los fundamentos de Go y tienen una comprensión básica de Docker.
Paso 1: Creación y contenerización de la aplicación Go
Empecemos con un servidor HTTP simple en Go. Crea el archivo main.go:
package main
import ( "fmt" "net/http" "os")
func main() { port := os.Getenv("PORT") if port == "" { port = "8080" } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello from Go on Kubernetes!") }) http.ListenAndServe(":"+port, nil)}Este código escucha en el puerto especificado por la variable de entorno PORT (por defecto 8080) y devuelve un mensaje simple.
Construcción de la imagen Docker
Ahora crearemos un Dockerfile para una compilación multi-etapa, lo que reducirá el tamaño de la imagen final:
# Etapa de compilaciónFROM golang:1.21-alpine AS builderWORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN CGO_ENABLED=0 GOOS=linux go build -o /app/server .
# Imagen finalFROM alpine:latestRUN apk --no-cache add ca-certificatesWORKDIR /root/COPY --from=builder /app/server .EXPOSE 8080CMD ["./server"]Construye la imagen y envíala a un registro (por ejemplo, Docker Hub):
docker build -t tunombredeusuario/go-k8s-app:v1 .docker push tunombredeusuario/go-k8s-app:v1Paso 2: Manifiesto Deployment
Kubernetes utiliza manifiestos YAML para describir el estado deseado del clúster. Crea el archivo deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: go-app-deployment labels: app: go-appspec: replicas: 3 selector: matchLabels: app: go-app template: metadata: labels: app: go-app spec: containers: - name: go-app image: tunombredeusuario/go-k8s-app:v1 ports: - containerPort: 8080 env: - name: PORT value: "8080" readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 15 periodSeconds: 20Desglose de los campos clave:
replicas: 3— Kubernetes mantendrá 3 instancias (pods) en ejecución de la aplicación.readinessProbe— verifica si el pod está listo para recibir tráfico (solicitudes a /).livenessProbe— verifica si el pod está vivo; si no, Kubernetes lo reiniciará.
Paso 3: Manifiesto Service
Para hacer que la aplicación sea accesible dentro del clúster o desde el exterior, se necesita un Service. Crea service.yaml:
apiVersion: v1kind: Servicemetadata: name: go-app-servicespec: selector: app: go-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancerselector— vincula el servicio con los pods que tienen la etiqueta