Upgrade to Pro — share decks privately, control downloads, hide ads and more …

microservices-infrastructure-with-envoy-consul-nomad

Kentaro Maeda
January 08, 2020

 microservices-infrastructure-with-envoy-consul-nomad

Envoy Meetup Tokyo #1 の発表スライドです。
発表後から誤字の修正のほか次の修正が入っています。

P32. スライドが一枚抜けていたので追加
P26. 設定ミスとなる正しい理由をご指摘いただいたので正しい対処方法を記載

Kentaro Maeda

January 08, 2020
Tweet

More Decks by Kentaro Maeda

Other Decks in Technology

Transcript

  1. サービスのルックアップ Consul + Nomadで簡易なコンテナクラスタは組めるが、サービス間通信では通信先 サービスの明⽰的なルックアップが必要、かつ負荷分散も⾃分で実装が必要 通信先のアドレスを得るには次のような⽅法がある ・Consul REST API ・

    curl http://localhost:8500/v1/health/service/service-a ・Consul 組み込みDNS ・動的ポートへはsrvレコードへの対応が必須 ・Spring Cloud Consul などのライブラリ なるべく、サービスが基盤の構成を意識しないといけない実装は避けたい 基盤がサービス間通信で相⼿先サービスへの通信を⾃動的に解決するようにする 17
  2. サービスメッシュの実現⼿段 ・Consul Connect ・consul サービス間でmTLS通信を envoy か組み込みプロキシで⾏う ・開発当時はL4プロキシのみ、かつ nomad と連携していなかった

    ・今の最新バージョンならL7プロキシも nomad 連携も可能(※最終⾴参照) ・envoyのすべての機能は使えないのでまだ様⼦⾒ ・Istio with nomad ・「多分動くけどテストしてない」という注意書きと⼀緒に書きかけっぽいページ がIsitio公式にあった → 最新バージョンで消えた ・nomad でenvoyをどう設定するかなどの考えたかは踏襲した ・envoy + ⾃作 ControlPlane ・実装難度は⾼いが、独⾃の要件やインフラ・ネットワーク制約に対応しやすい 19
  3. L7プロキシサーバー xDSプロトコルにより設定ファイルの⼀部を外部サーバー(ControlPlane)から取得・ ホットリロードできる Nomadのジョブ定義ファイルにサービスと⼀緒に起動するように設定 job "service-a" { count=2 group "service-a-group"

    { task "service-a-app" { driver = "docker" config { image = "service-a" } env {//egres host/port} } task "service-a-sidecar" { driver = "docker" config { image = "envoy-proxy" } env { // xDS ホスト} } } 20
  4. 設定ファイルの例 version_info: 1 service_name: edge-router resources: #lds - "@type": type.googleapis.com/envoy.api.v2.Listener

    name: egress address:{ socket_address: {address: 0.0.0.0, port_value: 3101 } } filter_chains: - filters: - name: envoy.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager rds: route_config_name: egress_route config_source: {ads: {}} http_filters: - name: envoy.router #rds - "@type": type.googleapis.com/envoy.api.v2.RouteConfiguration name: egress_route virtual_hosts: - name: router_route domains: ["*"] routes: - match: { prefix: "/hi_a" } route: { cluster: service-a } - match: { prefix: "/hi_b" } route: { cluster: service-a } #cds - "@type": type.googleapis.com/envoy.api.v2.Cluster name: service-a <<: *cluster // 割愛 - "@type": type.googleapis.com/envoy.api.v2.Cluster name: service-b <<: *cluster // 割愛 24
  5. 運⽤監視 現時点ではPrometheusと社内の監視ツールを使⽤している ・コンテナで実⾏しているenvoyとサービスはPrometheusエンドポイントを公開 ・SpringBoot ではmicrometerを使⽤ ・node exporter, consul exporterなど ホストプロセスでも各種expoterを使⽤

    ・リソース監視のほか、Consulのヘルスチェック失敗、Systemdのステータス異常、 エラー発⽣なども監視している 引き続き、最適な運⽤監視の⼿段を検討している 33
  6. ※参考資料 ・Yakst - 多分あなたにKubernetesは必要ない ・https://yakst.com/ja/posts/5455 ・クックパッド開発者ブログ - Service Mesh and

    Cookpad ・https://techlife.cookpad.com/entry/2018/05/08/080000 以下、発表者によるもの ・Spring, consul, envoy, ControlPlane Java, gRPC プロトタイプ ・https://github.com/kencharos/envoy-service-discovery-spring ・consul connect, L7 traffic manager, nomad consul connect を試す ・http://kencharos.hatenablog.com/entry/2019/12/17/010151 36