DockerとOpen vSwtich、その後

Dec 1, 2017 - 1 minutes
読む前に この記事はkstmアドベントカレンダーの2日目です。 尚、下記の記事の続きのようなもので、内容は実質ポエムなので注意されたし。 仮想化以前に構築した自宅インフラをDockerとOpen vSwtichで何とかする話 - Qiita 何故続いたか 下記に上げる既存手法は、帯に短し襷になんちゃらということで、あがく、放置する、を繰り返し結果、1年経ったが結局救われていないことに気付いたので記事にすることにした。 現状、Hostアダプタとdocker-composeでの自動立ち上げで多少幸せになったが、ホストマシンのOSインストールが終わったら、自宅インフラを一発で復旧できるような状態には未だなっていない。 ovs-dockerの運用をやめてしまった要因として以下のものがある 1. 再起動耐性がない 2. あくまでシェルスクリプト 現状、Hostアダプタを運用していて発生してる問題としては以下のものがある 1. Rawソケットを使うデーモンをTagVlanで使えない 2. ホストの構成、IP変更に振り回される そして、一時期検討した、kubernetes等の基盤とかの問題点として以下のものがある 1. アカウンティング、テナンティング、クラスタリングしないので機能の8割が邪魔 2. L2でひっぱりだすのが大変(contivとかあるらしいけどまだ熟れていない) つまり、既存手法にはほぼ救いがない。 Dockerのネットワークドライバを実装しようとした話 Go言語でOVSDBを叩くDockerのネットワークドライバがあれば最高じゃないかと思って、libnetworkのドライバのコード・リーディングを進めているが、さっぱりわからん。 特に、OSのネットワーク周りに対応して秘匿し、互換性を持たせる機能も読み込まなければならず、早々簡単に読めるものではなかった。 手段として大きくなりすぎている気がするので、勉強としては多少読み続けるが、実装しようとは思わなくなった。 kea-dhcp on Dockerの話 Rawソケットを使うデーモン、それはkea-dhcpである。 kea-dhcpをホストアダプタのVlanなI/Fに割り当てると、見事にコケる。 理由はとても簡単、Rawソケットを使っているため、カーネルドライバであるVlanを認識しない。 つまりVlanなI/Fを仮想スイッチで「剥く」ことができるOpen vSwitchは非常に魅力的なのだ。 詳細はここに書かれている。 [Kea-users] (Can’t get KEA to work here - VLAN issues 他にも、HostアダプタでVlanなI/Fを掴んだ場合、Rawソケットを使っているデーモンは全て死亡することになる。 ovs-dockerに再起動耐性をつける話 ovs/ovs-docker at master · openvswitch/ovs この実装を読んでみたが、ovs-dockerの実装であるシェルスクリプトがステートレスなのが問題であって 手前味噌ではあるが、インターフェイスとDockerのコンテナIDあたりの整合性を保持するDBを持っていれば、 もしかしたらなんとかなるんじゃないかと思った。 シェルスクリプトではなくツールとして再実装したら美味しいのでは。 こんなポエムを書いている間に、上記のような着想を得たので、アドベントカレンダー期間内に実装し、 成果が出たら記事として公開しようと思った。 おわり。

ISUCON7本戦惜敗記(学生枠)

Nov 26, 2017 - 1 minutes
問題 リアルタイム協力クッキークリッカー風味ゲーム Chair Constructer Online roomと呼ばれる概念があり、協力してひたすら椅子を生産する部屋を作れる。 roomに入るとWebSocketでリアルタイム通信が発生する。 このゲームの処理を、4台(いずれもCPU 2Core 2.3GHz, MEM 2GB)のサーバーで捌かなければならない。 回線に関しては、参加者がアクセスするグローバル系統、サーバー間の通信とベンチマーカーの通信が流れるローカル系統がある。 それぞれの系統は同じスイッチに収容され、各々帯域制限があるので、後々それも問題になったであろうが、そこまでパフォーマンスが上がらなかった。 問題の詳細に関しては後々公開されるであろうイメージを参照されたし。 結果 学生中4位、12位(kstm) 振り返り 構成把握、ユーザの振る舞いの想定が非常に甘かった。 特にWebSocketの中身。メッセージの分布なり統計なりきちっと出せていればroom毎の分散はしなかった可能性がある。 ところが、かなり早い段階でWebSocketの負荷分散単位をroom単位と決めてしまった。 メリットとしては、roomに関する情報をサーバー間で同期性、一貫性を担保する必要がないところ。 デメリットは、1台のサーバーで支えられる以上の負荷がroomにかかっていた場合、それ以上捌けないところ。 セッション数を見たところ、 この分散方式だとセッションが集中するサーバーとそうでないサーバーが出てしまった。 数字としては、 ss -to state established あたりで監視していたが、4台中2台が暇な状態であった。 一番混み合っているサーバは90〜100セッションを捌いていたが、暇なサーバに至っては、10セッションに満たない。 アプリケーションが負荷を十分に発生できなかったという話もあるが、 私は、2年前のISUCONから人間タスクランナと、ネットワーク、インフラ担当なので、 アプリケーションのパフォーマンスが上がらなかった原因などの解説はチームメイトに譲ることにする。 参照URL ISUCON7本戦で惜敗してきた - Goryudyuma’s blog

自宅バックアップ回線を引いた話

Nov 19, 2017 - 2 minutes
問題 大学から自宅が地味に遠い(チャリで本気で飛ばして7分) 何らかの原因で自宅ルータの設定ミスした時、帰るのダルい 解決手法 契約しているMVNOのSIMを追加発行、docomo L-03Dに刺してバックアップ回線とする。 当該回線はCGN配下なのでグローバル疎通を取れない。 GoogleCloudPlatformのComputeEngineまでVPNを張り、そこで固定IPをもらう。 NGN系統が落ちた時は、GoogleCloudPlatformのインスタンスにSoftEtherVPN張って復旧。 モバイル系統が落ちた時は、NGN系統使っていつもどおり復旧。 あーんしん! 設定例 GCP側 Compute Engineで最小インスタンスを立てる VPCネットワークの外部IPアドレスで固定IPをもらう ファイアウォールルールでallow-ipsecルールを作成 udp:500,1701,4500 を開放 SoftEther入れて動かす vpncmd使ってアカウント追加したりEtherIP周りのコマンドでつなげるようにする (gcloudコマンドに慣れていないのは内緒) vpncmd例 vpncmd /server GCP\_ADDR > Hub DEFAULT > AccountCreate > AccountPasswordSet > IPsecEnable > EtherIPClientAdd ここらのコマンドでアカウント作成から、PSKとかikeのlocal nameとかが全部設定できる。 RTX810側 モバイル設定の追加 APNととかauth mynameとかはMVNOの設定とかに書いてあるのでそこを参考に設定。 + ip wan1 address dhcp + wan1 bind usb1 + wan1 always-on on + wan1 auth myname XXXX@XXXX.tld XXXX + wan1 auto connect on + wan1 disconnect time off + wan1 access-point name XXXX.