Carpe Diem

備忘録

EnvoyのFrontProxyを用意してgRPCの負荷分散をする

概要

gRPCはHTTP/2プロトコルをベースとしたRPCです。
なのでコネクションが永続化され、その中で複数のストリームがリクエスト・レスポンスを取り扱うため負荷分散に注意する必要があります。
今回はEnvoyというgRPCに向いたproxyを使うことでそれを実現します。

環境

  • envoy 1.7.0

成果物

今回のソースはこちらにあります。

github.com

続きを読む

curlのresolvオプションで名前解決

背景

ドメイン移管の関係でCloudFrontのDNSレコードをDNSimpleからRoute53へ移そうとしていたのですが、完全な移管手続前にRoute53側のレコードでエッジサーバにちゃんとアクセスできるか確認する必要がありました。
digのNS指定を使えばエッジサーバのIPは確認できますが、CloudFrontを直IP指定でアクセスしても403が返るだけです。
そこでcurlresolvオプションを使うことで、IPを指定しつつドメイン名でアクセスするようにしました。

環境

手順

エッジサーバのIPを取得

まずCloudFrontのエッジサーバを見つけます。

続きを読む

Consulを支える技術

概要

ConsulではSWIMやRaftといった技術を使っています。
今回はそれらを説明します。

環境

  • Consul 1.1.0

SWIM

Gossip Protocol

SWIMはGossip Protocolの一種で、主に

  • クラスタのメンバ管理機能
  • メンバの障害検出機能
  • イベント伝播

で使われています。

続きを読む

Dockerの埋め込みDNSサーバを使ったService Discovery

概要

Docker 1.10からユーザ定義のネットワークでは内蔵DNSサーバが用意され、名前解決ができるということを以下の記事で述べました。

christina04.hatenablog.com

実は単に名前解決ができるだけでなく、Service Discoveryとしても機能するのでその紹介をします。

環境

  • Docker 18.03.1-ce
  • docker-compose 1.21.1
続きを読む

ECS + awsvpc + Consul でService Discovery

概要

ECS + awsvpc + Consul でService Discoveryができるようにします。
最終的にConsulにDNS問い合わせすることでECSのコンテナのIPを知ることができるようにします。

環境

  • Consul 1.1.0

Task Definition

結論を先にいうと以下のようになります。

[
  {
    "name": "consul-agent",
    "image": "consul:1.1.0",
    "memoryReservation": 128,
    "network_mode": "awsvpc",
    "environment": [
      {
        "name": "CONSUL_LOCAL_CONFIG",
        "value": "{\"service\":{\"name\":\"api\",\"tags\":[\"development\"]}}"
      },
      {
        "name": "CONSUL_BIND_INTERFACE",
        "value": "eth0"
      }
    ],
    "command": [
      "agent",
      "-retry-join",
      "consul-1a-01.example.io",
      "-retry-join",
      "consul-1c-01.example.io",
      "-retry-join",
      "consul-1d-01.example.io"
    ],
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-region": "ap-northeast-1",
        "awslogs-group": "dev-consul"
      }
    }
  },
  {
    // APIコンテナ
  }
]
続きを読む

Consulで各サービスのコンテナ群のIPを取得する

概要

以前Consulの基本的な使い方を紹介しました。

christina04.hatenablog.com

このConsulに登録する各ノードに対しサービス設定をすることで、各マイクロサービスに所属しているコンテナ群のIPを取得できるようします。
それによってgRPCでの負荷分散としてのClient-side LBが、動的なコンテナに対しても可能になります。

環境

  • Consul 1.1.0
  • docker 18.03.1-ce
  • docker-compose 1.21.1
続きを読む