kubernetes-ops — Claude Code skill: deploy and debug K8s
A skill that gives your agent ready YAML for Kubernetes workloads plus the kubectl commands to debug and scale them.
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill kubernetes-ops -a claude-codeWhat kubernetes-ops does
The skill carries templates for the objects you touch most: a Deployment with probes and resource limits, a Service as ClusterIP or LoadBalancer, an Ingress with TLS, ConfigMap and Secret, PVC, StatefulSet, Job, CronJob and NetworkPolicy. It is a reference the agent reads, not a tool that talks to your cluster on its own.
Debugging gets its own section. Logs with --tail and a container flag, kubectl exec, kubectl port-forward, kubectl debug with a busybox image, events sorted by timestamp. Scaling covers both the manual kubectl scale and a HorizontalPodAutoscaler watching CPU and memory.
You need kubectl installed and pointed at a cluster. Without a live context the skill stays a manifest reference, because there is nowhere to run kubectl apply -f deployment.yaml. Secrets in the examples use stringData, so keep real values out of the manifest file.
The same skill installs into six platforms, Claude, Codex and Cursor among them.
What it helps with
- write a Deployment manifest with probes and resource limits
- expose a service through a LoadBalancer or an Ingress
- find out why a pod keeps restarting
- move config and secrets out of the image into ConfigMap and Secret
- set up autoscaling on CPU and memory
Example prompts for the agent
- write a Deployment for myapp with three replicas and a livenessProbe on /health
- how do I check the logs of a crashing pod and shell into it with kubectl exec
- set up an HPA for myapp between 2 and 10 replicas on CPU load
How to install kubernetes-ops
1Skills CLI (Vercel)
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill kubernetes-ops -a claude-code2Manually: put the files in place
~/.claude/skills/kubernetes-ops/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/kubernetes-ops/
1Skills CLI (Vercel)
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill kubernetes-ops -a codex2Manually: put the files in place
.agents/skills/kubernetes-ops/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill kubernetes-ops -a cursor2Manually: put the files in place
.cursor/skills/kubernetes-ops/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install BagelHole/DevOps-Security-Agent-Skills kubernetes-ops2Manually: put the files in place
.github/skills/kubernetes-ops/SKILL.md1Skills CLI (Vercel)
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill kubernetes-ops -a gemini-cli2Platform CLI
gemini skills install https://github.com/BagelHole/DevOps-Security-Agent-Skills --path devops/orchestration/kubernetes-opsManually: put the files in place
.devin/skills/kubernetes-ops/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill kubernetes-ops -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about kubernetes-ops
How do I install kubernetes-ops in Claude?
Run npx skills add BagelHole/DevOps-Security-Agent-Skills --skill kubernetes-ops -a claude-code. The skill file lands at ~/.claude/skills/kubernetes-ops/SKILL.md.
What does kubernetes-ops do?
It tells the agent how to describe and edit Kubernetes objects: deployments, services, ingresses, config, storage and jobs. It also supplies the commands for pod debugging and scaling.
What do I need before using it?
A working kubectl with access to a cluster. Some familiarity with containers helps too, since the examples assume images and container ports.
Source text
SKILL.md · MIT
---
name: kubernetes-ops
description: Deploy, scale, and manage Kubernetes workloads. Create deployments, services, and configurations, manage cluster resources, troubleshoot pods, and implement production-ready Kubernetes patterns. Use when working with Kubernetes clusters, K8s deployments, or container orchestration.
license: MIT
metadata:
author: devops-skills
version: "1.0"
---
# Kubernetes Operations
Deploy and manage containerized applications on Kubernetes clusters.
## When to Use This Skill
Use this skill when:
- Deploying applications to Kubernetes
- Managing pods, deployments, and services
- Configuring resource limits and scaling
- Troubleshooting Kubernetes workloads
- Setting up networking and ingress
## Prerequisites
- kubectl installed and configured
- Access to a Kubernetes cluster
- Basic understanding of containers
## Core Resources
### Deployment
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0.0
ports:
- containerPort: 8080
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: myapp-secrets
key: database-url
```
### Service
```yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: ClusterIP
---
# LoadBalancer for external access
apiVersion: v1
kind: Service
metadata:
name: myapp-external
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
```
### Ingress
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
tls:
- hosts:
- myapp.example.com
secretName: myapp-tls
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp
port:
number: 80
```
## Configuration Management
### ConfigMap
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
config.yaml: |
server:
port: 8080
logging:
level: info
APP_ENV: production
```
```yaml
# Using ConfigMap
containers:
- name: myapp
envFrom:
- configMapRef:
name: myapp-config
volumeMounts:
- name: config
mountPath: /etc/config
volumes:
- name: config
configMap:
name: myapp-config
```
### Secret
```yaml
apiVersion: v1
kind: Secret
metadata:
name: myapp-secrets
type: Opaque
stringData:
database-url: postgres://user:pass@host:5432/db
api-key: secret-key-value
```
```bash
# Create secret from command line
kubectl create secret generic myapp-secrets \
--from-literal=database-url='postgres://...' \
--from-file=tls.crt=cert.pem
```
## kubectl Commands
### Resource Management
```bash
# Apply configuration
kubectl apply -f deployment.yaml
# Get resources
kubectl get pods
kubectl get deployments
kubectl get services
kubectl get all -n myapp
# Describe resource
kubectl describe pod myapp-xxx
# Delete resource
kubectl delete -f deployment.yaml
kubectl delete pod myapp-xxx
# Edit resource
kubectl edit deployment myapp
```
### Debugging
```bash
# View logs
kubectl logs myapp-xxx
kubectl logs -f myapp-xxx --tail=100
kubectl logs myapp-xxx -c sidecar # specific container
# Execute command
kubectl exec -it myapp-xxx -- /bin/sh
# Port forward
kubectl port-forward svc/myapp 8080:80
kubectl port-forward pod/myapp-xxx 8080:8080
# View events
kubectl get events --sort-by='.lastTimestamp'
# Debug pod
kubectl debug myapp-xxx -it --image=busybox
```
### Scaling
```bash
# Manual scaling
kubectl scale deployment myapp --replicas=5
# Autoscaling
kubectl autoscale deployment myapp \
--min=2 --max=10 \
--cpu-percent=80
```
## Horizontal Pod Autoscaler
```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
```
## Persistent Storage
### PersistentVolumeClaim
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myapp-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard
resources:
requests:
storage: 10Gi
---
# Using PVC
containers:
- name: myapp
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: myapp-data
```
## StatefulSet
```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 3
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:15
ports:
- containerPort: 5432
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
```
## Jobs and CronJobs
### Job
```yaml
apiVersion: batch/v1
kind: Job
metadata:
name: migration
spec:
template:
spec:
containers:
- name: migrate
image: myapp:1.0.0
command: ["./migrate.sh"]
restartPolicy: Never
backoffLimit: 3
```
### CronJob
```yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: backup-tool:latest
command: ["./backup.sh"]
restartPolicy: OnFailure
```
## Network Policies
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: myapp-network-policy
spec:
podSelector:
matchLabels:
app: myapp
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432
```
## Resource Quotas
```yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: myapp-quota
namespace: myapp
spec:
hard:
requests.cpu: "10"
requests.memory: 20Gi
limits.cpu: "20"
limits.memory: 40Gi
pods: "20"
```
## Rolling Updates
```yaml
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
```
```bash
# Update image
kubectl set image deployment/myapp myapp=myapp:2.0.0
# Check rollout status
kubectl rollout status deployment/myapp
# View history
kubectl rollout history deployment/myapp
# Rollback
kubectl rollout undo deployment/myapp
kubectl rollout undo deployment/myapp --to-revision=2
```
## Common Issues
### Issue: Pod Stuck in Pending
**Problem**: Pod won't start
**Solution**: Check resource availability, node selector, PVC binding
```bash
kubectl describe pod myapp-xxx
kubectl get events
```
### Issue: CrashLoopBackOff
**Problem**: Container keeps restarting
**Solution**: Check logs, verify entrypoint, check probes
```bash
kubectl logs myapp-xxx --previous
kubectl describe pod myapp-xxx
```
### Issue: Service Not Accessible
**Problem**: Cannot connect to service
**Solution**: Check selector labels, verify endpoints exist
```bash
kubectl get endpoints myapp
kubectl describe svc myapp
```
### Issue: Image Pull Error
**Problem**: ImagePullBackOff
**Solution**: Check image name, verify registry credentials
```bash
kubectl create secret docker-registry regcred \
--docker-server=registry.example.com \
--docker-username=user \
--docker-password=pass
```
## Best Practices
- Always set resource requests and limits
- Implement liveness and readiness probes
- Use namespaces for isolation
- Apply network policies for security
- Use ConfigMaps and Secrets for configuration
- Implement pod disruption budgets for availability
- Use labels consistently for organization
- Enable RBAC for access control
## Related Skills
- [helm-charts](../helm-charts/) - Package management
- [argocd-gitops](../argocd-gitops/) - GitOps deployments
- [kubernetes-hardening](../../../security/hardening/kubernetes-hardening/) - Security
© devops-skills · MIT · BagelHole/DevOps-Security-Agent-Skills