You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Graphviz布局调整:将Openshift/letsencrypt移至Stage/Prod下方及节点组织问询

解答你的Graphviz布局与节点归类问题

1. 用rank属性调整Openshift与letsencrypt的位置

当然可以!Graphviz的rank属性就是专门用来控制节点/子图垂直(或水平)层级的工具。默认布局是从上到下(rankdir=TB),我们可以通过定义rank组,轻松把Stage、Prod集群放在同一上层,让Openshift集群和letsencrypt节点固定在它们的下方。

具体实现思路:

  • 先创建一个rank组,把Stage和Prod的核心标识设为同一层级,确保它们横向对齐
  • 再创建另一个rank组,把Openshift集群和letsencrypt节点归为一组,通过隐形边或者rank约束,强制这个组位于Stage/Prod的下方,避免自动布局打乱层级

2. 不用子图归类Stage下的节点

完全没问题!如果不想用嵌套子图来分组fe03-osl2-stage和fe04-osl3-stage的节点,我们可以用无形状的标签节点配合rank=same来实现逻辑归类:

  • 创建一个仅显示文字的标签节点(设置shape=none),用来替代子图的label
  • 把同属fe03-osl2-stage的haproxy、varnish节点设为同一水平,fe04-osl3-stage的节点也同理
  • 用隐形边把标签节点和所属的业务节点关联,维持逻辑分组的视觉对齐

修改后的完整Graphviz代码

digraph G {
    label = "Setup"
    labelloc = top;
    node [shape=record];
    edge [dir=both];

    subgraph cluster_0 {
        label = "Internet";
        tcp80 [label="*:80/tcp"];
        tcp443 [label="*:443/tcp"];
        tcp8443 [label="*:8443/tcp"];
    }

    // Stage分组:不用子图,用标签节点+rank控制
    Stage_label [label="Stage", shape=none, fontsize=14, fontweight=bold];
    {rank=same; 
        "fe03-osl2-stage-haproxy" [label= "HaProxy"];
        "fe03-osl2-stage-varnish" [label= "Varnish"];
    }
    {rank=same; 
        "fe04-osl3-stage-haproxy" [label= "HaProxy"];
        "fe04-osl3-stage-varnish" [label= "Varnish"];
    }
    // 隐形边维持标签与节点的层级对齐
    Stage_label -> "fe03-osl2-stage-haproxy" [style=invis];
    Stage_label -> "fe04-osl3-stage-haproxy" [style=invis];

    // Prod分组:同样采用无图归类方式
    Prod_label [label="Prod", shape=none, fontsize=14, fontweight=bold];
    {rank=same; 
        "fe03-osl2-prod-haproxy" [label= "HaProxy"];
        "fe03-osl2-prod-varnish" [label= "Varnish"];
    }
    {rank=same; 
        "fe04-osl3-prod-haproxy" [label= "HaProxy"];
        "fe04-osl3-prod-varnish" [label= "Varnish"];
    }
    Prod_label -> "fe03-osl2-prod-haproxy" [style=invis];
    Prod_label -> "fe04-osl3-prod-haproxy" [style=invis];

    subgraph cluster_3 {
        label = "Openshift";
        master0 [label= "master0"];
        master1 [label= "master1"];
        master3 [label= "master3"];
    }
    letsencrypt [label= "letsencrypt"];

    // 全局层级控制
    {rank=same; Stage_label; Prod_label;} // Stage和Prod横向对齐
    {rank=same; cluster_3; letsencrypt;} // Openshift与letsencrypt横向对齐
    // 隐形边强制层级顺序,确保下方组在Stage/Prod之后
    "fe03-osl2-stage-varnish" -> cluster_3 [style=invis];
    "fe04-osl3-prod-varnish" -> letsencrypt [style=invis];

    // 原有业务边关系保持不变
    tcp80 -> "fe03-osl2-stage-haproxy";
    tcp443 -> "fe03-osl2-stage-haproxy";
    tcp80 -> "fe04-osl3-stage-haproxy";
    tcp443 -> "fe04-osl3-stage-haproxy";
    tcp8443 -> "fe03-osl2-stage-haproxy";
    tcp8443 -> "fe04-osl3-stage-haproxy";
    tcp80 -> "fe03-osl2-prod-haproxy";
    tcp443 -> "fe03-osl2-prod-haproxy";
    tcp80 -> "fe04-osl3-prod-haproxy";
    tcp443 -> "fe04-osl3-prod-haproxy";

    "fe03-osl2-stage-haproxy" -> "fe03-osl2-stage-varnish";
    "fe04-osl3-stage-haproxy" -> "fe04-osl3-stage-varnish";
    "fe03-osl2-prod-haproxy" -> "fe03-osl2-prod-varnish";
    "fe04-osl3-prod-haproxy" -> "fe04-osl3-prod-varnish";

    "fe03-osl2-stage-haproxy" -> letsencrypt;
    "fe04-osl3-stage-haproxy" -> letsencrypt;
    "fe03-osl2-prod-haproxy" -> letsencrypt;
    "fe04-osl3-prod-haproxy" -> letsencrypt;

    "fe03-osl2-stage-haproxy" -> master0;
    "fe03-osl2-stage-haproxy" -> master1;
    "fe03-osl2-stage-haproxy" -> master3;
    "fe04-osl3-stage-haproxy" -> master0;
    "fe04-osl3-stage-haproxy" -> master1;
    "fe04-osl3-stage-haproxy" -> master3;
    "fe03-osl2-prod-haproxy" -> master0;
    "fe03-osl2-prod-haproxy" -> master1;
    "fe03-osl2-prod-haproxy" -> master3;
    "fe04-osl3-prod-haproxy" -> master0;
    "fe04-osl3-prod-haproxy" -> master1;
    "fe04-osl3-prod-haproxy" -> master3;

    "fe03-osl2-stage-varnish" -> master0;
    "fe03-osl2-stage-varnish" -> master1;
    "fe03-osl2-stage-varnish" -> master3;
    "fe04-osl3-stage-varnish" -> master0;
    "fe04-osl3-stage-varnish" -> master1;
    "fe04-osl3-stage-varnish" -> master3;
    "fe03-osl2-prod-varnish" -> master0;
    "fe03-osl2-prod-varnish" -> master1;
    "fe03-osl2-prod-varnish" -> master3;
    "fe04-osl3-prod-varnish" -> master0;
    "fe04-osl3-prod-varnish" -> master1;
    "fe04-osl3-prod-varnish" -> master3;
}

关键细节说明

  • 层级控制:通过rank=same分组确保Stage和Prod横向对齐,再用隐形边强制Openshift与letsencrypt处于下方层级,避免Graphviz自动布局的随机调整
  • 无图归类:用shape=none的标签节点替代子图容器,既保留了分组标签的视觉效果,又避免了嵌套子图的结构限制

内容的提问来源于stack exchange,提问作者user3297323

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:01:53