Armadilloフォーラム

VSCodeのABOSDEから「App run on Armadillo」を行った場合のコンテナ間UDP通信の挙動について

sasaki_iwaya

2024年4月15日 15時56分

お世話になっております。
現在udpを用いて送信コンテナからデータ送信し、別の受信コンテナで受信する処理を実装しております。
ABOSDEで送信コンテナ・受信コンテナを作成、SWUをインストールしたArmadillo-X2で送受信を確認しております。
armadilloの電源を投入後起動したコンテナ間の通信は問題なく行えております。
ただし、以下のようにデバッグのため受信コンテナをABOSDE上「App run on Armadillo」から実行した際、何度か受信コンテナが送信データを受信しない現象が見られます。

 受信コンテナ… ip:10.88.0.102 port:11000
 送信コンテナ… ip:10.88.0.101  port:11000

 手順
 ・armadilloを起動する。podman psで二つのコンテナが起動していることを確認する。
 ・ABOSDE上から受信コンテナを「App run on Armadillo」で起動する。
 ・送信コンテナへコマンドを送信しUDPでデータ送信を行う。
 期待値
 ・受信コンテナが1回目のデータから受信する。
 現状事象
 ・受信コンテナで受信が行われない。
 ・送信コンテナで何度か(2~15回程度)送信すると、直後に送信したデータから受信コンテナの受信が始まる。
 ・一度受信コンテナが受信後は、問題なく受信が続く。

ABOSDEを介さずarmadillo上で実行されているコンテナ間では以上のような問題は発生しておりません。
また、「App run on Armadillo」で受信コンテナを起動後、ホストのarmadilloから受信コンテナへpingが通る状態でも、
上記事象が発生しております。

この現象が「App run on Armadillo」でのコンテナ実行下でudpを使用した場合の固有の問題なのか、
コンテナ生成時の設定等で回避できる問題であるのか、ご教示いただければと思います。

以上、よろしくお願いします。

コメント

at_dominique.m…

2024年4月15日 17時24分

sasaki_iwayaさん、

お世話になっています、
マルティネです。

ABOSDE と直接の動作に差が出ないはずですので、いくつかを確認させてください。

>  ・送信コンテナへコマンドを送信しUDPでデータ送信を行う。

IP アドレスを説明していただいたので、add_ports 等の podman publish の設定ではなく、送信コンテナから直接に受信コンテナの IP へ送信していますね?

その IP アドレスはコンテナのコンフィグで設定していますね?

> ABOSDEを介さずarmadillo上で実行されているコンテナ間では以上のような問題は発生しておりません。

armadillo上での確認の場合も、「podman_start <受信コンテナ>」で受信コンテナをリスタートしていますか?

> また、「App run on Armadillo」で受信コンテナを起動後、ホストのarmadilloから受信コンテナへpingが通る状態でも、
> 上記事象が発生しております。

受信しているかどうかはどういう風に確認していますか?
標準出力だけでしたら、お手数ですが標準出力が vscode で表示されてないか、本当に受信していないかの区別は確認していただければ助かります。

また、以下の二つのコマンドの出力も確認もしていただければ幸いです:
* (add_ports を使用している場合)「iptables -t nat -S」でポートフォーワードがちゃんと設定されています(前のコンテナで何か残ったりしていないも含めて)
* 「apk add conntrack-tools」の後に「conntrack -L | grep 11000」で何か見えてますかどうか

よろしくお願いします

コメントありがとうございます。

> IP アドレスを説明していただいたので、add_ports 等の podman publish の設定ではなく、送信コンテナから直接に受信コンテナの IP へ送信していますね?
>
> その IP アドレスはコンテナのコンフィグで設定していますね?

上記について,送信コンテナから直接受信コンテナへの送信を行い,IPアドレスもコンテナのコンフィグで設定しております。

> armadillo上での確認の場合も、「podman_start <受信コンテナ>」で受信コンテナをリスタートしていますか?

確認しておりませんでしたが,確認したところ,同様の現象が発生しました

