Conceptos básicos de despliegue
10 ejemplos para empezar con Deploy & K8s: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con Deploy & K8s: 7 básicos y 3 intermedios.
kubectl y verifica el acceso al clúster: kubectl cluster-info.mkdir deploylab && cd deploylab && go mod init example.com/deploylab.Produce un binario optimizado para Linux desde la raíz de tu módulo.
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath \
-ldflags="-s -w" -o bin/api ./cmd/apiCGO_ENABLED=0 genera un binario estático adecuado para imágenes scratch/distroless.-trimpath elimina rutas del sistema de archivos local de los binarios para compilaciones reproducibles.-ldflags="-s -w" elimina símbolos de depuración para reducir el tamaño del artefacto.Relacionado: Despliegue de Go: Binario único como superpoder - por qué un solo archivo cambia las operaciones
Estampa la versión de git en el binario para depuración en producción.
package main
import "fmt"
var (
version = "dev"
commit = "none"
)
func main() {
fmt.Printf("api %s (%s)\n", version, commit)
}go build -ldflags="-X main.version=1.2.3 -X main.commit=$(git rev-parse --short HEAD)" -o bin/api .-X establece variables de cadena en main en tiempo de enlace.Relacionado: Canales de CI/CD para servicios Go - automatiza el estampado de versiones en CI
Enlaza a PORT desde el entorno, el patrón predeterminado para PaaS y Kubernetes.
package main
import (
"fmt"
"log"
"net/http"
"os"
)
func main() {
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "hello")
})
log.Fatal(http.ListenAndServe(":"+port, nil))
}:8080), no en 127.0.0.1.PORT del entorno para que las plataformas puedan asignar puertos efímeros.Relacionado: Compilaciones Docker de varias etapas para Go - empaqueta este servidor en una imagen mínima
Expone un endpoint económico que las sondas de Kubernetes pueden llamar.
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("ok"))
})Relacionado: Sondas, HPA y Presupuestos de Interrupción de Pods - ajuste de sondas y escalado automático
Una imagen de tiempo de ejecución simple de dos líneas para experimentos locales.
FROM golang:1.26-bookworm AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /api ./cmd/api
FROM debian:bookworm-slim
COPY --from=build /api /api
EXPOSE 8080
ENTRYPOINT ["/api"]CGO_ENABLED=0 para binarios portátiles de Linux.Relacionado: Compilaciones Docker de varias etapas para Go - distroless y certificados CA
Etiqueta con un semver o SHA de git, nunca solo latest en entornos compartidos.
docker build -t deploylab/api:0.1.0 .
docker run --rm -p 8080:8080 -e PORT=8080 deploylab/api:0.1.0
curl -s localhost:8080/healthzPORT del contenedor para pruebas rápidas.Relacionado: Mejores prácticas de despliegue - etiquetas semver y disciplina de reversión
Ejecuta una réplica con solicitudes de recursos para que el planificador pueda colocar el pod.
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 1
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: deploylab/api:0.1.0
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"
resources:
requests:
cpu: 100m
memory: 64Mi
limits:
memory: 128Mikubectl apply -f deployment.yaml
kubectl rollout status deployment/apiresources.requests ayuda al planificador y a las líneas base de HPA.image a una etiqueta o digest específico, no a un latest flotante.Relacionado: Despliegues, Servicios e Ingress de Kubernetes - Servicios, Ingress y límites
Expón el Despliegue dentro del clúster y prueba sin Ingress.
apiVersion: v1
kind: Service
metadata:
name: api
spec:
selector:
app: api
ports:
- port: 80
targetPort: 8080kubectl apply -f service.yaml
kubectl port-forward svc/api 8080:80
curl -s localhost:8080/healthzapi.default.svc.cluster.local) a las IPs de los pods.targetPort debe coincidir con el puerto de escucha del contenedor.Relacionado: Despliegues, Servicios e Ingress de Kubernetes - reglas de Ingress y TLS
Conecta las sondas de liveness y readiness a /healthz.
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 10
readinessProbe:
httpGet:
path: /healthz
port: 8080
periodSeconds: 5initialDelaySeconds evita matar pods que aún están enlazando puertos.periodSeconds y timeoutSeconds a tu SLO y tiempo de arranque en frío.Relacionado: Sondas, HPA y Presupuestos de Interrupción de Pods - PDBs y escalado automático
Kubernetes envía SIGTERM antes de SIGKILL; vacía las solicitudes en curso.
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("ok"))
})
srv := &http.Server{Addr: ":8080", Handler: mux}
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatal(err)
}
}()
stop := make(chan os.Signal, 1)
signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT)
<-stop
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal(err)
}
}Shutdown deja de aceptar nuevas conexiones y espera las solicitudes activas.Relacionado: Hooks de ingeniería del caos para microservicios Go - valida el comportamiento bajo fallo
Versiones de la pila: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, modernizadores de go fix - verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica los objetivos de la placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026