Kubevious CLI - Prevent Kubernetes disasters at the early stages
Kubevious CLI - Prevent Kubernetes disasters at the early stages
Kubevious CLI is an app-centric assurance and validation tool for Kubernetes. It helps modern teams rapidly release cloud-native applications without disasters, costly outages, and compliance violations by validating changes before they even reach the clusters. Kubevious CLI detects and prevents errors(typos, misconfigurations, conflicts, inconsistencies) and violations of best practices. Our secret sauce is based on the ability to validate across multiple manifests, regardless if they are already in the K8s clusters or are yet to be applied. Kubevious CLI can be used as a standalone tool during the active development of YAML manifests and can also be easily integrated into GitOps processes and CI/CD pipelines to validate changes toward live Kubernetes clusters. Kubevious CLI was created based on the experience and the lessons learned from the Kubevious Dashboard project and uses the evolution of its rules framework.
Kubevous CLI validates manifests from a variety of sources:
If you have Node.js v14 or higher:
$ npm install -g kubevious$ kubevious guard samples/$ brew install kubevious$ kubevious guard samples/All-in-one executables for Linux, Alpine, Mac OS, and Windows, including x64 and arm64 architectures. Download from the GitHub Releases or install using:
curl https://get.kubevious.io/cli.sh | bashThe script above would download the binary to /usr/local/bin/
Some environments have the /usr/local/bin/ path owned by root, so it may require running like this:
curl https://get.kubevious.io/cli.sh -o install-kubevious.sh && chmod +x install-kubevious.sh && sudo ./install-kubevious.sh && rm install-kubevious.shRun in a container:
$ docker run --rm kubevious/cli --helpValidate the entire manifests directory:
$ docker run --rm -v ${PWD}/samples:/src kubevious/cli guard /srcValidate manifests from pipe stream:
$ cat manifests.yaml | docker run --rm -i kubevious/cli guard --streamKubevious CLI Integrates with modern CI/CD platforms. Learn more here.
Try it yourself:
$ git clone https://github.com/kubevious/cli.git kubevious-cli.git
$ cd kubevious-cli.git/samplesThe guard command performs linting of YAML syntax & API correctness and checks for violations of best-practices rules.
Will complain about not being able to find the corresponding application matching the label selector:
$ kubevious guard pepsi/service.yaml
📜 [ClusterRule] service-selector-ref
🌐 WEB: https://raw.githubusercontent.com/kubevious/rules-library/master/k8s/service/service-selector-ref.yaml
❌ Rule failed
Violations:
❌ Namespace: pepsi, API: v1, Kind: Service, Name: emailservice
📄 FILE: pepsi/service.yaml
🔴 Could not find Applications for ServicePassing the Deployment along with the Service would help the validation pass:
$ kubevious guard pepsi/service.yaml pepsi/deployment.yaml
📜 [ClusterRule] service-selector-ref
🌐 WEB: https://raw.githubusercontent.com/kubevious/rules-library/master/k8s/service/service-selector-ref.yaml
✅ Rule passed
Passed:
✅ Namespace: pepsi, API: v1, Kind: Service, Name: emailservice
📄 FILE: pepsi/service.yamlAlternatively, if the dependent Deployment is already present in the K8s cluster, the Service can be validated against the live K8s cluster:
$ kubevious guard pepsi/service.yaml --live-k8s
📜 [ClusterRule] service-selector-ref
🌐 WEB: https://raw.githubusercontent.com/kubevious/rules-library/master/k8s/service/service-selector-ref.yaml
✅ Rule passed
Passed:
✅ Namespace: pepsi, API: v1, Kind: Service, Name: emailservice
📄 FILE: pepsi/service.yamlAlthough changing pod labels in pepsi/deployment.yaml would break the Service label selector, even though the correct Deployment is already in the K8s cluster:
spec:
selector:
matchLabels:
app: emailserviceX # label is inconsistent with Service label selector
template:
metadata:
labels:
app: emailserviceX # label is inconsistent with Service label selector$ kubevious guard pepsi/service.yaml pepsi/deployment.yaml --live-k8s
📜 [ClusterRule] service-selector-ref
🌐 WEB: https://raw.githubusercontent.com/kubevious/rules-library/master/k8s/service/service-selector-ref.yaml
❌ Rule failed
Violations:
❌ Namespace: pepsi, API: v1, Kind: Service, Name: emailservice
📄 FILE: pepsi/service.yaml
🔴 Could not find Applications for ServiceThe guard command performs linting underneath, so the guard users don't need to run lint separately.
$ kubevious lint invalid-service-1.yaml
ℹ️ Linting against Kubernetes Version: 1.25.2
❌ 📄 FILE: invalid-service-1.yaml
❌ API: v1, Kind: Service, Name: db
❌ Required property "port" missing under "/spec/ports/0"$ kubevious lint hpa.yaml --k8s-version 1.21
ℹ️ Linting against Kubernetes Version: 1.21.14
❌ 📄 FILE: hpa.yaml
❌ Namespace: ordering, API: autoscaling/v2, Kind: HorizontalPodAutoscaler, Name: orderservice
🔴 Unknown API Resource. apiVersion: autoscaling/v2, kind: HorizontalPodAutoscaler.$ kubevious lint hpa.yaml --k8s-version 1.23
ℹ️ Linting against Kubernetes Version: 1.23.12
✅ 📄 FILE: hpa.yaml
✅ Namespace: ordering, API: autoscaling/v2, Kind: HorizontalPodAutoscaler, Name: orderservice$ kubevious lint istio-gateway.yaml --ignore-unknown
⚠️ 📄 FILE: istio-gateway.yaml
⚠️ Namespace: hipster, API: networking.istio.io/v1alpha3, Kind: Gateway, Name: frontend-gateway
⚠️ Unknown API Resource. apiVersion: networking.istio.io/v1alpha3, kind: Gateway.
✅ Lint Succeeded.$ kubevious lint istio-gateway.yaml --live-k8s
ℹ️ Linting against Kubernetes Version: v1.24.0
✅ 📄 FILE: data/istio-gateway.yaml
✅ Namespace: hipster, API: networking.istio.io/v1alpha3, Kind: Gateway, Name: frontend-gateway$ kubevious lint cr-good.yaml crd.yaml
ℹ️ Linting against Kubernetes Version: 1.25.2
✅ 📄 FILE: cr-good.yaml
✅ Namespace: coke, API: example.com/v1alpha1, Kind: MyPlatform, Name: test-dotnet-app
✅ 📄 FILE: crd.yaml
✅ API: apiextensions.k8s.io/v1, Kind: CustomResourceDefinition, Name: myplatforms.example.comKubevious CLI executes the Helm template whenever a Helm chart is discovered.
$ kubevious guard path-to-helm-chart-directoryIt is also possible to pass remote Helm repos to validate
$ helm repo add traefik https://helm.traefik.io/traefik
$ kubevious guard @helm@traefik/traefikUse values to specify Helm overrides file and inline values
$ kubevious guard @helm@traefik/traefik@values=overrides/prod.yaml@set=persistence.enabled=trueSupported Helm parameters:
| Key | Description |
|---|---|
| values | Path to Helm overrides path |
| namespace | The namespace |
| release-name | The release name |
| crds | Possible values: "include" or "skip" |
| set | Inline value overrides "key=value" |
Kubevious CLI executes Kustomize build as soon as it discovers kustomization.yaml files. Every files within that directory will be ignored.
$ kubevious guard path-to-kustomize-directory-or-fileThe tool can be used to troubleshoot existing clusters and manifests:
kubevious guard --live-k8s --include-remote-targets --namespace default$ kubevious guard sveltos/ pepsi/Primary usage is to validate template outputs such as Helm Charts, Kuztomize, Carvel, etc.
$ ytt -f my-app/ | kubevious guard --stream
❌ ♒ STREAM: stream
❌ Namespace: default, API: traefik.containo.us/v1alpha1, Kind: IngressRoute, Name: release-name-traefik-dashboard
🔴 Unknown API Resource. apiVersion: traefik.containo.us/v1alpha1, kind: IngressRoute.Also can pass additional manifests, such as CRDs, Rules, etc., for validation along with the steam input.
$ ytt -f my-app/ | kubevious guard --stream https://raw.githubusercontent.com/traefik/traefik-helm-chart/master/traefik/crds/ingressroute.yaml
✅ Guard Succeeded.Mount a local directory to /src in the container. The