A kubectl plugin to visualize Kubernetes resources and relationships.
当前访问频次受限,请登录后继续访问
kubectl-graph
kubectl 插件,用于可视化 Kubernetes 资源及其关系。
前提条件
该插件需要 Graphviz、Neo4j 或 ArangoDB 才能可视化依赖图。
Graphviz
默认 输出格式需要 dot 将输出转换为便于使用的格式。
brew install graphviz
Neo4j
CQL 输出格式要求使用 cypher-shell 连接 Neo4j 数据库。
brew install cypher-shell
ArangoDB
AQL 输出格式需要使用 curl 和 jq 向 ArangoDB 服务器发起 API 请求。
brew install curl jq
是否有遗漏?请提交 issue 或创建 pull request。
安装
该 kubectl 插件通过 krew 分发。要安装它,请运行以下命令:
kubectl krew install graph
用法
总体上,该插件的工作方式类似于 kubectl get,但会先解析 Kubernetes 资源之间的关系,然后再以 AQL、CQL 或 DOT 格式输出图形。默认情况下,插件使用 DOT 作为输出格式。
kubectl graph [(-o|--output=)aql|arangodb|cql|cypher|dot|graphviz|mermaid] (TYPE[.VERSION][.GROUP] ...) [flags]
快速入门
本快速入门指南以 macOS 为例。在其他操作系统上,命令可能会有所不同。
Graphviz

当你已安装 dot 命令行工具后,即可获取 kube-system 命名空间下所有正在运行的 Pod,并将输出直接传递给 dot 命令。
kubectl graph pods --field-selector status.phase=Running -n kube-system | dot -T svg -o pods.svg
现在,当前工作目录下会有一个 pods.svg 文件,可使用任意网页浏览器查看:
open pods.svg
如果你对 SVG 作为输出格式不满意,请查看官方 文档。
Neo4j

在导入所有 Kubernetes 资源之前,你需要创建一个 Neo4j 数据库。
这可以有多种实现方式,具体取决于你的偏好。
Docker
Docker 是使用 Neo4j 服务器和空数据库最便捷的入门方式。
docker run --rm -p 7474:7474 -p 7687:7687 -e NEO4J_AUTH=neo4j/secret neo4j
当容器启动并正常运行后,您可以打开 http://localhost:7474/ 处的 Neo4j Browser 界面。
Neo4j Desktop
Neo4j Desktop 应用可轻松创建任意数量的本地数据库。
brew install --cask neo4j
安装完成后,打开 Neo4j Desktop.app,并执行以下步骤:
- 创建新项目,并为其命名。
- 创建一个本地 DBMS,例如使用
quickstart作为名称和secret作为密码。 - 点击 Start,然后输入密码。
- 数据库启动并正常运行后,点击 Open 打开 Neo4j Browser 界面。

打开 Neo4j Browser 界面后,就可以开始获取 kube-system 命名空间中的所有资源,并将输出直接通过管道传递给 cypher-shell 命令。
kubectl graph all -n kube-system -o cypher | cypher-shell -u neo4j -p secret
最后,在 Neo4j Browser 界面中,你可以在命令行输入以下查询:
MATCH (n) RETURN n // Render all nodes as a visual graph
MATCH (n) DETACH DELETE n // Delete all nodes and relationships
有关 Cypher 查询语言的更多信息,请参阅官方 文档。
ArangoDB

在导入所有 Kubernetes 资源之前,你需要先创建一个 ArangoDB 数据库。
可通过多种方式完成,具体取决于你的偏好。
Docker
Docker 是启动 ArangoDB 服务器并创建空数据库的最简单方式。
docker run --rm -p 8529:8529 -e ARANGO_NO_AUTH=1 arangodb
当容器启动并运行后,即可通过 http://localhost:8529/ 打开 ArangoDB Browser 界面。
如果你从空数据库开始,需要创建两个集合,一个用于资源,另一个用于关系。
curl http://localhost:8529/_api/collection -d '{"type": 2, "name": "resources"}'
curl http://localhost:8529/_api/collection -d '{"type": 3, "name": "relationships"}'
之后,您还需要创建一个 graph,需提供其名称以及边的定义。
curl http://localhost:8529/_api/gharial -d @- <<EOF
{"name": "quickstart", "edgeDefinitions": [
{"collection": "relationships", "from": ["resources"], "to": ["resources"]}
]}
EOF
最后,当你创建好这两个集合后,就可以开始获取
kube-system 命名空间中的所有资源,并将输出直接通过管道发送到 ArangoDB HTTP API 端点。
kubectl graph all -n kube-system -o aql \
| eval 'jq -n --arg stdin "$(cat)" "{query:\$stdin}"' \
| curl http://localhost:8529/_api/cursor -d @-
有关 HTTP API 的更多信息,请参阅官方 文档。
示例
Grafana Loki
Loki 是一个受 Prometheus 启发的、横向可扩展、高可用、多租户的日志聚合系统。

kubectl graph all -n loki -o cypher | cypher-shell -u neo4j -p secret
开发
如果您希望参与插件开发,请先在本地安装 Go 然后运行以下命令即可测试您的改动:
go run ./cmd/kubectl-graph/main.go all -n <namespace> | dot -T png -o all.png
许可证
本项目基于 Apache License 2.0 授权,详见 LICENSE。