C++/Envoy初心者が2週間で
MisakiのServiceMeshを実装するまで(仮)
伝えたいこと
Custom Filterの選択肢を持とう
Custom Filterのハードルは、それほど高くない
EnvoyのFilterとは
Envoyのコア機能に影響を与えず、Pluggableにネットワークストリームのデータを操作できる。
https://gyazo.com/a1b10a842b8c6bfe6592804fa3fdab5b
Misakiについて
エッジデバイスの開発を楽にしようぜ(意訳)というプロジェクト。
https://www.youtube.com/watch?v=2x7jQTBUT5w&list=PLm3Ufa7bsgpyN_UGH7TnOfg-XynZHRlqL&index=15
https://gyazo.com/a6ccbb62cf0c3e7de018a5b7f6db0f97
Misaki ServiceMesh
目標 : エッジデバイスでも、クラウドアプリケーションのように動かしたい!!
不安定なインターネット接続
リクエスト中の機器の突然死
しくみ
アプリケーションが外部にHTTP Requestを送信
HTTP Requestが、Sidecarで動作するEnvoyコンテナに送られる(iptables)
インターネット接続がない場合、優先度をつけた上でリクエストをQueueに入れる
インターネット接続状態に応じて、Queueに入っているリクエストを送信する
レスポンスを保存し、同様のHTTP Requestが来たら保存したレスポンスを返却
Custom Filterという選択
当初はAppコンテナとは別に、Queueコンテナを動かす想定だった
https://gyazo.com/fff6b12215ea59785183dfcbafce1004
ServiceMeshのチームに参加 → Queueの部分はEnvoyだけでできそう
2週間、試してみていいですか? ← 今ココ
Custom Envoy Filterの障害
C++の習得 : C++入門 ← 知識0から調べたことメモ Bazelの理解 : 単なるビルドツールだと思うようにしている
Protocol Bufferの理解 : filterのconfigはprotoファイルで定義するが、深く理解する必要はない
知っておくとよい知識
FilterもEnvoyにあわせて、C++14で実装する必要がある
HTTP Filterの場合 : StreamDecoderFilter/StreamEncoderFilter
Decoder : Request Streamの処理を実施できる
Encoder : Response Streamの処理を実施できる
code:sample decoder.cpp
class QueueDecoderFilter : public StreamDecoderFilter {
...
}
FilterHeadersStatus QueueDecoderFilter::decodeHeaders(RequestHeaderMap& headers, bool) {
// envoy単体(local)でresponseを生成する
decoder_callbacks_->sendLocalReply(Http::Code::TemporaryRedirect, "queue", nullptr, 0, "");
return Http::FilterHeadersStatus::StopIteration; // Filter Chainを止める
}
code:envoy.yaml
static_resources:
listeners:
- address:
socket_address:
address: 0.0.0.0
port_value: 80
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
...
http_filters:
- name: queue
- name: envoy.router
config: {}
clusters:...
code:terminal.sh
$ ./bazel-bin/queue-filter/envoy -c envoy.yaml
$ curl -v localhost/get
....
* TCP_NODELAY set
< HTTP/1.1 307 Temporary Redirect
< content-length: 5
< content-type: text/plain
< server: envoy
<
* Connection #0 to host localhost left intact queue
実際に開発した感想
C++初心者は、いきなりEnvoyに挑むのではなく、最初に1プロジェクトをとりあえず作ってみるのがおすすめ