Kubernetes 集群与注册表

有些工作需要不止一台机器:部署到 Kubernetes 的服务、在一处构建、在另一处运行的镜像,或是拿来测试的云 API。Bromure Agentic Coding 可以替你在这台 Mac 上、在你的机器(在设置编辑器中即工作区)旁边运行那些基础设施:

  • Kubernetes 集群是一组运行 k3s 的节点 VM,可选择搭配复制式存储、负载均衡器、ingress 控制器与本地云模拟器。你允许的机器会在 ~/.kube/config 中取得它作为一个 context。
  • 注册表是一个位于自己小型 VM 中的私有 Docker 注册表。你允许的机器可以推送到它;每个集群都可以从它拉取。

两者都是共享资源:一个集群或注册表可服务多台机器,而它们的代理会通过基础设施 MCP 服务器得知它。

注意: 不要把这些集群与机器凭据窗格中的 Kubernetes 凭据搞混。那些是为存在于别处的集群(EKS、GKE、公司的集群)导入 context,并在线路上中转它们的凭据。本章的集群则是 Bromure 在这台 Mac 上创建并运行的 VM。

在哪里找到它们

  • **工作区 › 基础设施 › 创建 Kubernetes 集群…与创建注册表…**会打开创建面板。若前景是某台远程 Mac 的镜像窗口,这些项目会在那台 Mac 上创建集群或注册表(见远程访问)。
  • 一旦存在一个,侧边栏的虚拟机区段就会多出一份 Kubernetes 列表与一份注册表列表,各自带一个 + 可再创建一个。每一行显示一个状态圆点、名称与一行状况;点击它可把它的仪表板放上舞台。它的 ⋯ 菜单提供启动,或在运行中时提供重启与停止,以及工作区访问…与删除…。
主窗口的侧边栏,VIRTUAL MACHINES 区段已展开:网格,接着是机器 Payments API 与 Web app,每行各有一个 + 与 ⋯ 按钮。一旦存在集群或注册表,Kubernetes 与注册表的列表就会出现在这个区段中。

创建集群

新建集群面板有一个含六个窗格的侧边栏——通用、节点、存储、网络、附加组件、访问——就像机器的设置编辑器。在面板内容有效之前,创建会保持禁用;旁边一行简短文字说明原因(例如“请为集群取个名称。”)。

位于通用窗格的新建集群面板:侧边栏有通用、节点、存储、网络、附加组件与访问;名称字段、“随 Bromure 启动”开关,以及节点、存储、负载均衡器与附加组件的摘要。

通用

字段默认含义
名称Kube cluster节点的主机名、kubeconfig 的 context 与磁盘上的文件夹都由它衍生:节点会命名为 k8s-<名称>-1、-2…
随 Bromure 启动开启应用启动时开机这个集群。

一个摘要会列出你所选的节点、存储、负载均衡器与附加组件。

节点

字段范围默认
节点1–81
每节点 vCPU1–162
每节点内存2–64 GB4 GB

只有一个节点时,它会同时运行控制平面与你的工作负载。节点更多时,节点 1 是控制平面(仍然会运行工作负载),其余作为 worker 加入。窗格会显示总内存,并在这个集群会让其他一切只剩不到 4 GB 时警告“那是这台 Mac 的 M GB 之中的 N GB——工作区也需要空间。”

存储

  • Longhorn 分布式存储(默认开启)——以 iSCSI 从专属的每节点数据磁盘(默认 40 GB,10–2000 GB)提供的复制式块卷。这些磁盘是稀疏的:只有被写入的块才会占用 Mac 上的空间。Longhorn 最多保留三份副本,但绝不超过节点数。它的存储类是 bromure-longhorn,也是集群的默认。关掉之后,只剩下 k3s 的节点本地 local-path 类,那会把 pod 钉在它所在的节点上。
  • Synology NAS ——通过 Synology 的 CSI 驱动,在你的 NAS 上提供持久卷。填入 DSM 地址、端口、HTTPS、DSM 用户与 DSM 密码,选填卷(例如 /volume1, /volume3)、协议——iSCSI(块 LUN)或 SMB(共享文件夹)——以及文件系统。若未指定卷,DSM 会挑一个有空间的,类为 bromure-synology;指定卷则每个各得一个类(bromure-synology-volume1…)。第一个 Synology 类会成为集群的默认;Longhorn 仍可按名称使用。DSM 账号需要存储管理员的权限。密码会加密保存在这台 Mac 上,而且只会落在集群自己的 Secrets 中。

