Comprehensive toolkit for validating, linting, and testing Kubernetes YAML resources. Use this skill when validating Kubernetes manifests, debugging YAML syntax errors, performing dry-run tests on clusters, or working with Custom Resource Definitions (CRDs) that require documentation lookup.
Overall
score
93%
Does it follow best practices?
Validation for skill structure
This skill provides a comprehensive validation workflow for Kubernetes YAML resources, combining syntax linting, schema validation, cluster dry-run testing, and intelligent CRD documentation lookup. Validate any Kubernetes manifest with confidence before applying it to the cluster.
IMPORTANT — REPORT-ONLY: Do NOT modify files, use the Edit tool, or offer to apply fixes. Generate a comprehensive validation report with suggested fixes shown as before/after code blocks, then let the user decide what to do next.
Follow this sequential validation workflow. Each stage catches different types of issues:
Before running any validation tools, check the file complexity:
--- document separators or parsing the filereferences/validation_workflow.md:
Read references/validation_workflow.mdbash scripts/setup_tools.shRequired tools: yamllint, kubeconform, kubectl (optional). If tools are missing, display installation instructions from script output and document missing tools in the validation report.
yamllint -c assets/.yamllint <file.yaml>Report all syntax issues with file:line references. Show suggested before/after code blocks. Continue to the next stage to collect all issues before reporting.
bash scripts/detect_crd_wrapper.sh <file.yaml>The wrapper script automatically handles Python dependencies via a temporary virtual environment if PyYAML is not available.
Resilient Parsing: The script parses valid documents and reports errors for invalid ones — continuing processing rather than aborting. This matches kubeconform's behavior of validating 2/3 resources when 1/3 has syntax errors.
Script outputs JSON with resource information and parse status:
{
"resources": [
{
"kind": "Certificate",
"apiVersion": "cert-manager.io/v1",
"group": "cert-manager.io",
"version": "v1",
"isCRD": true,
"name": "example-cert"
}
],
"parseErrors": [
{
"document": 1,
"start_line": 2,
"error_line": 6,
"error": "mapping values are not allowed in this context"
}
],
"summary": {
"totalDocuments": 3,
"parsedSuccessfully": 2,
"parseErrors": 1,
"crdsDetected": 1
}
}For each detected CRD:
Try context7 MCP first (preferred):
Use mcp__context7__resolve-library-id with the CRD project name
Example: "cert-manager" for cert-manager.io CRDs
Then use mcp__context7__get-library-docs with:
- context7CompatibleLibraryID from resolve step
- topic: The CRD kind (e.g., "Certificate")
- tokens: 5000 (adjust based on need)Fallback to WebSearch if context7 fails:
"<kind>" "<group>" kubernetes CRD "<version>" documentation specExtract required spec fields, field types, validation rules, and version-specific changes.
Secondary CRD Detection: If detect_crd_wrapper.sh fails (e.g., all documents have syntax errors) but kubeconform validates a CRD resource, parse kubeconform output to identify those CRDs and perform context7/WebSearch lookups.
kubeconform \
-schema-location default \
-schema-location 'https://raw.githubusercontent.com/datreeio/CRDs-catalog/main/{{.Group}}/{{.ResourceKind}}_{{.ResourceAPIVersion}}.json' \
-strict \
-ignore-missing-schemas \
-summary \
-verbose \
<file.yaml>For CRDs where kubeconform reports "no schema found", use the documentation from Stage 3 to manually validate spec fields.
Always try server-side dry-run first — it runs through admission controllers and webhooks.
Decision Tree:
1. Try server-side dry-run first:
kubectl apply --dry-run=server -f <file.yaml>
└─ If SUCCESS → Use results, continue to Stage 6
└─ If FAILS with connection error ("connection refused", "unable to connect"):
│
├─ 2. Fall back to client-side dry-run:
│ kubectl apply --dry-run=client -f <file.yaml>
│ Document: "Server-side validation skipped (no cluster access)"
│
└─ If FAILS with validation error ("admission webhook denied", "resource quota exceeded"):
└─ Record the error, continue to Stage 6
└─ If FAILS with parse error ("error converting YAML to JSON"):
└─ Record the error, skip client-side dry-run (same error will occur)
Document: "Dry-run blocked by YAML syntax errors - fix syntax first"
Continue to Stage 6Document in your report which mode was used:
For updates to existing resources, also run:
kubectl diff -f <file.yaml>Constraint: Present the report and let the user take action — do NOT use the Edit tool or prompt the user to apply fixes.
Report structure:
Issue summary table:
| Severity | Stage | Location | Issue | Suggested Fix |
|----------|-------|----------|-------|---------------|
| Error | Syntax | file.yaml:5 | Indentation error | Use 2 spaces |
| Error | Schema | file.yaml:21 | Wrong type | Change to integer |
| Warning | Best Practice | file.yaml:30 | Missing labels | Add app label |Severity categories:
Before/after code blocks for each issue:
**Issue 1: deployment.yaml:21 - Wrong field type (Error) [Simple]**
Current:
```yaml
- containerPort: "80"Suggested Fix:
- containerPort: 80Why: containerPort must be an integer. Reference: k8s_best_practices.md "Invalid Values".
Use fix complexity indicators in issue headers:
- **[Simple]**: Single-line fixes (indentation, typos, value changes)
- **[Medium]**: Multi-line changes or adding missing fields/sections
- **[Complex]**: Logic changes, restructuring, or changes affecting multiple resourcesValidation summary:
## Validation Report Summary
File: deployment.yaml
Resources Analyzed: 3 (Deployment, Service, Certificate)
| Stage | Status | Issues Found |
|-------|--------|--------------|
| YAML Syntax | ❌ Failed | 2 errors |
| CRD Detection | ✅ Passed | 1 CRD detected (Certificate) |
| Schema Validation | ❌ Failed | 1 error |
| Dry-Run | ❌ Failed | 1 error |
Total Issues: 4 errors, 2 warnings
## Detailed Findings
[List each issue with before/after code blocks]
## Next Steps
1. Fix the 4 errors listed above (deployment will fail without these)
2. Consider addressing the 2 warnings for best practices
3. Re-run validation after fixes to confirm resolutionLoad when schema validation fails with type errors, reports missing required fields, or dry-run fails with validation errors:
Read references/k8s_best_practices.mdLoad when the file contains 3+ resources, or validation produces unfamiliar errors spanning multiple stages:
Read references/validation_workflow.mdWhen a YAML file contains multiple resources (separated by ---):
When a multi-document YAML file has some valid and some invalid documents:
detect_crd.py parses valid documents and skips invalid onesExample — 3 documents, document 1 has a syntax error:
| Document | Resource | Parsing | Validation |
|----------|----------|---------|------------|
| 1 | Deployment | ❌ Syntax error (line 6) | Skipped |
| 2 | Service | ✅ Parsed | ✅ Valid |
| 3 | Certificate | ✅ Parsed | ✅ Valid |Always use file-absolute line numbers (relative to the start of the entire file) — this matches what yamllint, kubeconform, and kubectl report, and lets users navigate directly to errors in their editor.
scripts/setup_tools.sh to check availability and get installation instructionskubectl get crd <crd-name>.group -o yaml
kubectl explain <kind>When presenting validation results:
file:line references for all issuesCan run in parallel:
yamllint (Stage 2) and detect_crd_wrapper.sh (Stage 3) operate independently on the input fileMust run sequentially:
Parallelising is most beneficial for files with more than 5 resources.
extensions/v1beta1 → apps/v1)kubectl api-versions to list available API versionsFor detailed test scenarios and expected outputs, load:
Read references/validation_workflow.md| Test File | Purpose | Expected Behavior |
|---|---|---|
deployment-test.yaml | Valid standard K8s resource | All stages pass, no errors |
certificate-crd-test.yaml | Valid CRD resource | CRD detected, context7 lookup performed, no errors |
comprehensive-test.yaml | Multi-resource with intentional errors | Syntax error detected, partial parsing works, CRD found |
deployment-test.yaml: All stages pass, 0 errors, 0 warningscertificate-crd-test.yaml: CRD detected, context7 MCP called, documentation retrievedcomprehensive-test.yaml: yamllint catches error, kubeconform partial validation, dry-run blockedcomprehensive-test.yaml: 2/3 resources validated, parse error for document 1setup_tools.sh reports missing, validation continues with available toolsdetect_crd_wrapper.sh — Wrapper that manages Python dependencies (auto-creates venv if PyYAML unavailable) and calls detect_crd.py.
Usage: bash scripts/detect_crd_wrapper.sh <file.yaml>
detect_crd.py — Parses YAML files to identify CRDs; extracts kind, apiVersion, group, version; outputs JSON.
Usage: python3 scripts/detect_crd.py <file.yaml>
setup_tools.sh — Checks for required validation tools, reports versions, provides installation instructions.
Usage: bash scripts/setup_tools.sh
k8s_best_practices.md — Kubernetes YAML best practices: metadata, labels, resource limits, security context, common validation issues.
validation_workflow.md — Detailed workflow, command options, error handling strategies, complete workflow diagram.
.yamllint — Pre-configured yamllint rules following Kubernetes conventions (2-space indentation, line length, etc.).
Usage: yamllint -c assets/.yamllint <file.yaml>
Install with Tessl CLI
npx tessl i pantheon-ai/k8s-yaml-validator@0.1.0