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

今こそ学びたいKubernetesネットワーク ~CNIが繋ぐNWとプラットフォームの「フラッ...

今こそ学びたいKubernetesネットワーク ~CNIが繋ぐNWとプラットフォームの「フラッと」な対話

2026/2/12 JANOG57 Meeting in Osakaにて登壇した際の資料です。

Avatar for Takuto Nagami

Takuto Nagami

February 11, 2026
Tweet

More Decks by Takuto Nagami

Other Decks in Technology

Transcript

  1. 自己紹介 • Takuto Nagami (@logica0419) • 千葉工業大学 情報科学部 情報ネットワーク学科 4年

    ◦ 研究: 合意アルゴリズム (Raft) × 暗号 (秘密分散) • 得意技術: Go言語 / コンテナ / Kubernetes • JANOG歴 ◦ JANOG56 若者支援で参加 ◦ JANOG57 初登壇!
  2. 自己紹介 • Kotaro Kawasaki (@n4mlz) • 筑波大学 情報学群情報科学類 3年 •

    趣味: コンテナランタイム自作、OS 自作、車輪の再発明 • 最近 という Linux コンテナをネイティブ実 行できる自作 OS を Rust で書いています
  3. K8sネットワークの自社開発・改造例 • Google Cloud: GKE Dataplane V1 / V2 •

    AWS: Amazon VPC CNI • Microsoft Azure: Azure CNI • Cybozu: Coil on Neko基盤 ◦ 国内のクラウドでの例はこれしか見たことがない (公開されていないだけかもしれません) ◦ ↑ この状況を変えよう!というのが今回の目的
  4. アジェンダ • イントロダクション ←イマココ • Kubernetesを知る • Kubernetesとネットワーク • Linuxのネットワークスタック

    • L2/L3ネットワーク: CNI • L4ロードバランサー: kube-proxy • プラットフォームとの対話で広がる可能性 • まとめ
  5. アジェンダ • イントロダクション • Kubernetesを知る ←イマココ • Kubernetesとネットワーク • Linuxのネットワークスタック

    • L2/L3ネットワーク: CNI • L4ロードバランサー: kube-proxy • プラットフォームとの対話で広がる可能性 • まとめ
  6. ReplicaSet / Deployment • Podをまとめて管理するための仕組み • ReplicaSet: 同じ内容のPodを指定個数立てる • Deployment:

    ReplicaSetを使い安全にバージョン移行 Deployment ReplicaSet (旧) Pod Pod ReplicaSet (新) Pod Pod
  7. ReplicaSet / Deployment • Podをまとめて管理するための仕組み • ReplicaSet: 同じ内容のPodを指定個数立てる • Deployment:

    ReplicaSetを使い安全にバージョン移行 Deployment ReplicaSet (旧) Pod Pod ReplicaSet (新) Pod Pod
  8. ReplicaSet / Deployment • Podをまとめて管理するための仕組み • ReplicaSet: 同じ内容のPodを指定個数立てる • Deployment:

    ReplicaSetを使い安全にバージョン移行 Deployment ReplicaSet (新) Pod Pod ReplicaSet (旧) Pod Pod
  9. Serviceのタイプ Pod Pod Service ClusterIP Service NP / LB クラスタ外

    クラスタ内 • ClusterIP: クラスタ内からの通信のみ受け付ける • NodePort / LoadBalancer: クラスタ外からの通信も 受け付ける
  10. Reconciliation Loop • 以下の操作を一定時間ごとに繰り返す ◦ 理想の状態 (宣言されたマニフェスト) を取得 ◦ 実際の状態を観測

    ◦ 理想の状態と実際の状態を比較 ◦ 2つの差を埋めるように、実際の状態を変更する • Controllerと呼ばれる部品がこれを担当する • Self-Healingが簡単に実装できる
  11. アジェンダ • イントロダクション • Kubernetesを知る ←イマココ • Kubernetesとネットワーク • Linuxのネットワークスタック

    • L2/L3ネットワーク: CNI • L4ロードバランサー: kube-proxy • プラットフォームとの対話で広がる可能性 • まとめ
  12. アジェンダ • イントロダクション • Kubernetesを知る • Kubernetesとネットワーク ←イマココ • Linuxのネットワークスタック

    • L2/L3ネットワーク: CNI • L4ロードバランサー: kube-proxy • プラットフォームとの対話で広がる可能性 • まとめ
  13. Pod Kubernetesを流れる通信 3種 • Pod → Service → Pod ◦

    クラスタ内通信 ◦ ノード内とノード間を考慮する必要がある Service Pod
  14. Kubernetesを流れる通信 3種 • 外部 → Service → Pod ◦ クラスタ外からのIngress通信

    ◦ Gateway API (L7LB) というリソースとの関わりが 深いが、本プログラムでは割愛 Service クラスタ外 Pod
  15. ネットワークを担当する部品たち • CNI ◦ Pod → Pod / Pod →

    外部 を担当 ◦ PodのL2/L3ネットワーク疎通を担保する ◦ Kubernetesのデフォルト実装はない • kube-proxy ◦ Service → Pod / 外部 → Service を担当 ◦ 複数Podに対するL4LB (Service) を実装する ◦ Kubernetesがデフォルト実装を用意している
  16. アジェンダ • イントロダクション • Kubernetesを知る • Kubernetesとネットワーク ←イマココ • Linuxのネットワークスタック

    • L2/L3ネットワーク: CNI • L4ロードバランサー: kube-proxy • プラットフォームとの対話で広がる可能性 • まとめ
  17. アジェンダ • イントロダクション • Kubernetesを知る • Kubernetesとネットワーク • Linuxのネットワークスタック ←イマココ

    • L2/L3ネットワーク: CNI • L4ロードバランサー: kube-proxy • プラットフォームとの対話で広がる可能性 • まとめ
  18. Network Namespace (netns) • Linuxの機能のうちの一つ • 1台のマシンの中に独立した仮想のホストを作る • netns1つにつき、1マシンと考えてよい ◦

    Podの (ネットワーク的な) 実体 ◦ それぞれ個別に、NICを生やしたりIP/MACアドレス を持たせたりできる
  19. 実は、親マシンのネットワークも… Node Root Namespace Pod1 Pod2 NIC 親マシンというHWの枠に (親マシン自身のNWも含め) 区切られたネットワークが

    たくさんあるイメージ ハードウェアの境界線と ネットワークの境界線が 別物になるということ
  20. Node ex) 複雑なサブネット構造 Host NS 192.168.1.0/24 192.168.2.0/24 NIC1 NIC2 NIC0

    destiation next hop 192.168.1.0/24 NIC1 192.168.2.0/24 NIC2 0.0.0.0/0 NIC0
  21. netfilter • パケットをフィルタ・加工・転送できる仕組み ◦ Filter ▪ 特定のIPアドレス・ポート宛のパケットを落とす ◦ NAT ▪

    送り元・送り先のIPアドレス・ポートを変更する • 操作方法 (フロントエンド) ◦ 長らくiptablesを使って設定されていたが、非推奨に ◦ 後継のnftablesへの移行が進んでいる
  22. アジェンダ • イントロダクション • Kubernetesを知る • Kubernetesとネットワーク • Linuxのネットワークスタック ←イマココ

    • L2/L3ネットワーク: CNI • L4ロードバランサー: kube-proxy • プラットフォームとの対話で広がる可能性 • まとめ
  23. アジェンダ • イントロダクション • Kubernetesを知る • Kubernetesとネットワーク • Linuxのネットワークスタック •

    L2/L3ネットワーク: CNI ←イマココ • L4ロードバランサー: kube-proxy • プラットフォームとの対話で広がる可能性 • まとめ
  24. 余談: CNIは (実質) Kubernetesだけ • DockerやPodmanなど、多くの人がローカルで使うコン テナランタイムは、独自のドライバを使って管理する ◦ Containerd (Dockerの中身)

    を直接触る人は少ない • 実際のユースケースは、ほぼKubernetesか類似のオー ケストレーションサービス • Kubernetesのネットワークのメンテナーも「CNIはK8s に特化した仕組みじゃないのに、ほぼK8sからしか使わ れない」と言っている
  25. 広義「CNI」 とは • CNI仕様 (containernetworkinterface/cni) ◦ コンテナ基盤がどのようにプラグインを呼び出すか の定義 • 基盤の要件定義

    ◦ 基盤としてどんなネットワークが欲しいのか • CNIプラグイン ◦ CNI仕様を通して操作が可能で、基盤の要件定義を 満たす実際のネットワーク実装
  26. CNI仕様 - 操作コマンド • CNIプラグインは5つのサブコマンドを備えたバイナリ として実装される必要がある ◦ ADDコマンド ◦ DELコマンド

    ◦ CHECKコマンド - 現在の状態を確認 ◦ GCコマンド - いらないリソースを掃除 ◦ VERSIONコマンド • 特に大事なのがADDとDEL
  27. メジャーなOSSプラグイン • Flannel ◦ ノードを跨ぐPod間通信にVXLANを使用したCNI • Calico ◦ 各ノードの持つPod CIDRをBGPで広報するCNI

    • Cilium ◦ ノード内の通信にeBPFを活用したCNI この3つを例に、それぞれのデフォルトの通信方式がどのよ うに疎通性を実現しているか見ていきましょう
  28. Flannel - 異なるノード間 下準備: 各ノードに固有のサブネットを割り当てる Node1 - 10.1.1.0/24 Host NS

    Node2 - 10.1.2.0/24 Host NS VXLAN VXLAN Pod全体のIPレンジは 10.1.0.0/16とする
  29. Flannel - 異なるノード間 下準備: 各ノードに固有のサブネットを割り当てる Node1 - 10.1.1.0/24 Host NS

    Node2 - 10.1.2.0/24 Host NS VXLAN VXLAN このサブネットで どのノードにいるPodなのか 判別する
  30. Flannel - 異なるノード間 下準備: ルーティングテーブルにエントリを追加 Node1 - 10.1.1.0/24 Host NS

    Node2 - 10.1.2.0/24 Host NS VXLAN VXLAN destiation next hop 10.1.1.0/24 Bridge 10.1.0.0/16 VTEP destiation next hop 10.1.2.0/24 Bridge 10.1.0.0/16 VTEP
  31. Flannel - 異なるノード間 通信時: 10.1.1.1から10.1.2.1へ送る時 Node1 - 10.1.1.0/24 Host NS

    Node2 - 10.1.2.0/24 Host NS VXLAN VXLAN Pod - 10.1.1.1 Pod - 10.1.2.1
  32. Flannel - 異なるノード間 通信時: ルーティングテーブルを確認 Node1 - 10.1.1.0/24 Host NS

    Node2 - 10.1.2.0/24 Host NS VXLAN VXLAN Pod - 10.1.1.1 Pod - 10.1.2.1 destiation next hop 10.1.1.0/24 Bridge 10.1.0.0/16 VTEP
  33. Flannel - 異なるノード間 通信時: ルーティングテーブルを確認 Node1 - 10.1.1.0/24 Host NS

    Node2 - 10.1.2.0/24 Host NS VXLAN VXLAN Pod - 10.1.1.1 Pod - 10.1.2.1 destiation next hop 10.1.2.0/24 Bridge 10.1.0.0/16 VTEP
  34. Flannel - 特徴まとめ • 同じノード内でのL3疎通 ◦ Linux Bridgeで全てのPodをL2接続する • 異なるノード間のL3疎通

    ◦ VXLANを用いて別ノードにパケットを丸ごと輸送す るオーバーレイネットワーク ▪ 余談) WireguardなどVPNで輸送するモードも • サブネットでノードを見分ける • netfilterでIPマスカレードする
  35. Node1 - 10.1.1.0/24 Calico - 同じノード内 Host NS Pod 10.1.1.1

    Pod作成時: vethでHost Namespaceと直接接続 NIC1
  36. Node1 - 10.1.1.0/24 Calico - 同じノード内 Host NS Pod 10.1.1.1

    Pod作成時: ルーティングテーブルにエントリを追加 NIC1 destiation next hop 10.1.1.1/32 NIC1
  37. Calico - 同じノード内 通信時: スタティックルーティングでL3疎通が通る Node1 - 10.1.1.0/24 Host NS

    Pod 10.1.1.1 NIC1 destiation next hop 10.1.1.1/32 NIC1 10.1.1.2/32 NIC2 Pod 10.1.1.2 NIC2
  38. Calico - 異なるノード間 下準備: BIRD (ルーターソフトウェア) でBGPピアを張る Node1 - 10.1.1.0/24

    Host NS Node2 - 10.1.2.0/24 Host NS BIRD BIRD デフォルトでは全てのノードが フルメッシュで張る 別途ルーターを用意すれば ハブ & スポークもOK
  39. Calico - 異なるノード間 下準備: 自分のノードのPodサブネットを互いに広報する Node1 - 10.1.1.0/24 Host NS

    Node2 - 10.1.2.0/24 Host NS BIRD BIRD destiation next hop 10.1.1.0/24 lo destiation next hop 10.1.2.0/24 lo
  40. Calico - 異なるノード間 下準備: 自分のノードのPodサブネットを互いに広報する Node1 - 10.1.1.0/24 Host NS

    Node2 - 10.1.2.0/24 Host NS BIRD BIRD destiation next hop 10.1.1.0/24 lo destiation next hop 10.1.2.0/24 lo
  41. Calico - 異なるノード間 下準備: 自分のノードのPodサブネットを互いに広報する Node1 - 10.1.1.0/24 Host NS

    Node2 - 10.1.2.0/24 Host NS BIRD BIRD destiation next hop 10.1.1.0/24 lo 10.1.2.0/24 Node2 destiation next hop 10.1.2.0/24 lo 10.1.1.0/24 Node1
  42. Calico - 異なるノード間 Pod作成時: 追加操作は特になし Node1 - 10.1.1.0/24 Node2 -

    10.1.2.0/24 Pod - 10.1.1.1 Pod - 10.1.2.1 Host NS Host NS BIRD BIRD NIC1 NIC1
  43. Calico - 異なるノード間 Node1 - 10.1.1.0/24 Node2 - 10.1.2.0/24 Pod

    - 10.1.1.1 Pod - 10.1.2.1 Host NS Host NS BIRD BIRD NIC1 NIC1 通信時: 10.1.1.1から10.1.2.1へ送る時
  44. Calico - 異なるノード間 Node1 - 10.1.1.0/24 Node2 - 10.1.2.0/24 Pod

    - 10.1.1.1 Pod - 10.1.2.1 Host NS Host NS BIRD BIRD NIC1 NIC1 通信時: デフォルトゲートウェイとなっているHost NSへ
  45. Calico - 異なるノード間 Node1 - 10.1.1.0/24 Node2 - 10.1.2.0/24 Pod

    - 10.1.1.1 Pod - 10.1.2.1 Host NS Host NS BIRD BIRD 通信時: ルーティングテーブルを確認 NIC1 NIC1 destiation next hop 10.1.1.1/32 NIC1 10.1.1.0/24 lo 10.1.2.0/24 Node2
  46. Calico - 異なるノード間 Node1 - 10.1.1.0/24 Node2 - 10.1.2.0/24 Pod

    - 10.1.1.1 Pod - 10.1.2.1 Host NS Host NS BIRD BIRD 通信時: アンダーレイから直接、next hopのNode2へ送信 NIC1 NIC1
  47. Calico - 異なるノード間 Node1 - 10.1.1.0/24 Node2 - 10.1.2.0/24 Pod

    - 10.1.1.1 Pod - 10.1.2.1 Host NS Host NS BIRD BIRD 通信時: ルーティングテーブルを確認 NIC1 NIC1 destiation next hop 10.1.2.1/32 NIC1 10.1.2.0/24 lo 10.1.1.0/24 Node1
  48. Calico - 異なるノード間 Node1 - 10.1.1.0/24 Node2 - 10.1.2.0/24 Pod

    - 10.1.1.1 Pod - 10.1.2.1 Host NS Host NS BIRD BIRD NIC1 NIC1 通信時: next hopのNIC1から宛先に到達
  49. Calico - 特徴まとめ • 同じノード内でのL3疎通 ◦ スタティックルーティングする • 異なるノード間のL3疎通 ◦

    BGPで経路を広報、直接相手ノードに送るPure L3 ▪ オーバーレイよりも高効率 ◦ 【制約】ノード間が1hopで繋がる必要がある ▪ ノード間接続がL2かIPIPのどちらか • それ以外はFlannel同様
  50. Node1 - 10.1.1.0/24 Cilium - 同じノード内 Host NS Pod 10.1.1.1

    Pod作成時: vethでHost Namespaceと直接接続 NIC1
  51. Node1 - 10.1.1.0/24 Cilium - 同じノード内 Host NS Pod 10.1.1.1

    Pod作成時: Host側のNICにeBPFがアタッチされる NIC1
  52. Node1 - 10.1.1.0/24 Cilium - 同じノード内 Host NS Pod 10.1.1.1

    Pod作成時: 別Podも同様 NIC1 Pod 10.1.1.2 NIC2
  53. Node1 - 10.1.1.0/24 Cilium - 同じノード内 Host NS Pod 10.1.1.1

    NIC1 Pod 10.1.1.2 NIC2 通信時: 10.1.1.1から10.1.1.2へ送る時
  54. Node1 - 10.1.1.0/24 Cilium - 同じノード内 Host NS Pod 10.1.1.1

    NIC1 Pod 10.1.1.2 NIC2 通信時: デフォルトゲートウェイとなっているHost NSへ
  55. Node1 - 10.1.1.0/24 Cilium - 同じノード内 Host NS Pod 10.1.1.1

    NIC1 Pod 10.1.1.2 NIC2 通信時: パケットがNICに着くとeBPFプログラムが起動
  56. Node1 - 10.1.1.0/24 Cilium - 同じノード内 Host NS Pod 10.1.1.1

    NIC1 Pod 10.1.1.2 NIC2 通信時: 宛先MACを宛先PodのMACに書き換える
  57. Node1 - 10.1.1.0/24 Cilium - 同じノード内 Host NS Pod 10.1.1.1

    NIC1 Pod 10.1.1.2 NIC2 通信時: eBPFの機能でNIC2に直接転送
  58. Node1 - 10.1.1.0/24 Cilium - 同じノード内 Host NS Pod 10.1.1.1

    NIC1 Pod 10.1.1.2 NIC2 通信時: あとはそのまま宛先Podへ
  59. Cilium - 異なるノード間 • Ciliumは、同じノードのPod宛でなければ、eBPFプログ ラムを抜けてLinux側に処理を投げる • Ciliumはあらかじめ、異なるノード間のパケット転送の ために以下のいずれかを用意する ◦

    Overlayモード: Flannelと同じVXLANを使う転送 ◦ Nativeモード: Calicoと同じBGP広報を使う転送 • すなわち、Ciliumの異なるノード間疎通はFlannelか Calicoと全く同じ仕組みで行われる
  60. • 同じノード内でのL3疎通 ◦ eBPFを使って高速にルーティングを行う • 異なるノード間のL3疎通 ◦ Flannel / Calicoと同じ仕組みを使う

    ◦ 外からノードに入ってきたパケットは「同じノード 内での疎通」と同じくeBPFでPodまで運ばれる • eBPFでIPマスカレードする Cilium - 特徴まとめ
  61. ところで: 汎用的 ≠ それだけでいい • これらのOSSは汎用を目指している ◦ どんな環境でも動くように、一般的な仕組みのみを 利用して実装をしている •

    メジャーなOSSプラグインは、どんな所でも使える汎用 性の代わりにオーバーヘッドを許容している ◦ 特にオーバーレイは顕著に遅い ◦ SDNはそれなりにノードに処理を要求する
  62. 環境特化なCNIプラグインの例 • GKE Dataplane V2 ◦ GKEでデフォルトになっているプラグイン • AWS VPC

    CNI ◦ EKSで使える、VPCをベースにしたプラグイン • Coil on Neko ◦ Cybozuが開発しているプラグイン それぞれの概要を軽く見ていきましょう
  63. GKE Dataplane V2 • GKEの開発チームがCiliumをカスタマイズしたもの • 同じノード内でのL3疎通 ◦ Ciliumの仕組みをそのまま用いる •

    異なるノード間のL3疎通 ◦ 準備: アンダーレイネットワークに設定を流し込む ◦ 同ノード内のPod宛でなければそのまま外に出す ◦ アンダーレイネットワークがルーティングする
  64. GKE Dataplane V2 - 異なるノード間 Pod作成時: アンダーレイネットワークに設定を流し込む Node1 Pod1 Host

    NS NIC1 Node1 Pod2 Host NS NIC1 Pod1、Pod2の 経路情報をCNIが教える このような仕組みで ただパケットを外に出すだけで 勝手に相手がいるノードに 届く状態が実現される
  65. Amazon VPC CNI • AWS VPCとの連携に非常に強いCNI • VPCの中からPodのIPアドレスが割り当てられる ◦ ノードの固定サブネットが無いので、アドレス空間

    の効率良い利用ができる • 疎通性の確保もVPCを通して行われる ◦ 詳細はあまり公開されていない • 同じVPC内にいれば、VM等と直接通信ができる
  66. Coil • CybozuでNeko基盤を作っているチームが開発している オープンソースのCNI • Neko基盤内では、Cilium & BIRDと組み合わせて運用 • 同じノード内でのL3疎通

    ◦ Ciliumの仕組みをそのまま用いる • 異なるノード間のL3疎通 ◦ Calicoと同じくBIRDからBGPで経路広報するが、 アンダーレイネットワークに経路を流す
  67. Coil - 異なるノード間 Node1 Host NS Node1 Host NS 下準備:

    BIRDでアンダーレイネットワークとBGPピアを張る BIRD BIRD
  68. Coil - 異なるノード間 Node1 Host NS Node1 Host NS 下準備:

    Podサブネットを全体で互いに広報する BIRD BIRD
  69. アジェンダ • イントロダクション • Kubernetesを知る • Kubernetesとネットワーク • Linuxのネットワークスタック •

    L2/L3ネットワーク: CNI ←イマココ • L4ロードバランサー: kube-proxy • プラットフォームとの対話で広がる可能性 • まとめ
  70. アジェンダ • イントロダクション • Kubernetesを知る • Kubernetesとネットワーク • Linuxのネットワークスタック •

    L2/L3ネットワーク: CNI • L4ロードバランサー: kube-proxy ←イマココ • プラットフォームとの対話で広がる可能性 • まとめ
  71. kube-proxy Node Pod A Pod B Pod src: Pod dst:

    Service Service netfilter なんとか します!
  72. kube-proxy Node Pod A Pod B Pod Service src: Pod

    dst: Service Pod A netfilter 監視
  73. kube-proxy Node Pod A Pod B Service src: Pod dst:

    Pod A Pod ここまでやれば あとはCNIの仕事
  74. kube-proxy Node Pod A Pod B Service src: Pod dst:

    Pod B Pod kube-proxyの役目は Serviceに属するどこかの PodにDNATするだけ
  75. 【復習】Serviceのタイプ Pod Pod Service ClusterIP Service NP / LB クラスタ外

    クラスタ内 • ClusterIP: クラスタ内からの通信のみ受け付ける • NodePort / LoadBalancer: クラスタ外からの通信も 受け付ける
  76. 外部から通信を受け付けるService • NodePort ◦ 30000-32767のうち1つのポートを割り当て、全 ノードでそのポート宛の通信を受け取る • LoadBalancer ◦ Nodeportと同じ環境をそろえる

    ◦ 外部L4LBと連携しクラスタ外からアクセスできるIP アドレスを割り当て、LBから ↑ で用意したポート にロードバランシングする
  77. Type: LoadBalancer Service LB 監視 Pod Pod netfilter netfilter 外部L4LB

    クラスタ外から アクセス可能な IPアドレスを 割り当て
  78. 外部L4LB • Type: LoadBalancer用の外部L4LBは、Kubernetesが デフォルトで用意していないコンポーネント ◦ 既存の基盤に合わせて選定 or 自作の必要がある •

    実装例 ◦ MetalLB ▪ オンプレ環境を想定した汎用OSS ◦ AWS Load Balancer Controller ▪ AWSのNLBを使った実装
  79. アジェンダ • イントロダクション • Kubernetesを知る • Kubernetesとネットワーク • Linuxのネットワークスタック •

    L2/L3ネットワーク: CNI • L4ロードバランサー: kube-proxy ←イマココ • プラットフォームとの対話で広がる可能性 • まとめ
  80. アジェンダ • イントロダクション • Kubernetesを知る • Kubernetesとネットワーク • Linuxのネットワークスタック •

    L2/L3ネットワーク: CNI • L4ロードバランサー: kube-proxy • プラットフォームとの対話で広がる可能性 ←イマココ • まとめ
  81. 今日はこんなお話をしました • イントロダクション • Kubernetesを知る • Kubernetesとネットワーク • Linuxのネットワークスタック •

    L2/L3ネットワーク: CNI • L4ロードバランサー: kube-proxy • プラットフォームとの対話で広がる可能性 • まとめ