> 受信しているかどうかはどういう風に確認していますか?
> 標準出力だけでしたら、お手数ですが標準出力が vscode で表示されてないか、本当に受信していないかの区別は確認していただければ助かります。

受信コンテナが受信した場合,標準出力を行うとともに接続I2Cデバイスが動作するようにしているためその動作を確認しております。
事象発生時については,標準出力・動作ともに確認できません。

> また、以下の二つのコマンドの出力も確認もしていただければ幸いです:
> * (add_ports を使用している場合)「iptables -t nat -S」でポートフォーワードがちゃんと設定されています(前のコンテナで何か残ったりしていないも含めて)
> * 「apk add conntrack-tools」の後に「conntrack -L | grep 11000」で何か見えてますかどうか

現象発生時受信コンテナ内で上記conntrackコマンドを実行した結果,以下の通りでした。

conntrack v1.4.7 (conntrack-tools): 0 flow entries have been shown.

なお,受信を確認した場合にも同様な結果となりました。

参考に,netfilterのtimeoutの設定を表示したログデータを送付します。

よろしくお願いします。

ファイル ファイルの説明
netfilter_log.txt

at_dominique.m…

2024年4月17日 11時57分

回答ありがとうございます。

> 上記について,送信コンテナから直接受信コンテナへの送信を行い,IPアドレスもコンテナのコンフィグで設定しております。

固定のアドレスで直接に送信していること、了解しました。

> 受信コンテナが受信した場合,標準出力を行うとともに接続I2Cデバイスが動作するようにしているためその動作を確認しております。
> 事象発生時については,標準出力・動作ともに確認できません。

標準出力の問題じゃないことも了解しました。

> 現象発生時受信コンテナ内で上記conntrackコマンドを実行した結果,以下の通りでした。
>
> 「conntrack v1.4.7 (conntrack-tools): 0 flow entries have been shown.
>
> なお,受信を確認した場合にも同様な結果となりました。

はい、nat を通ってない場合は正常です。別の残っている“接続”が邪魔になっていないかの確認でした。

> > armadillo上での確認の場合も、「podman_start <受信コンテナ>」で受信コンテナをリスタートしていますか?
>
> 確認しておりませんでしたが,確認したところ,同様の現象が発生しました

確認ありがとうございます。
こちらでも似たような設定を行いましたが、再現できませんのでお手数ですがもう少し確認させてください。

手元では以下の手順で確認してます:

# 送信コンテナ
armadillo:~# cat /etc/atmark/containers/send.conf
set_image docker.io/alpine
set_ip 10.88.0.101
# 本来はイメージにインストールしておくべきですが、
# テスト用に socat を追加して実行します
set_command sh -c 'apk add socat && exec socat UDP-RECV:11000 -'
# attach で送信できるように -i が必要です
add_args -ti
 
armadillo:~# cat /etc/atmark/containers/recv.conf
set_image docker.io/alpine
set_command nc -u -l -p 11000
set_ip 10.88.0.102
# バッファリングされないように -t を使ってます
add_args -t
 
oarmadillo:~# podman_start send recv
Starting 'send'
a362a9c82412fa400778678c338c8bbb1da71913953e204ec798a96b8daebfc6
Starting 'recv'
1d80dd6a930edf2020ed35397c9a878a08d9f7e3cbf03e59496a8897c537ebc0
 
# 送信は podman attach send か exec nc -u ... でできます
armadillo:~# podman attach send
test message
#ctrl-p ctrl-q で detach
 
# 受信は podman logs recv で確認
armadillo:~# podman logs recv
fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/main/aarch64/APKINDEX.tar.gz
[省略]
2024/04/17 02:34:32 socat[2] W address is opened in read-write mode but only supports read-only
test message

その環境で podman_start recv を実行しても socat が起動している時点で受信できますが、何か違いに心当たりありますか?

コンテナが受信できてない時は netstat か何かで受信できてることを確認できますか?

armadillo:~# podman exec -ti recv netstat -nulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
udp        0      0 :::11000                :::*                                2/socat

よろしくお願いします。