Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deploy applications to Kubernetes with production-ready manifests. Supports Deployments, Services, Ingress, HPA, ConfigMaps, Secrets, StatefulSets, and NetworkPolicies. Includes health checks, resource limits, auto-scaling, and TLS termination. Use when working with creating kubernetes deployments. Trigger with 'creating', 'kubernetes', 'deployments'.
.claude/skills/jeremylongshore-creating-kubernetes-deployments/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 215% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 121% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 292% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 207% | 0% |
| case-20 | ✓→✓ | = Same ✓ | 116% | 0% |
Generate production-ready Kubernetes manifests with health checks, resource limits, and security best practices.
yaml# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-api labels: app: my-api spec: replicas: 3 selector: matchLabels: app: my-api strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% maxUnavailable: 25% template: metadata: labels: app: my-api spec: containers: - name: my-api image: my-registry/my-api:v1.0.0 ports: - containerPort: 8080 # 8080: HTTP proxy port resources: requests: cpu: 100m memory: 256Mi limits: cpu: 500m memory: 512Mi livenessProbe: httpGet: path: /healthz port: 8080 # HTTP proxy port initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /readyz port: 8080 # HTTP proxy port initialDelaySeconds: 5 periodSeconds: 5 --- apiVersion: v1 kind: Service metadata: name: my-api spec: type: ClusterIP selector: app: my-api ports: - port: 80 targetPort: 8080 # HTTP proxy port
| Strategy | Use Case | Configuration | |----------|----------|---------------| | RollingUpdate | Zero-downtime updates | maxSurge: 25%, maxUnavailable: 25% | | Recreate | Stateful apps, incompatible versions | type: Recreate | | Blue-Green | Instant rollback | Two deployments, switch Service selector | | Canary | Gradual rollout | Multiple deployments with weighted traffic |
yaml# Blue deployment (current production) apiVersion: apps/v1 kind: Deployment metadata: name: my-api-blue labels: app: my-api version: blue spec: replicas: 3 selector: matchLabels: app: my-api version: blue template: metadata: labels: app: my-api version: blue spec: containers: - name: my-api image: my-registry/my-api:v1.0.0 --- # Service points to blue apiVersion: v1 kind: Service metadata: name: my-api spec: selector: app: my-api version: blue # Switch to 'green' for deployment ports: - port: 80 targetPort: 8080 # 8080: HTTP proxy port
| Type | Use Case | Access | |------|----------|--------| | ClusterIP | Internal services | my-api.namespace.svc.cluster.local | | NodePort | Development, debugging | <NodeIP>:<NodePort> | | LoadBalancer | External traffic (cloud) | Cloud provider LB IP | | ExternalName | External service proxy | DNS CNAME |
yamlapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-api-ingress annotations: cert-manager.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: ingressClassName: nginx tls: - hosts: - api.example.com secretName: api-tls-secret rules: - host: api.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-api port: number: 80
Always set resource requests and limits:
yamlresources: requests: # Guaranteed resources cpu: 100m # 0.1 CPU core memory: 256Mi limits: # Maximum allowed cpu: 500m # 0.5 CPU core memory: 512Mi
| Workload Type | CPU Request | Memory Request | CPU Limit | Memory Limit | |---------------|-------------|----------------|-----------|--------------| | Web API | 100m-500m | 256Mi-512Mi | 500m-1000m | 512Mi-1Gi | | Worker | 250m-1000m | 512Mi-1Gi | 1000m-2000m | 1Gi-2Gi | | Database | 500m-2000m | 1Gi-4Gi | 2000m-4000m | 4Gi-8Gi |
yamllivenessProbe: httpGet: path: /healthz port: 8080 # 8080: HTTP proxy port initialDelaySeconds: 30 # Wait for app startup periodSeconds: 10 # Check every 10s timeoutSeconds: 5 # Timeout per check failureThreshold: 3 # Restart after 3 failures
yamlreadinessProbe: httpGet: path: /readyz port: 8080 # 8080: HTTP proxy port initialDelaySeconds: 5 # Quick check after start periodSeconds: 5 # Check every 5s successThreshold: 1 # 1 success = ready failureThreshold: 3 # Remove from LB after 3 failures
yamlstartupProbe: httpGet: path: /healthz port: 8080 # 8080: HTTP proxy port initialDelaySeconds: 0 periodSeconds: 10 failureThreshold: 30 # Allow 5 minutes to start (30 * 10s)
yamlapiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: my-api-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: my-api minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80 behavior: scaleDown: stabilizationWindowSeconds: 300 # 300: Wait 5min before scale down
yamlapiVersion: v1 kind: ConfigMap metadata: name: my-api-config data: LOG_LEVEL: "info" API_ENDPOINT: "https://api.example.com" config.yaml: | server: port: 8080 # 8080: HTTP proxy port features: enabled: true
yamlapiVersion: v1 kind: Secret metadata: name: my-api-secrets type: Opaque data: API_KEY: YXBpLWtleS1oZXJl # echo -n "api-key-here" | base64 DATABASE_URL: cG9zdGdyZXM6Ly8uLi4= # echo -n "postgres://..." | base64
yamlspec: containers: - name: my-api envFrom: - configMapRef: name: my-api-config - secretRef: name: my-api-secrets volumeMounts: - name: config-volume mountPath: /app/config volumes: - name: config-volume configMap: name: my-api-config
bash # Validate manifests kubectl apply -f manifests/ --dry-run=server
# Apply to cluster kubectl apply -f manifests/
# Watch rollout kubectl rollout status deployment/my-api
See ${CLAUDE_SKILL_DIR}/references/errors.md for comprehensive troubleshooting.
| Error | Quick Fix | |-------|-----------| | ImagePullBackOff | Check image name, tag, registry credentials | | CrashLoopBackOff | Check logs: kubectl logs <pod> | | OOMKilled | Increase memory limits | | Pending | Check resources: kubectl describe pod <pod> |
See ${CLAUDE_SKILL_DIR}/references/examples.md for detailed walkthroughs.
${CLAUDE_SKILL_DIR}/assets/${CLAUDE_SKILL_DIR}/scripts/Deploy applications to Kubernetes with production-ready manifests.
See Kubernetes implementation details for output format specifications.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | pass→pass | 11,088 | 10,837 | -2% | 1 | 1 | 0% | 2,306 | 4,983 | +116% | 0 | 0 | — |
case-01 | fail→pass | 6,754 | 6,965 | +3% | 1 | 1 | 0% | 1,256 | 3,951 | +215% | 0 | 0 | — |
case-02 | pass→pass | 6,687 | 4,133 | -38% | 1 | 1 | 0% | 1,250 | 3,397 | +172% | 0 | 0 | — |
case-03 | pass→pass | 9,925 | 6,474 | -35% | 1 | 1 | 0% | 1,708 | 3,820 | +124% | 0 | 0 | — |
case-04 | fail→pass | 11,125 | 10,293 | -7% | 1 | 1 | 0% | 2,002 | 4,420 | +121% | 0 | 0 | — |
case-05 | fail→fail | 12,210 | 12,442 | +2% | 1 | 1 | 0% | 2,184 | 4,947 | +127% | 0 | 0 | — |
case-10 | fail→pass | 4,015 | 3,322 | -17% | 1 | 1 | 0% | 860 | 3,372 | +292% | 0 | 0 | — |
case-06 | fail→pass | 5,320 | 4,523 | -15% | 1 | 1 | 0% | 1,132 | 3,478 | +207% | 0 | 0 | — |
case-07 | fail→fail | 6,478 | 4,423 | -32% | 1 | 1 | 0% | 1,153 | 3,425 | +197% | 0 | 0 | — |
case-08 | pass→pass | 4,204 | 5,181 | +23% | 1 | 1 | 0% | 857 | 3,672 | +328% | 0 | 0 | — |
case-09 | fail→fail | 6,419 | 4,808 | -25% | 1 | 1 | 0% | 1,384 | 3,687 | +166% | 0 | 0 | — |
case-11 | pass→pass | 4,148 | 4,406 | +6% | 1 | 1 | 0% | 868 | 3,436 | +296% | 0 | 0 | — |
case-12 | pass→pass | 2,108 | 2,495 | +18% | 1 | 1 | 0% | 379 | 3,060 | +707% | 0 | 0 | — |
case-13 | pass→pass | 7,094 | 4,399 | -38% | 1 | 1 | 0% | 1,470 | 3,501 | +138% | 0 | 0 | — |
case-14 | pass→pass | 5,374 | 3,778 | -30% | 1 | 1 | 0% | 1,084 | 3,385 | +212% | 0 | 0 | — |
case-15 | pass→pass | 5,980 | 1,915 | -68% | 1 | 1 | 0% | 1,094 | 2,930 | +168% | 0 | 0 | — |
case-16 | pass→pass | 2,906 | 2,816 | -3% | 1 | 1 | 0% | 471 | 3,047 | +547% | 0 | 0 | — |
case-17 | pass→pass | 2,601 | 2,743 | +5% | 1 | 1 | 0% | 465 | 3,108 | +568% | 0 | 0 | — |
case-18 | pass→pass | 4,373 | 4,441 | +2% | 1 | 1 | 0% | 822 | 3,590 | +337% | 0 | 0 | — |
case-19 | pass→pass | 5,211 | 3,995 | -23% | 1 | 1 | 0% | 1,080 | 3,473 | +222% | 0 | 0 | — |
case-21 | pass→pass | 18,044 | 12,267 | -32% | 1 | 1 | 0% | 2,284 | 5,512 | +141% | 0 | 0 | — |
case-22 | pass→pass | 22,699 | 9,031 | -60% | 1 | 1 | 0% | 1,551 | 4,340 | +180% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.