nitinjain999/platform-skills/kubernetes

Claude Code and agent skill by nitinjain999/platform-skills

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Cluster baseline scaffolding, RBAC diagnosis and generation, workload hardening, and structured pod/scheduling debug for plain Kubernetes across all distributions.

Install

npx vskill@latest install nitinjain999/platform-skills/kubernetes

SKILL.md

Kubernetes Command

Structured guidance for cluster baseline standards, RBAC, workload patterns, and operational debugging on Kubernetes.

Activation

/platform-skills:kubernetes baseline # generate namespace, RBAC, network policy, PDB, quota scaffold
/platform-skills:kubernetes rbac # diagnose 401/403; generate Role/RoleBinding; simulate access
/platform-skills:kubernetes workload # Deployment, HPA, probes, securityContext hardening
/platform-skills:kubernetes debug # pod crashloop, OOMKill, pending scheduling, image pull errors

Interactive Wizard (fires when no mode is provided)

When invoked with no arguments, ask before proceeding:

Q1 — Mode?

What do you need?
1. baseline — namespace, RBAC, network policy, PDB, resource quota scaffold
2. rbac — diagnose 401/403, generate Role/RoleBinding, simulate access
3. workload — Deployment, HPA, probes, securityContext, PDB hardening
4. debug — crashloop, OOMKill, pending, image pull, general troubleshoot
Enter 1–4 or mode name:

Q2 — Context (after mode selected):

  • baseline: Which namespace? What team owns it? Any special requirements (privileged workloads, GPU, ingress)?
  • rbac: Paste the 403 error message or describe which service account needs which access.
  • workload: Paste the Deployment manifest or describe what the workload does.
  • debug: Paste the pod describe output and recent logs, or describe the symptom.

Mode: baseline

Triggers: baseline, scaffold, new namespace, set up namespace, platform baseline

Read references/kubernetes.md before responding.

Generate the minimum platform baseline for a new namespace. Ask for namespace name and team before generating.

Namespace with ownership labels
yaml
apiVersion: v1
kind: Namespace
metadata:
name: app-team
labels:
team: app-team
environment: production
managed-by: platform
annotations:
contact: platform@org.com
Resource quota
yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: app-team-quota
namespace: app-team
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
pods: "20"
persistentvolumeclaims: "10"
LimitRange — container defaults
yaml
apiVersion: v1
kind: LimitRange
metadata:
name: container-defaults
namespace: app-team
spec:
limits:
- type: Container
default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 128Mi
Default-deny network policy
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: app-team
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
---
# Allow DNS egress — required for pod name resolution
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns-egress
namespace: app-team
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- ports:
- port: 53
protocol: UDP
- port: 53
protocol: TCP
PodDisruptionBudget
yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: app-pdb
namespace: app-team
spec:
minAvailable: 1 # keep at least 1 pod running during voluntary disruptions
selector:
matchLabels:
app: app-team
Validation
bash
kubectl apply --dry-run=server -f namespace-baseline/
# Confirm quota is applied
kubectl describe resourcequota app-team-quota -n app-team
# Confirm network policy is in place
kubectl get networkpolicy -n app-team
# Test DNS still works from a pod
kubectl run dns-test --image=busybox --restart=Never --rm -it -n app-team \
-- nslookup kubernetes.default

Handoffs:

  • Policy enforcement on these namespaces → /platform-skills:kyverno or /platform-skills:opa
  • Secrets strategy for the namespace → /platform-skills:secrets
  • Measure the result against NSA or the provider's CIS benchmark → /platform-skills:kubescape cluster (kubescape scan framework nsa --include-namespaces app-team)
  • Allow rules for the default-deny policy, drafted from the traffic the workloads actually send → /platform-skills:kubescape-operator netpol

Mode: rbac

Triggers: 401, 403, forbidden, unauthorized, role, binding, service account, RBAC, can-i

Read references/kubernetes.md → RBAC troubleshooting section before responding.

Step 1 — Diagnose 401 vs 403
CodeLayerFirst check
401 UnauthorizedAuthentication failedkubectl auth whoami — confirm identity
403 ForbiddenAuthorized identity, missing permissionkubectl auth can-i — confirm what is allowed
Step 2 — Simulate the failing request
bash
# Test exactly what the service account can do
kubectl auth can-i <verb> <resource> \
--as=system:serviceaccount:<namespace>:<sa-name> \
-n <namespace>
# Examples
kubectl auth can-i get pods \
--as=system:serviceaccount:app-team:app-controller \
-n app-team
kubectl auth can-i list secrets \
--as=system:serviceaccount:app-team:app-controller \
-n app-team
Step 3 — Find existing bindings for the service account
bash
kubectl get rolebindings,clusterrolebindings -A -o json \
| jq -r '
.items[]
| select(
.subjects[]?
| select(.kind=="ServiceAccount"
and .name=="<sa-name>"
and .namespace=="<namespace>")
)
| "\(.kind)/\(.metadata.namespace)/\(.metadata.name) -> \(.roleRef.name)"'
Step 4 — Generate minimum Role and RoleBinding
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: app-team
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: app-team
subjects:
- kind: ServiceAccount
name: app-controller
namespace: app-team
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Scope selection
SituationUse
Workload needs access within one namespaceRoleBinding → Role
Reuse a cluster role, scoped to one namespaceRoleBinding → ClusterRole
Controller needs cross-namespace or node accessClusterRoleBinding → ClusterRole

