Slide 1

Slide 1 text

1 Skupperで遊ぶ 2022-03-29 Manabu Ori @orimanabu v1.4 Kubernetes Meetup Tokyo #49 LT

Slide 2

Slide 2 text

目次 2 ▸ Skupperとは ▸ Skupperの動き ▸ AMQP ▸ Dispatch Router ▸ 雑感

Slide 3

Slide 3 text

Skupperとは 3

Slide 4

Slide 4 text

skupperとは 4 ▸ https://skupper.io/ ▸ 異なるKubernetesクラスター間で、L7サービスインターコネクトを実現 する ・ AMQPによる接続 ・ Apache QpidのDispatch Routerを使用 ・ https://qpid.apache.org/components/dispatch-router/ ・ Namespace単位で接続できる ・ mTLSによるセキュアな通信 ・ 複雑なトポロジーを構成できる ・ Submarinerはフルメッシュ接続のみ

Slide 5

Slide 5 text

cluster X cluster Y namespace A namespace B 全体像 5 hello svc/web skupper- router skupper- service- controller svc/web skupper- router skupper- service- controller AMQP Link hello web ▸ ns Bのsvc/webにアクセスすると、AMQP Linkを通ってns Aのpod/webに届く ・ pod replicaへのロードバランスは(kube-proxyではなく)skupper-routerの機能で行う connector listener connector

Slide 6

Slide 6 text

Skupperの動き 6

Slide 7

Slide 7 text

▸ 2つのk8sクラスター X, Y ▸ それぞれにNamespace A, B ▸ ns Aにsvc/webとpod/web (replica=3) cluster X cluster Y namespace A スタート地点 7 hello svc/web namespace B hello web

Slide 8

Slide 8 text

▸ skupperコマンドを取得する ▸ それぞれのnsで “skupper init” コマンドを実行すると、2個のPodが起動 ・ skupper-service-controller ・ skupper-router ▸ 外部からリンク接続するためのIngress or type: LoadBalancerが自動的に作成される ・ Ingressやtype: LoadBalancerのServiceがない環境では “skupper init --ingress none” を実行する cluster X cluster Y namespace A Skupperの初期化 8 hello svc/web skupper- router skupper- service- controller namespace B skupper- router skupper- service- controller hello web 初期化 (Ingress or type: LoadBalancer がある環境の場合) skupper init 1 初期化 (Ingress or type: LoadBalancer がない環境の場合) skupper init --ingress none 1

Slide 9

Slide 9 text

cluster X cluster Y namespace A namespace B ▸ 片方のns (図のcluster X, ns A) で接続用のトークンを作成 ・ skupper token create c-X_ns-A.yaml ・ Ingress or type: LoadBalancer Serviceで外部から接続できる必要がある ▸ 他方のns (図のcluster Y, ns B)で「ns Aに向けたリンク」を作成 → ルータ間を接続 ・ skupper link create c-X_ns-A.yaml ・ こちらのnsのrouterからns AのrouterにAMQP Linkを張る AMQP Link作成 9 hello svc/web skupper- router skupper- service- controller skupper- router skupper- service- controller hello web AMQP Link トークンを使ってリンク作成 skupper link create token.yaml --cost 1 3 リンクには「接続する向き」があるが、一 度接続が確立すると、そのリンクを使っ て双方向通信ができる 接続トークン作成 skupper token create token.yaml 2

Slide 10

Slide 10 text

cluster X cluster Y namespace A namespace B ns AのServiceを公開 10 hello svc/web skupper- router skupper- service- controller svc/web skupper- router skupper- service- controller AMQP Link hello web ▸ ns AのService webを「公開」する ・ “skupper expose” ・ ns Aのskupper-routerにsvc/webのlistenerとconnectorができる ・ listenerの向き先はpod/web ・ ns Aのsvc/webのEndpointがrouterのconnectorに向く ▸ ns Bに同名のServiceが作成される ・ ns Bのsvc/webのEndpointはns Bのskupper-routerのconnector connector listener connector Expose! Serviceの公開 skupper expose svc/web ... 4

Slide 11

Slide 11 text

cluster X cluster Y namespace A namespace B 通信の様子 - Namespaceまたぎ 11 hello svc/web skupper- router skupper- service- controller svc/web skupper- router skupper- service- controller AMQP Link hello web ▸ ns Bのsvc/webにアクセスすると、AMQP Linkを通ってns Aのpod/webに届く ・ pod replicaへのロードバランスは(kube-proxyではなく)skupper-routerの機能で行う connector listener connector client

Slide 12

Slide 12 text

cluster X cluster Y namespace A namespace B 通信の様子 - Namespace内 12 hello svc/web skupper- router skupper- service- controller svc/web skupper- router skupper- service- controller AMQP Link hello web ▸ ns Aのsvc/webにアクセスしても、ns Aのrouterを経由してpod/webに届く ・ pod replicaへのロードバランスは(kube-proxyではなく)skupper-routerの機能で行う connector listener connector client

Slide 13

Slide 13 text

複雑なネットワーク 13 ▸ ns “c2-ns3” のsvc/webをskupper exportすると、ネットワーク上の全てのns内にsvc/webが生まれる ▸ どのnsのsvc/webに接続しても、skupper-routerのネットワークを通してns “c2-ns3” のpod/webに届く ▸ 経路障害が発生した場合は、Link Stateに応じて最短経路を再計算 skupper- router skupper- service-controller ns c1-ns3 skupper- router skupper- service-controller ns c2-ns3 skupper- router skupper- service-controller ns c2-ns1 skupper- router skupper- service-controller ns c2-ns2 skupper- router skupper- service-controller ns c1-ns1 skupper- router skupper- service-controller ns c1-ns2 listener connector connector svc/web svc/web svc/web svc/web svc/web svc/web hello hello web connector connector connector connector

