【イベントレポート】Kubernetes トラフィックルーティング徹底解説 #ochacafe

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回は12/11（水）に参加した**Kubernetes トラフィックルーティング徹底解説**へ参加しましたので、アウトプットとしてイベントレポートを執筆いたしました。

○イベントページ

https://ochacafe.connpass.com/event/333245/

⚪︎アーカイブ

https://m.youtube.com/watch?v=oRz0Nl66prw

:::note info
あくまで、参加者のとしての感想をまとめております。
そのため、イベント内でのデモ画像などは掲載していないですので、ご留意いただけますと幸いです。

また、誤字脱字・認識相違などは極力排除した執筆を心がけていますが、リアルタイムでイベントレポートを執筆しております。もし、誤字脱字や認識相違などがありましたら、コメントをいただけますと幸いです。
:::

## イベント概要
>Oracle Cloud Hangout Cafe (通称「おちゃかふぇ」) は開発者・エンジニアに向けたテクニカルな勉強会です。
クラウドネイティブな時代に身につけておくべきテクノロジーを深堀りしていきます。
OCHaCafe のテーマはオープン/デファクト・スタンダードを基準に選定し、参加される皆さんがどんなプラットフォームを使っていたとしても必ずスキルアップに役立てられる内容になっています。

## 今回のセッションテーマ
>Oracle Cloud Hangout Cafe Season9 3回目は、Kubernetesのトラフィックルーティングについて取り上げます。
k8sでのコンテナ内外からのトラフィックルーティングには、ServiceやIngressといった仕組みを利用することが多いと思います。
また、昨年にはGateway APIという新たな実装もGAになりました。

今回はこのような3つの仕組みを中心にk8sで自由自在にトラフィックを操る方法についてみなさんと一緒に見ていきたいと思います。
いつも通り、デモもたくさんお見せしながらDeep Diveしていきたいと思うので、一緒にk8sのトラフィックルーティングを完全に理解しましょう!!

## Kubeshark で Kubernetes の Traffic を眺めてみよう

