k8s-deployment
Kubernetes Deployment
Deploy services using Docker multi-stage builds, kustomize overlays, and Makefile-driven automation.
Directory Layout
.
├── Dockerfile
├── Makefile
├── server/
│ └── k8s/
│ └── prod/
│ ├── server.yaml
│ ├── ingress.yaml
│ └── kustomization.yaml
└── worker/
└── k8s/
└── prod/
├── worker.yaml
└── kustomization.yaml
Makefile
SHELL := /bin/bash
define setup_env
$(eval ENV_FILE := $(1))
$(eval include $(1))
$(eval export)
endef
build-push-cli: ## Build and push Docker image with git hash tag
$(call setup_env, .env.server.prod)
$(eval GIT_HASH := $(shell git rev-parse --short HEAD))
$(eval DYNAMIC_TAG := your-registry/your-app:$(GIT_HASH))
docker build -f Dockerfile -t $(DYNAMIC_TAG) .
docker push $(DYNAMIC_TAG)
deploy-server: ## Deploy server to Kubernetes (prod)
$(call setup_env, .env.server.prod)
@$(MAKE) build-push-cli
$(eval GIT_HASH := $(shell git rev-parse --short HEAD))
kustomize build --load-restrictor=LoadRestrictionsNone server/k8s/prod | \
sed -e "s;{{DOCKER_REPO}};your-registry/your-app;g" \
-e "s;{{GIT_COMMIT_SHA}};$(GIT_HASH);g" | \
kubectl apply -f -
deploy-worker: ## Deploy worker to Kubernetes (prod)
$(call setup_env, .env.worker.prod)
@$(MAKE) build-push-cli
$(eval GIT_HASH := $(shell git rev-parse --short HEAD))
kustomize build --load-restrictor=LoadRestrictionsNone worker/k8s/prod | \
sed -e "s;{{DOCKER_REPO}};your-registry/your-app;g" \
-e "s;{{GIT_COMMIT_SHA}};$(GIT_HASH);g" | \
kubectl apply -f -
Dockerfile (Go)
# ---- Builder Stage ----
FROM golang:1.24-alpine AS builder
RUN apk update && apk add --no-cache git build-base ca-certificates
RUN update-ca-certificates
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY cmd/ ./cmd/
COPY server/ ./server/
COPY worker/ ./worker/
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o /bin/app cmd/app/*.go
# ---- Final Stage ----
FROM alpine:latest
COPY /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
WORKDIR /app
COPY /bin/app /app
EXPOSE 8080
CMD ["/app", "run", "http-server"]
Dockerfile (Python)
FROM python:3.13-slim AS base
RUN pip install uv
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev
COPY src/ ./src/
COPY server/ ./server/
EXPOSE 8000
CMD ["uv", "run", "uvicorn", "server.main:app", "--host", "0.0.0.0", "--port", "8000"]
Key Patterns
- Git hash tags: Tag images with
git rev-parse --short HEADfor traceability - kustomize overlays: Use
kustomize buildwith sed substitution for env-specific deploys - Multi-stage builds: Separate builder and runtime stages for minimal images
- Layer caching: Copy dependency files first, then source code
- Frontend on Vercel: Deploy frontend via Vercel; only backend goes to k8s
More from brojonat/llmsrules
ibis-data
Use Ibis for database-agnostic data access in Python. Use when writing data queries, connecting to databases (DuckDB, PostgreSQL, SQLite), or building portable data pipelines that should work across backends.
13go-service
Build Go microservices with stdlib HTTP handlers, sqlc, urfave/cli, and slog. Use when creating or modifying a Go HTTP server, adding routes, middleware, database queries, or CLI commands.
13temporal-go
Build Temporal workflow applications in Go. Use when creating or modifying Temporal workflows, activities, workers, clients, signals, queries, updates, retry policies, saga patterns, or writing Temporal tests.
13parquet-analysis
Analyze parquet files using Python and Ibis. Use when the user wants to explore, transform, or analyze parquet data files, perform aggregations, joins, or export results. Works with local parquet files and provides database-agnostic data operations.
12ducklake
Work with DuckLake, an open lakehouse format built on DuckDB. Use when creating or querying DuckLake tables, managing snapshots, time travel, schema evolution, partitioning, or lakehouse maintenance operations.
12temporal-python
Build Temporal applications in Python using the temporalio SDK. Use when creating workflows, activities, workers, clients, signals, queries, updates, child workflows, timers, retry policies, saga/compensation patterns, testing, or any durable execution pattern in Python.
12