Slide 14

Slide 14 text

AMQPとは 14

Slide 15

Slide 15 text

AMQPとは 15 ▸ メッセージキューを実現するプロトコルのひとつ ・ メッセージ指向 ・ 非同期、疎結合 ▸ MQTTとの違いは... ▸ MQTT: MQ Telemetry Transport ・ 軽量、省電力なプロトコル ・ ヘッダサイズは最小2バイト (cf. HTTPは最小50バイ ト) ・ 1対多、多対多の通信に特化 ・ 低速、不安定なネットワークでの使用を想定 ・ 1999年に誕生(IBM, Eurotech)、2010年に仕様をロイヤリ ティフリーで公開、今はOASIS標準 ・ メッセージの順序や到達性が保証されない ▸ AMQP: Advanced Message Queuing Protocol ・ エンタープライズな要件に対応できる MQプロトコル ・ 高信頼性 ・ Brokerによるメッセージ永続化、Sub側の受信処理のト ランザクション対応 ・ 高度なメッセージ配信 ・ Exchange(Direct, Fanout, Topic, Header)、Priority Queue、QoS/Prefetching、Immediate ・ アクセス制御 ・ Virtual Host + ACL ・ プロトコルの仕様はOASISで標準化されている ・ 金融業界でも使われている ・ ワーキンググループにBoA、JP Morgan、GS等がいる

Slide 16

Slide 16 text

Dispatch Router 16

Slide 17

Slide 17 text

AMQPにおける従来のメッセージング 17 ▸ クライアント(Endpoint)はサーバー(Broker)と通信する ▸ Brokerは他のBrokerと接続することもできる ▸ Endpoint同士直接通信することもある endpoint endpoint endpoint endpoint endpoint Broker Broker

Slide 18

Slide 18 text

メッセージングのネットワーク化 18 ▸ “Interconnect Layer” を導入 ▸ Broker、EndpointはInterconnect Layerに接続 ▸ AMQPレベルではEndpointはBroker(や他のEndpoint)とメッセージを交換する ▸ メッセージのルーティングは(AMQP的な)アドレスベースで行う Interconnect Layer endpoint endpoint endpoint endpoint endpoint Broker Broker Broker Broker R R R R R R R R

Slide 19

Slide 19 text

Dispatch Router 19 ▸ AMQPのSender, Receiver, Broker等を接続するネットワークを構成 ▸ (メッセージのレプリケーションではなく) パスの冗長化によるHA ▸ ネットワークトポロジーの自動検出 ・ Link State型のルーティングプロトコル ・ Shortest Path Firstによる最短パスの計算 ・ トポロジー変更に自動的に追随 OSPFやIS-ISとほぼ同じ コストはリンク作成時に設定可 能 Publisher Broker Subscriber Publisher Router Subscriber Send message Accepted Send message Accepted Send message Accepted Send message Accepted Broker: メッセージを受け取り、配送する Router: メッセージを転送する

Slide 20

Slide 20 text

その他 20

Slide 21

Slide 21 text

その他雑感 21 ▸ Qpid Dispatch Router (qdrouterd) さん、基本はCで書かれているが、Link Stateの管理や Dijkstra's algorithmで最短経路を計算するロジックはPythonで書かれている ・ Python Embedding ▸ NATの向こうのオンプレクラスターとパブリッククラウドのクラスターでも接続できるのは良い ・ パブリッククラウド側でトークンを作成し、オンプレクラスターからリンクを張る ・ Forward Proxy越えだとうまくリンクが張れなかった...要調査(そもそもできないかも) ▸ 気になるところ ・ UDPは送れない ・ パフォーマンス出るか気になる ・ インターネット越しのLink State型ルーティングプロトコルってちゃんと動くかドキドキする ・ てゆーかなんでAMQP...

Slide 22

Slide 22 text

参考文献 22 ▸ 公式 ・ https://skupper.io/ ・ https://github.com/skupperproject ・ https://qpid.apache.org/components/dispatch-router/ ・ https://github.com/apache/qpid-dispatch ▸ Skupper ・ Skupper.io: Let your services communicate across Kubernetes clusters ・ Use Skupper to connect multiple Kubernetes clusters ・ Virtual Application Networks for Hybrid Cloud Interconnect ・ AMQP InterconnectベースでKubernetesのマルチクラスタ間のネットワークを構成する Skupperのご紹介 ・ Skupperを使ってMAC PCとAWS上のOpenShiftのマルチクラスタネットワークを作ってみる ・ Skupperを使ってクラスタ間を結びコンテナイメージをコピー ▸ MQTT, AMQP, ... ・ MQTTとAMQPと.NET ・ 初めてのMQTT ・ MQTTとはなんだったのか ・ MQTTのMQはMessage Queueではありません ・ 通信プロトコルAMQPはIoTに向いているか調査せよ! ・ Messages-as-a-Service

Slide 23

Slide 23 text

linkedin.com/company/red-hat youtube.com/user/RedHatVideos facebook.com/redhatinc twitter.com/RedHat 23 Red Hat is the world’s leading provider of enterprise open source software solutions. Award-winning support, training, and consulting services make Red Hat a trusted adviser to the Fortune 500. Thank you