[Kubeshark で Kubernetes の Traffic を眺めてみよう](https://speakerdeck.com/kota2and3kan/lets-look-at-k8s-traffic-with-kubeshark)

- Kubeshark Overviewとは
    - K8Sに特化したWireSharkのようなもの
    - いい感じのダッシュボードも実装している
    - 4アカウントまでは無料利用可能
- 利用方法
    - K8S内でKubesharkコマンドを通じてインストール可能
    - プロトコル・レコード情報などがダッシュボード上に表示されている
    - 各ノード間を視覚的に表示してくれる
        - ノード除外・ネームスペース指定にも対応してくれる
- ユースケース（ネットワーク監視）
    - コードを記述すればAPI監視もできる
        - ログとしてパス情報などをアウトプットすることもできる
    - 自動検知ツールをJavaScriptで実装できる
- その他
    - 外部サービスとの連携も可能（Slack通知・DB連携など）
    - TLS暗号化された通信の中身を見ることができる

### LT所感
Kubesharkに関して今まで存じ上げていなかったので、本LTを通じて理解を深めることができました。また、公式ドキュメントもあるようですので、チェックしながら実装してみるのも面白そうだなぁといった印象を持ちました。

## Kubernetes トラフィックルーティング徹底解説
[Kubernetesトラフィックルーティング徹底解説/Kubernetes-traffic-deep-dive](https://speakerdeck.com/oracle4engineer/kubernetes-traffic-deep-dive?slide=15)
- 自己紹介
    - 日本オラクル社のソリューションエンジニア
    - 夜な夜な登壇している
    - オラクル社へJoinして5年（前職はSIer）
- 閑話休題
    - 一度applyされたPodへの道は忘れないものさ。ユーザが思い出せないだけで
- トラフィックルーティングの基礎
    - 日本語では**経路制御**の意味
        - ルーターが役割を担っている
        - OSI参照モデルとしてはレイヤ3
        - ルーティングテーブルを通じて経路設定を行っている
        - 宛先（最終到達地点）、ネクストホップ（途中地点）、出力インターフェース（出力先）の3つで成り立っている
    - ルーティングあれこれ
            - スタティックルーティング
            - 手動でルーティング設定を行う
        - ダイナミックルーティング
            - 自動でルーティング設定を行ってくれる
            - ルーターへCPU負荷が発生する
            - 管理者側でルーティングプロトコルを理解する必要がある
    - IGPとBGPで分かれている
        - BGPはインターネット間のルーティングを行うためのプロトコル（EGP）
            - 各BGPにAS番号が振られる
        - 内部向けネットワークではOSPFプロトコルなどのIGPを利用する
    - IPtablesとは
        - ファイアウォールとルータ機能を備えたパケットフィルタ
            - OSI参照モデルとしてはレイヤ4
            - INPUT,OUTPUTなどのチェインを意識して設定する
- kubernetesサービス
    - Serviceとは
        - 一つ以上のPodを公開するためのロードバランサ
        - サービスディスカバリを実現するツール
        - PodのIPアドレス・MACなどの情報が変わっても安定して通信できる
    - ClusterIP
        - 下部のリソースのIPをまるっと管理してくれるもの
    - EndpointSlice
        - サービス単位のオーケストレーションを行ってくれる機能
        - GET EPコマンドを実行すればエンドポイント情報を見ることができる
    - ClusterIPの動作モード
        - Windows対応のカーネル動作モードは省略
        - iptablesモード（デフォルト）：iptablesへ設定を同期させて通信
            - ルーティングは対象Podへランダムに実施
            - オーバーヘッドが最も少ない動作
        - nfttablesモード：iptablesの上位モード
            - kube-proxyではnfttablesネイティブで動作
        - IPVSモード：(IP Vurtual Server）を利用したもの
            - 昔からある動作モードだが、開発はそこまで進んでいない
        - user-spaceモード（削除済み）：iptablesへ同期するが、ルーティングはkube-proxyで行う
            - kube-proxyがボトルネックになるため削除
    - NodePort・LoadBalancerモードもある
        - LoadBalancer利用する場合は、クラウドベンダー提供のコントローラからAPI実行する形になる
    - ExternalName（外部DNS）
        - 本番環境と韓発環境のリソースを分けるときなどに利用する
    - Headless Service（内部DNS）
        - PodのIPアドレスを直接公開する
            - StateFullSet（Podが終了してもIPが変わらない）では利用される
    - エンドポイントを自分で生成する方法もある（セレクタ無しのService）
- kubernetes Ingress
    - 外部からの対象Podに対してHTTPSベースのルーティングを可能にするリソース
        - 外部へPodを公開するのはServiceの役割なので、必ず背後にServiceがいる
    - Ingress Controller
        - Ingressを管理するコントローラ
        - クラウドベンダによってはベンダが定義したコントローラになる場合も
        - アノテーションで詳細設定を定義するため、柔軟さは...
    - Ingressリソース
        - パスベース・Hostベースでも設定方法は大体同じ
    - ExternalDNS
        - kubernetes内のリソースをパブリックDNSサーバで検出できるようにするシステム
            - AWS、Azureなどが提供しているパブリックDNSでも利用されている
- Service/Ingressの課題
    - クラスター管理者 or 開発者どちらが対応するのか
        - Gateway APIが解決してくれる
    - Gateway API
        - 新たに実装されたkubernetesトラフィックルーティングAPI
        - サポートしているプロトコルはクラウドベンダによる
        - 拡張機能に関してはGEPで管理している
    - リソース設定
        - Ingressと設定項目は類似しているがリスナー設定は経路が異なる
            - プロトコルに応じて重みづけを行うことができる
            - すごくざっくり言えば、**Ingressの上位互換**
    - ルール処理のあれこれ
        - 複数類似したルールがある場合、**ロンゲストマッチ**で処理する
    - Gateway APIメリット
        - Ingressより可搬性が高いため、柔軟に処理が行える
    - 考慮事項
        - 管理するリソース数が多くなってしまう
    - Ingressの開発は凍結している
        - 今後どうなるかは神のみぞ知る...
    - IngressからGateway APIへの移行
        - 手動で定義を書き換える方法しかない
        - 自動で定義を書き換えるツールもあるが、クラウドベンダによっては利用できない場合も
- 質疑応答
    - 開発の方向性として
        - LBを通じた重みづけ処理も重要なので、何とも言えない

### ワークショップ所感
K8Sに関して少ししか触っていなかったので、技術仕様や最新トレンドはあまりキャッチアップできていなかったので、本ワークショップを通じて、キャッチアップできたかなぁと思いました。

あわせて、K8Sに関して、うっすらとしたイメージですが、L4の世界までしかフォローしていない印象でしたので、Ingressなどを活用してL7まで拡張できるのは技術の幅を考えるとよいのかなぁと思いました。

## まとめ

参加前はkubernetesに関してざっくりとした理解しかなかったため、本セッションを通じて、kubernetesに関して解像度を少し高めることができたのかなぁと思いました。

また、定義ファイルに関してYAML形式だったので、とっつきやすい印象を持ちました。今後、仮想化技術をキャッチアップするうえでkubernetesが必要不可欠なので、今回キャッチアップした情報について、自身で調査しながら、肉付けを行っていきたいと思いました。

## kubeshark参考ページ
[GitHub](https://github.com/kubeshark/kubeshark)
[公式サイト](https://www.kubeshark.co/)
[KubernetesのモニタリングツールのKubesharkを触ってみた](https://tech.virtualtech.jp/entry/2022/12/28/120232)

## トラフィックルーティング参考ページ
[トラフィックルーティング概要](https://www.cisco.com/c/ja_jp/td/docs/security/asa/asa920/asdm720/general/asdm-720-general-config/route-overview.pdf)
[スタティックルーティング](https://www.n-study.com/iprouting/static-routing-configuration-example/)
[ダイナミックルーティング](https://www.itbook.info/network/cisco19.html)
[EIGRP/OSPF/BGP/RIP：それぞれの違いを解説](https://qiita.com/FScom_Japan/items/ae91dd7d342bd2657cf0)
[RFCドキュメント](https://www.rfc-editor.org/rfc/rfc4271)
[IPtablsの概要](https://knowledge.sakura.ad.jp/4048/)
[kubernetesドキュメント](https://kubernetes.io/docs/home/)
[アーキテクチャ関連ドキュメント](https://kubernetes.io/docs/concepts/architecture/)
[nfttables操作方法](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/securing_networks/getting-started-with-nftables_securing-networks)
[Kubernetesの Service についてまとめてみた](https://qiita.com/kouares/items/94a073baed9dffe86ea0)
[[Kubernetes 1.30] kube-proxy の nftables モード](https://zenn.dev/toversus/articles/dcb888d73f0615)
[kubernetes Ingressページ](https://kubernetes.io/ja/docs/concepts/services-networking/ingress/)
[externalDNS GitHub](https://github.com/kubernetes-sigs/external-dns)
[externalDNS関連ブログ](https://zenn.dev/rnakamine/articles/9c4d4cfa742749)
[kubernetes Gateway APIドキュメント](https://kubernetes.io/ja/docs/concepts/services-networking/gateway/)
[Ingress のその先: Gateway API という選択](https://qiita.com/daisuke-yamamoto/items/5f07802a4360168114a2)
[Migrating from Ingress](https://gateway-api.sigs.k8s.io/guides/migrating-from-ingress/)
[Gateway API の現在地 〜これまでとこれから〜](https://amsy810.hateblo.jp/entry/2023/12/01/090000)

## Ochacafe ダイジェスト記事
[「Oracle Cloud Hangout Cafe (OCHaCafe)」ダイジェスト 記事一覧第1弾](https://thinkit.co.jp/series/10728)
[「Oracle Cloud Hangout Cafe (OCHaCafe)」ダイジェスト 記事一覧第2弾](https://thinkit.co.jp/series/11131)