Cyphernetes turns this: π£
# Select all zero-scaled Deployments in all namespaces,
# find all Ingresses routing to these deployments -
# for each Ingress change it's ingress class to 'inactive':
kubectl get deployments -A -o json | jq -r '.items[] | select(.spec.replicas == 0) | \
[.metadata.namespace, .metadata.name, (.spec.selector | to_entries | map("\(.key)=\(.value)") | \
join(","))] | @tsv' | while read -r ns dep selector; do kubectl get services -n "$ns" -o json | \
jq -r --arg selector "$selector" '.items[] | select((.spec.selector | to_entries | \
map("\(.key)=\(.value)") | join(",")) == $selector) | .metadata.name' | \
while read -r svc; do kubectl get ingresses -n "$ns" -o json | jq -r --arg svc "$svc" '.items[] | \
select(.spec.rules[].http.paths[].backend.service.name == $svc) | .metadata.name' | \
xargs -I {} kubectl patch ingress {} -n "$ns" --type=json -p \
'[{"op": "replace", "path": "/spec/ingressClassName", "value": "inactive"}]'; done; doneInto this: π€©
# Do the same thing!
MATCH (d:Deployment)->(s:Service)->(i:Ingress)
WHERE d.spec.replicas=0
SET i.spec.ingressClassName="inactive";Cyphernetes is a Cypher-inspired query language for Kubernetes. It is a mixture of ASCII-art, SQL and JSON and it lets us express Kubernetes operations in an efficeint way that is also fun and creative.
There are multiple ways to run Cyphernetes queries:
- Using the web client by running
cyphernetes webfrom your terminal, then visitinghttp://localhost:8080 - Using the interactive shell by running
cyphernetes shellin your terminal - Running a single query from the command line by running
cyphernetes query "your query"- great for scripting and CI/CD pipelines - Creating a Cyphernetes DynamicOperator using the cyphernetes-operator which lets you define powerful Kubernetes workflows on-the-fly
- Using the Cyphernetes API in your own Go programs
To learn more about how to use Cyphernetes, refer to these documents:
- LANGUAGE.md - a crash-course in Cyphernetes language syntax
- CLI.md - a guide to using Cyphernetes shell, query command and macros
- OPERATOR.md - a guide to using Cyphernetes DynamicOperator
# Get the desired and running replicas for all deployments
MATCH (d:Deployment)
RETURN d.spec.replicas AS desiredReplicas,
d.status.availableReplicas AS runningReplicas;
{
"d": [
{
"desiredReplicas": 2,
"name": "coredns",
"runningReplicas": 2
}
]
}
Query executed in 9.081292msCyphernetes' superpower is understanding the relationships between Kubernetes resource kinds.
This feature is expressed using the arrows (->) you see in the example queries.
Relationships let us express connected operations in a natural way, and without having to worry about the underlying Kubernetes API:
# This is similar to `kubectl expose`
> MATCH (d:Deployment {name: "nginx"})
CREATE (d)->(s:Service);
Created services/nginx
Query executed in 30.692208msUsing Homebrew:
brew install cyphernetesUsing go:
go install github.com/avitaltamir/cyphernetes/cmd/cyphernetes@latestAlternatively, grab a binary from the Releases page.
The Cyphernetes monorepo is a multi-package project that includes the core Cyphernetes Go package, a CLI, a web client, and an operator. Additionally, there's a grammer folder which contains the yacc grammar for generating the parser.
.
βββ cmd # The CLI (this is where the cyphernetes binary lives)
β βββ cyphernetes
β βββ ...
βββ grammar # The yacc grammar for generating the parser
β βββ ...
βββ operator # The operator
β βββ ...
βββ pkg # The core Cyphernetes package (and parser)
β βββ parser
β βββ ...
βββ web # The web client
β βββ src
β βββ ...
- Go (Latest)
- goyacc (for generating the parser)
- Make (for running make commands)
- NodeJS (Latest, for building the web client)
- pnpm (9+, for building the web client)
To get started with development:
Clone the repository:
git clone https://github.com/avitaltamir/cyphernetes.gitNavigate to the project directory:
cd cyphernetesRunning make will build the operator manifests and web client static assets, then build the binary and run the tests.
makemake web-buildmake operator-buildContributions are welcome! Please feel free to submit pull requests, open issues, and provide feedback.
Cyphernetes is open-sourced under the Apache 2.0 license. See the LICENSE file for details.
- Thanks to Neo4j for the inspiration behind the query language.
- Thanks to ggerganov for the dot-to-ascii project - it's the webserver that serves the ASCII art on https://ascii.cyphernet.es in case you want to host your own.
- Thanks to shlomif for the graph-easy project - it's the package that actually converts the dot graphs into ASCII art used by dot-to-ascii.
- Thanks anthonybrice and chenrui333 for getting us into Homebrew.
- Initial work - Avital Tamir
- Query engine enhancements, Bug fixes - James Kim