跳到正文

内网通信 ​

同一项目中的服务通过内网主机名互相访问:

<hostname>.zenavo.internal

例如,API 连接 postgresql.zenavo.internal:5432。新服务的主机名由它的名称生成(My API → my-api,第二个 PostgreSQL → postgresql-2);可以在服务的 设置 中的 内网主机名 修改。服务 网络 标签页的 内网 下会显示这个地址。流量只在服务器内部流转;不同项目之间无法访问彼此的服务。

域名解析 ​

内网地址是服务器解析器上真实的 DNS 名称,所以在任何地方都能用:系统解析器、dig 和 nslookup,以及自己查询 DNS 的程序,例如在 proxy_pass 中使用变量时 nginx 的 resolver,或者自带解析器的 Go 和 Node 客户端。让 nginx 使用容器 /etc/resolv.conf 中的 nameserver:

nginx
resolver 10.43.0.10 valid=10s;   # /etc/resolv.conf 中的 nameserver 行
set $api api.zenavo.internal;
location / { proxy_pass http://$api:8080; }

一个名称只会解析到发起查询的服务所在项目中的服务:api.zenavo.internal 在每个项目中指向不同的服务,项目中没有任何服务使用的名称不会返回地址。服务 ID 也可以作为名称使用(svc-k3j9x2ab.zenavo.internal)。每个容器的 /etc/hosts 中也列出了项目的内网地址,作为后备。

解析结果是一条指向服务集群名称(api.<project namespace>.svc.cluster.local)的 CNAME,后面跟着它的地址;请在配置中使用 zenavo.internal 名称,因为集群名称是内部细节,可能会变化。

在刚接入的服务器上,内网 DNS 会在第一次部署后一两分钟开始工作;这段时间由 /etc/hosts 兜底。

修改主机名 ​

新的主机名在服务下次部署时生效,旧的名称届时停止解析。使用 ${CONTAINER_HOSTNAME} 的变量(数据库服务共享的变量就是这样)会自动跟着变;直接写了旧地址的地方,例如你自己写的连接字符串,需要手动更新。

服务 ID ​

每个服务还有一个永久的随机 ID,例如 svc-k3j9x2ab,显示在服务名称下方和它的 设置 中。数据卷、日志和 API 路由都使用它,所以修改服务名称或主机名不会移动任何数据。

被移除的服务的数据卷会保留在服务器上,直到项目被删除,所以它的 ID 永远不会分配给其他服务。

在主机名功能出现之前创建的服务,ID 由名称生成(postgresql),在你选择新主机名之前,它也是服务的主机名。

端口 ​

内网 下的 暴露端口 用于添加服务监听的端口。每个端口包括:

  • 名称,例如 web,用于 WEB_PORT 这样的内置变量;
  • 端口号,容器内的端口;
  • 类型:HTTP(可以绑定域名)、TCP 或 UDP(可以发布)。

端口和域名的修改会立即生效:Zenavo 保存后会重新部署项目。

与 Zeabur 无关联。