AgentSkillsCN

kubernetes-deployer

通过 Dockerfile、Helm Chart 以及本地 Minikube 部署,将应用打包并部署至 Kubernetes。适用于容器化应用、创建 Kubernetes 清单、搭建 Helm Chart、部署至 Minikube,或准备面向云的配置时使用。重点在于以无状态服务为核心,优先考虑本地部署。

SKILL.md
--- frontmatter
name: kubernetes-deployer
description: Package and deploy applications to Kubernetes with Dockerfiles, Helm charts, and local Minikube deployment. Use when containerizing applications, creating Kubernetes manifests, setting up Helm charts, deploying to Minikube, or preparing cloud-ready configurations. Focuses on local-first deployment with stateless services.

Kubernetes Deployer

Deploy applications to Kubernetes with production-ready configurations, starting locally with Minikube.

Deployment Workflow

code
1. Dockerfile     → Containerize application
2. Helm Chart     → Package Kubernetes manifests
3. Local Deploy   → Test in Minikube
4. Cloud Ready    → Configure for production

Quick Start: Local Deployment

1. Create Dockerfile

dockerfile
# Python example (see references for other languages)
FROM python:3.11-slim AS builder
WORKDIR /build
COPY pyproject.toml ./
RUN pip install --no-cache-dir .

FROM python:3.11-slim
WORKDIR /app
RUN useradd -m -u 1000 appuser
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY app ./app
USER appuser
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

2. Copy Helm Chart Template

Copy assets/helm-template/ to charts/<app-name>/ and customize:

bash
cp -r assets/helm-template charts/myapp
# Edit Chart.yaml: name, description
# Edit values.yaml: image, ports, resources

3. Deploy to Minikube

bash
# Start Minikube
minikube start

# Build image in Minikube's Docker
eval $(minikube docker-env)
docker build -t myapp:local .

# Deploy with Helm
helm upgrade --install myapp ./charts/myapp \
  --set image.repository=myapp \
  --set image.tag=local \
  --set image.pullPolicy=Never

# Access service
kubectl port-forward svc/myapp 8080:80

Core Principles

  1. Local-first - Test everything in Minikube before cloud
  2. Stateless services - No local state; use external databases
  3. Config via env vars - All configuration through environment
  4. 12-factor ready - Portable between environments

Helm Chart Structure

code
charts/<app-name>/
├── Chart.yaml        # Metadata
├── values.yaml       # Default config
└── templates/
    ├── _helpers.tpl  # Template functions
    ├── deployment.yaml
    ├── service.yaml
    ├── ingress.yaml  # Optional
    └── hpa.yaml      # Optional

Configuration Patterns

Environment Variables

yaml
# values.yaml
env:
  - name: DATABASE_URL
    value: "postgresql://..."
  - name: LOG_LEVEL
    value: "info"

# From secrets
envFrom:
  - secretRef:
      name: app-secrets

Create Secret

bash
kubectl create secret generic app-secrets \
  --from-literal=DATABASE_PASSWORD=secret123 \
  --from-literal=API_KEY=key456

Health Checks

yaml
# values.yaml
livenessProbe:
  httpGet:
    path: /health
    port: http
  initialDelaySeconds: 10

readinessProbe:
  httpGet:
    path: /health
    port: http
  initialDelaySeconds: 5

Common Commands

Minikube

bash
minikube start                    # Start cluster
minikube dashboard                # Open dashboard
eval $(minikube docker-env)       # Use Minikube Docker
minikube service myapp --url      # Get service URL

Helm

bash
helm lint ./charts/myapp                    # Validate chart
helm template myapp ./charts/myapp          # Preview manifests
helm upgrade --install myapp ./charts/myapp # Deploy
helm uninstall myapp                        # Remove

Kubectl

bash
kubectl get pods                  # List pods
kubectl logs <pod>                # View logs
kubectl describe pod <pod>        # Debug pod
kubectl port-forward svc/myapp 8080:80  # Access locally

Environment-Specific Values

yaml
# values-dev.yaml
replicaCount: 1
resources:
  limits:
    cpu: 200m
    memory: 256Mi

# values-prod.yaml
replicaCount: 3
autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 10

Deploy with environment:

bash
helm upgrade --install myapp ./charts/myapp \
  -f values.yaml \
  -f values-prod.yaml

Troubleshooting

IssueCommand
Pod not startingkubectl describe pod <name>
Image not foundminikube ssh docker images
Service unreachablekubectl get endpoints
Logskubectl logs <pod> -f

References

Assets