Skip to content

Best Practices

When mille’s YAML checks are useful

mille’s YAML support focuses on naming convention checks via name_deny. It shines in these use cases:

  • Cross-layer naming consistency: Ensure cloud-provider-specific keywords (aws, gcp) don’t leak into base/ layers
  • Environment separation: Verify that production or staging don’t appear in model-config/
  • Unified rules for code and config: Check Rust/Python source code and YAML config files with the same mille.toml

Tool comparison

Aspectmillekube-linterconftestKyverno CLI
PurposeLayer boundary naming rulesK8s best practicesGeneral-purpose policy (Rego)K8s policy (CEL/Rego)
ScopeSource code + YAMLK8s manifestsAny structured dataK8s manifests
Rule formatTOML (declarative)Built-in checksRegoYAML (ClusterPolicy)
Learning curveLowLowMedium–HighMedium
CI integrationmille checkkube-linter lintconftest testkyverno apply
Source code support9 languages + YAMLNoneNoneNone

Combining tools

mille → Naming boundaries (across source code + YAML)
kube-linter → K8s best practices (resource limits, security)
conftest → General-purpose policy (custom organizational rules)
Kyverno CLI → Admission dry-run (final validation before production)

CI pipeline example

jobs:
lint:
steps:
# 1. Architecture + naming checks
- run: mille check
# 2. K8s best practices
- run: kube-linter lint manifests/
# 3. Custom policies
- run: conftest test manifests/ -p policy/

Decision guide

  • “This layer must not contain a specific keyword” → mille
  • “Do K8s resources have resource limits?” → kube-linter
  • “Do resources follow our org’s labeling conventions?” → conftest
  • “Validate against production cluster policies before deploy” → Kyverno CLI