こんにちは。
突然ですが、多くのサーバーがあると管理するのが面倒になってくると思います (唐突)。けどKubernetesなどで管理するほど大規模じゃなかったりして、気軽にコンテナを使いながらサーバーのメンテナンスコストを軽減できるといいですよね。
そこで、Portainerのような、複数のDockerホストを管理するソフトウェアがあります。
PortainerはEdge Agentという機能があり、一つ公開のPortainerホストを立てていれば、あとはEdge側のポート公開などをしなくても気軽に他のDockerホストをPortainerホストに登録して管理することができます。
しかし、このPortainer Edge Agent、通信方式に関するドキュメントがあまり見つからなかったりするので、どのように通信を組めばいいのか困っていたりしました。で、今回はEdge Agentの通信の概要を理解することができたので (完全に理解したわけではない)、ざっとEdge Agentの登録方法を軽くまとめてみました。
すでにPortainerホストを運用していて、Edge Agentを追加する、みたいな人に参考になると幸いです。
まず、PortainerホストのWebUI上から、新規Environmentの作成を行います。今回はDocker Standaloneで作成することにします。
次に、Portainerホストとこれから接続するAgentとの接続方法を選択します。今回はEdge Agent方式にします。
Environment名とPortainer API server URLを指定します。Portainer API server URLは後ほど変更することになるので、適当で大丈夫です。
Createを押すと、トークン (EDGE_KEY
)が発行されるので、コピーしておきます。
それでは、EDGE_KEY
を編集していきます。EDGE_KEY
は下記のような長い文字列になっていると思います。
aHR0cHM6Ly9wb3J0YWluZXItZWRnZS5leGFtcGxlLmNvbXxwb3J0YWluZXItZWRnZS5leGFtcGxlLmNvbTo4MDAwfGZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmfDA=
これはBase64でエンコードされている文字列なので、デコードしてみます。
echo 'YOUR_PORTAINER_EDGE_KEY' | base64 --decode
すると、下記のような文字列が現れると思います。
https://portainer-edge.example.com|portainer-edge.example.com:8000|ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff|0
|
で区切られた4つの値が入っています。出典
- PortainerホストのAPI URL
- Portainerホストのリバーストンネルサーバーアドレス
- エンドポイントID
- Portainerホストのリバーストンネルサーバーフィンガープリント
この1と2に着目します。
1はAPI URLなのでHTTPで通信できればよさそうですね。
2について調べてみても、「TCPで通信してるトンネル」としか表記がなかったりしており、実態がわかりにくいですが、調べてみるとWebSocket通信だとわかりました。
デフォルトだとportainer-edge.example.com:8000
のような値が入っていると思いますが、実態としては、ws://portainer-edge.example.com:8000
にアクセスするようになっています。もし、WebSockets over SSL/TLS (WSS)で通信したい場合は、頭にhttps://
と付けるとWSSで通信できました。
私の場合は、CloudFlare Tunnelを使用して、APIサーバーを公開していたので、ついでにWebSocket (リバーストンネルサーバー)も公開します。
Name | Host | Host |
---|---|---|
Web UI | localhost:9000 | portainer.example.com |
EdgeからホストのAPIにアクセス | localhost:9000 | portainer-edge.example.com |
EdgeからホストのWebSocket (リバーストンネルサーバー)にアクセス | localhost:8000 | portainer-edge-wss.example.com |
CloudFlare Tunnelを使うと下記のような感じで簡単にWebSocketも公開できます。
それでは、もう一度EDGE_KEY
をBase64でエンコードして、Edge Agentに登録しましょう。
echo -n 'https://portainer-edge.example.com|https://portainer-edge-wss.example.com|ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff|0' | base64
登録できたら、あとは公式ドキュメント通りにDockerなどでEdge Agentを立ち上げます。
これで、変にTCPポートを丸開けすることなく、気軽にPortainerホストを運用しつつ、Edge Agentを登録することができました。
余談ですが、Edge Agentは標準的なHTTPとWebSocketのみを使用することが分かったので、CloudFlare TunnelとCloudFlare Accessを使うことで、気軽かつセキュアにPortainer環境を構築することができます。