Prefer the narrowest scope. Audit ClusterRoleBinding usage regularly:

bash
kubectl get clusterrolebindings -o json \
| jq -r '.items[] | select(.subjects[]?.kind=="ServiceAccount") | "\(.metadata.name) -> \(.roleRef.name)"'
Validation
bash
kubectl auth can-i get pods \
--as=system:serviceaccount:app-team:app-controller \
-n app-team
# expected: yes
kubectl auth can-i delete pods \
--as=system:serviceaccount:app-team:app-controller \
-n app-team
# expected: no

Rollback: Delete the RoleBinding. Roles and bindings are additive — removing them revokes the access without affecting running workloads beyond that access.


Mode: workload

Triggers: deployment, statefulset, HPA, probes, securityContext, harden, resources, requests, limits

Read references/kubernetes.md before responding.

Hardened Deployment template
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
namespace: app-team
labels:
app: app
version: "1.0.0"
spec:
replicas: 2
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
spec:
serviceAccountName: app-sa # dedicated SA, not default
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 2000
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: ghcr.io/org/app:1.0.0
ports:
- containerPort: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 256Mi # no CPU limit — throttles unnecessarily
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 2
startupProbe: # protects slow-starting apps from liveness kills
httpGet:
path: /healthz
port: 8080
failureThreshold: 30
periodSeconds: 10
HPA — only when requests and metrics are defined
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
namespace: app-team
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70

For event-driven or custom metric scaling → /platform-skills:keda

Common hardening gaps
GapFix
No resources.requestsPod is unschedulable under resource pressure; add requests
resources.limits.cpu setCauses throttling even when cores are idle; remove CPU limit unless hard isolation is needed
runAsRoot: true or no runAsNonRootRun as non-root; most app images support UID 1000+
No readinessProbePod receives traffic before it is ready; add readiness probe
No startupProbe for slow appsLiveness kills pods during slow start; add startup probe
default service accountCreates implicit access to cluster APIs; create a dedicated SA

Find these gaps across a whole manifest tree or cluster at once: kubescape scan framework nsa <path> (or with no path for the current cluster) lists each as a failed control with the affected resources → /platform-skills:kubescape.


Mode: debug

Triggers: crashloop, OOMKilled, pending, ImagePullBackOff, ErrImagePull, error, not starting, debug

Apply the structured checklist:

Step 1 — Collect evidence
bash
# Pod state and recent events
kubectl get pod <pod-name> -n <namespace>
kubectl describe pod <pod-name> -n <namespace>
# Container logs — current and previous (if restarted)
kubectl logs <pod-name> -n <namespace>
kubectl logs <pod-name> -n <namespace> --previous
# Recent events in the namespace
kubectl get events -n <namespace> --sort-by='.lastTimestamp' | tail -20
Step 2 — Classify by symptom

CrashLoopBackOff

bash
# Application is starting and exiting — check exit code and logs
kubectl describe pod <pod-name> -n <namespace> | grep -A5 "Last State"
kubectl logs <pod-name> -n <namespace> --previous

Common causes: application error on startup, missing env var or secret, wrong entrypoint, liveness probe killing a slow-starting pod (add startupProbe).

OOMKilled

bash
# Check memory usage vs limit
kubectl top pod <pod-name> -n <namespace> --containers
kubectl get pod <pod-name> -n <namespace> \
-o jsonpath='{.spec.containers[*].resources}'
# Check OOM events
kubectl describe pod <pod-name> -n <namespace> | grep -i oom

Fix: increase resources.limits.memory or profile the application for a memory leak. Never remove the limit — set it correctly.

Pending

bash
# Events show why scheduling failed
kubectl describe pod <pod-name> -n <namespace> | grep -A10 "Events:"

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 90 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

7-day trend score
0

Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/nitinjain999/platform-skills/kubernetes/badge)](https://verified-skill.com/skills/nitinjain999/platform-skills/kubernetes)

Something wrong with this skill or its page? Tell us.