网络

负载均衡器决定 LoadBalancer 类型的 Service 如何取得地址:

选择行为
MetalLB,仅 VM 网络(默认)第二层的 MetalLB 从 VM 网络发放地址。集群设置时,VM 子网顶端的二十个地址会保留给它。可从机器与这台 Mac 连到;你的 LAN 上不会暴露任何东西。
Bromure LAN 负载均衡器每个 Service 的端口都会发布在这台 Mac 的 LAN 地址上,由主机转发进集群。若指定选填的 LAN 地址池(例如 10.0.0.20-10.0.0.29、10.0.0.32/28 或以逗号分隔的列表),每个 Service 会改为取得自己的一个空闲 LAN 地址,由 Mac 在网络上代为应答(ARP),形式类似 MetalLB。可从你的 LAN、这台 Mac 与各机器连到。
无(仅 NodePort)LoadBalancer 的 Service 会一直处于待决状态;请使用 NodePort 或 ClusterIP。

使用 Bromure LAN 负载均衡器时,两个 Service 注解可逐一改变默认:bromure.io/scope: vm 让它保持私有(VM 网络上的地址,只供各机器与这台 Mac),而 bromure.io/loadBalancerIP 可要求特定地址。

Traefik ingress 控制器(默认开启)保留 k3s 内附的 ingress。搭配 LAN 负载均衡器时,它会在这台 Mac 上发布 80 与 443 端口。

警告: Bromure LAN 负载均衡器会让集群的服务可被你网络上的任何人连到。请刻意选择它;默认的 MetalLB 会把一切留在这台 Mac 上。

附加组件

来自开源 floci 家族的本地云模拟器,每一个都是自有端口上的一个 LoadBalancer Service,数据放在集群的默认存储类上:

开关端口模拟(部分)
AWS 模拟器 (floci)4566S3、DynamoDB、SQS、SNS、Lambda、API Gateway、Step Functions、EventBridge、Cognito
Azure 模拟器 (floci-az)4577Blob、Queue 与 Table Storage、Cosmos DB、Key Vault、Service Bus、Event Hubs、Event Grid、Functions、Azure SQL、App Configuration
Google Cloud 模拟器 (floci-gcp)4588Cloud Storage、Pub/Sub、Firestore、Datastore、Secret Manager、Cloud KMS、Cloud Run、Cloud Functions、Cloud Tasks、Cloud SQL、BigQuery
Oracle Cloud 模拟器 (floci-oci)4599Object Storage、Queue、Streaming、Vault、KMS、Secrets、Functions、Identity、OKE

每个启用的模拟器都会有一个 项目 版本字段。留空(最新发行版)表示在集群设置时取得 Docker Hub 上最新的发行版;输入标签(2.1.0)或完整的镜像引用可将它固定。若无法连到 Docker Hub,就会使用 latest 标签。会启动容器的服务(Lambda、Cloud Run 之类)使用节点的 Docker,属于尽力而为。

访问

哪些机器会取得这个集群:

  • 所有工作区,包含新建的(默认),或
  • 仅这些工作区,每台机器一个复选框。“至少必须有一个工作区保有访问权。”

列表上的机器会在它们的 ~/.kube/config 中取得这个集群(context 以集群名称命名),并通过基础设施 MCP 看到它。你之后可以从仪表板更改这项设置。

点击创建。预配需要几分钟;仪表板的日志标签页会显示每一个步骤。

集群仪表板

仪表板的标题栏显示集群名称、一个阶段胶囊与一段摘要(节点数、每个节点的 vCPU 与内存、k3s 版本、运行时间),并附启动,或重启与停止,以及一个集群操作菜单:拷贝 kubeconfig、工作区访问…、随 Bromure 启动与删除集群…。

共六个标签页,列表附有过滤字段:

标签页显示
概览节点、Pod、内存、存储与负载均衡器的卡片;每个云模拟器一张卡片,其端点分成从这台 Mac 与 LAN与从工作区两组,另有一行可直接粘贴、把该云的 CLI 与 SDK 指向它的命令,以及它所接受的测试凭据;负载均衡器已发布的端口(以及任何绑定失败的,附原因);各节点;最近的警告。
工作负载Deployment 与 Pod,附就绪状态与重启次数。
服务Service 与它们的外部地址(在被分配之前显示外部 IP:待决)。
存储Longhorn 的容量与卷、Synology 驱动的状态,以及卷声明。
访问工作区访问——与面板中相同的选择。
日志预配与生命周期的日志。

