備忘としてメモ
需要はあまりないと思いますが、fargateのプライベートIPを取得して使っているとかのケースで
問題が出る場合がありそうなので掲載します
概要
fargate1.4、VPCエンドポイントでの制御が追加になって便利になりましたね。
ものは試しということで1.4にあげてみたところどうやらNICが変わっているようで影響が出ました。
現象
keycloakをfargateにのっけて、HA構成で展開しているサービスがあります。
これをfargate1.3 → 1.4にしたところ、クラスタリングがうまくいかず同期されていないような挙動が発生。
具体的には片方でログインしたのに、もう片方のコンテナでセッションが見つからない等のような動きをし始めました。
原因と対応
fargate1.4からコンテナにアタッチされるNICに変更があるようです。
fargate1.3までは
1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever
3: ecs-eth0 inet 169.254.172.42/22 scope global ecs-eth0\ valid_lft forever preferred_lft forever
4: eth0 inet 10.1.100.187/24 scope global eth0\ valid_lft forever preferred_lft forever
のように eth0
にVPCのローカルIPが割り振られています
これがfargate1.4になると
1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever
3: eth0 inet 169.254.172.2/22 scope global eth0\ valid_lft forever preferred_lft forever
4: eth1 inet 10.1.200.45/24 scope global eth1\ valid_lft forever preferred_lft forever
というように eth1
が増えてそこにローカルIPが割り振られるようになっています。
ecs-eth0
はなくなっていますね。
私の場合、keycloakを立ち上げる時に、クラスタリングの為にfargateインスタンスのローカルIPを取得して
keycloakに食わせています
以下のようなエントリーポイントのシェルで起動していました
export EXTERNAL_ADDR=`ip -f inet -o addr show eth0 | cut -d" " -f 7 | cut -d/ -f 1`
if [ "$EXTERNAL_ADDR" = "" ]; then
EXTERNAL_ADDR=127.0.0.1
fi
echo "Use $EXTERNAL_ADDR for clustering."
sh /opt/jboss/tools/docker-entrypoint.sh $@ -Djgroups.bind_addr=$EXTERNAL_ADDR
eth0
を取っているので fargate1.3ではローカルIPを取得できましたが、
fargate1.4ではpublic ipが取れるようになってしまい、コンテナ間のjgroupspingが通らなくなったと思われます。
なので今回は単純にfargate1.4にした状態で eth0
を eth1
に変更したところ解決しました。
# fargate1.4からはローカルIPはeth1から取得
export EXTERNAL_ADDR=`ip -f inet -o addr show eth1 | cut -d" " -f 7 | cut -d/ -f 1`
if [ "$EXTERNAL_ADDR" = "" ]; then
EXTERNAL_ADDR=127.0.0.1
fi
echo "Use $EXTERNAL_ADDR for clustering."
sh /opt/jboss/tools/docker-entrypoint.sh $@ -Djgroups.bind_addr=$EXTERNAL_ADDR
物理的なNICを指定している時点でどうなの、というのはごもっともではありますが。
fargate等のコンテナでIPを固定しない状態において、クラスタリングする時にIP欲しくなるケースがあったりなかったり。
なにかのお役に立てると幸いです