本文へスキップ

プライベートネットワーク ​

同じプロジェクトのサービスは、プライベートホスト名で互いに接続します。

<hostname>.zenavo.internal

たとえば API は postgresql.zenavo.internal:5432 に接続します。新しいサービスのホスト名は名前から作られます(My API → my-api、2 つ目の PostgreSQL → postgresql-2)。サービスの Settings の Private hostname で変更できます。ホストはサービスの Networking タブの Private に表示されます。通信はサーバーの中で完結し、プロジェクト同士は互いのサービスに接続できません。

名前解決 ​

プライベートホストはサーバーのリゾルバー上の本物の DNS 名なので、どこでも使えます。システムのリゾルバー、dig や nslookup、そして自分で DNS を引くプログラム(変数を使った proxy_pass での nginx の resolver、独自のリゾルバーを持つ Go や Node のクライアントなど)でも動きます。nginx にはコンテナの /etc/resolv.conf にあるネームサーバーを指定します。

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 は最初のデプロイの 1〜2 分後に使えるようになります。その間は /etc/hosts が補います。

ホスト名の変更 ​

新しいホスト名はサービスの次のデプロイで反映され、その時点で古い名前は解決されなくなります。${CONTAINER_HOSTNAME} を使う変数(データベースサービスが共有する変数など)は変更に追従しますが、自分で書いた接続文字列のように古いアドレスを直接書いた箇所は更新が必要です。

サービス ID ​

各サービスには svc-k3j9x2ab のような恒久的でランダムな ID もあり、名前の下と Settings に表示されます。ボリューム、ログ、API のルートがこれを使うので、サービス名やホスト名を変えてもデータは移動しません。

削除したサービスのボリュームはプロジェクトを削除するまでサーバーに残るので、その ID が別のサービスに割り当てられることはありません。

ホスト名の機能より前に作られたサービスは、名前から作られた ID(postgresql)を持ち、別のホスト名を選ぶまではそれがホスト名でもあります。

ポート ​

Private の Expose Port で、サービスが待ち受けるポートを追加します。各ポートには次のものがあります。

  • 名前:web など。WEB_PORT のような組み込み変数に使われます。
  • 番号:コンテナ内のポート。
  • 種類:HTTP(ドメインを設定できる)、TCP または UDP(公開できる)。

ポートとドメインの変更はすぐに反映されます。Zenavo が保存してプロジェクトを再デプロイします。

Zeabur とは関係ありません。