删除集群…“停止每一个节点并删除它们的磁盘,包含所有 Longhorn 卷。工作区会从 kubeconfig 中失去这个集群。这无法撤销。”

从机器使用集群

在被允许的机器中,kubectl 直接就能用:集群的 context 在 ~/.kube/config 里,而 kubectl 会通过 VM 网络直接与控制平面节点通信。那些流量不会经过主机的拦截代理服务器——节点地址已被排除在机器的代理设置之外——所以不会出现在该机器的追踪中。

拷贝 kubeconfig 操作会给你一份独立的 kubeconfig,供 Mac 本机上的工具使用。节点 VM 也能用 CLI 连到,例如 bromure-cli vm exec k8s-dev-1 -- kubectl get nodes(见CLI、API 与 MCP)。

注册表

创建注册表

**创建注册表…**会打开一个面板:“位于自己 VM 中的私有 Docker 注册表:在工作区中构建,推送到这里,在集群中运行。在 VM 网络上使用纯 HTTP;它绝不离开这台 Mac。”

新建注册表面板:名称(提示文字为 registry)、随 Bromure 启动、一个含内存与镜像存储步进器的“机器”区段,以及可选择所有工作区或仅部分工作区的推送权限。
字段范围默认
名称—registry
随 Bromure 启动—开启
内存1–16 GB1 GB
镜像存储10–2000 GB40 GB
推送权限所有工作区,包含新建的 / 仅这些工作区全部

镜像磁盘是稀疏的:只有被推送的层才占用空间。每个集群都可以从每个注册表拉取;推送权限则是按机器设置的。

注册表仪表板

标题栏显示注册表的地址(<ip>:5000)、它的内存与磁盘、启动 / 重启 / 停止,以及一个含拷贝地址、工作区访问…、随 Bromure 启动与删除注册表…的菜单。标签页有:镜像(仓库、磁盘与地址的卡片、一段从工作区推送的代码片段,以及镜像与标签的列表)、访问与日志。

在有推送权限的机器中,Docker 已经信任该注册表的地址,而 $BROMURE_REGISTRY 持有它(若能访问多个注册表,则是第一个的),所以你可以直接推送:

docker build -t $BROMURE_REGISTRY/myapp:dev .
docker push $BROMURE_REGISTRY/myapp:dev
kubectl run myapp --image=$BROMURE_REGISTRY/myapp:dev

各集群都被设置为自动从每个注册表拉取;当某个注册表被创建、移动或删除时,运行中的集群会被更新。注册表停止期间,从它拉取会像任何注册表中断一样失败。

删除注册表…“停止注册表的 VM,并删除它所持有的每一个镜像。工作区与集群会不再信任它的地址。这无法撤销。”

代理与基础设施 MCP

每台机器的代理都会取得一个 bromure-infrastructure MCP 服务器(vsock 端口 5834),范围限于那台机器可使用的集群与注册表。它的工具:

工具作用
infrastructure_overview这台机器可用的一切——集群(context 名称、状态、节点、存储类、负载均衡器、ingress)与注册表(地址、如何推送)——并附使用说明。
cluster_status某个集群的实时细节:阶段、节点、Pod、Service 与它们的外部地址、存储、警告、最近的日志行。
cluster_create以与面板相同的选项创建一个集群。
cluster_start开机一个已停止的集群。
registry_status某个注册表:地址、是否有响应、它的镜像、磁盘用量。
registry_create创建一个注册表。
registry_start开机一个已停止的注册表。

代理所创建的集群或注册表会分享给每一台机器(所有工作区),并随 Bromure 启动。

生命周期

  • 退出应用会挂起集群节点与注册表(内存快照),下一次启动则会恢复它们。无法还原的快照会退回为全新开机。
  • 停止会在关闭 VM 电源之前,干净地关掉 k3s 与各容器,每台机器最多给 60 秒。
  • 若某个节点或注册表 VM 在开机时未通过文件系统检查,Bromure 会检测到、停止该 VM、修复它的系统与数据磁盘,然后再次开机。
  • 首次设置从未完成的集群,会在下一次启动时再次设置。
  • 删除一台机器会把它从每一份访问列表中移除;若某份列表会因此变空,则退回为所有机器。
  • 集群与注册表会像其他一切一样,出现在远程 Mac 的镜像窗口中(见远程访问)。

集群记录位于 ~/Library/Application Support/BromureAC/kube/clusters.json;每个集群的节点磁盘在 ~/Library/Application Support/BromureAC/kube/<集群 id>/ 之下。