LoginSignup
3
0

Portainer Edge Agentを雑に運用する

Posted at

こんにちは。

突然ですが、多くのサーバーがあると管理するのが面倒になってくると思います (唐突)。けど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で作成することにします。

image.png

次に、Portainerホストとこれから接続するAgentとの接続方法を選択します。今回はEdge Agent方式にします。

image.png

Environment名とPortainer API server URLを指定します。Portainer API server URLは後ほど変更することになるので、適当で大丈夫です。

Createを押すと、トークン (EDGE_KEY)が発行されるので、コピーしておきます。

image.png

それでは、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つの値が入っています。出典

  1. PortainerホストのAPI URL
  2. Portainerホストのリバーストンネルサーバーアドレス
  3. エンドポイントID
  4. 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も公開できます。

image.png

それでは、もう一度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環境を構築することができます。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0