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

Kubernetes Networking 101

Kohei Ota
August 25, 2020

Kubernetes Networking 101

Kohei Ota

August 25, 2020
Tweet

More Decks by Kohei Ota

Other Decks in Technology

Transcript

  1. Kubernetes Networking 101
    Kubernetes Novice Tokyo #4
    Presented by @inductor

    View full-size slide

  2. 自己紹介
    名前: 太田 航平 (@inductor)
    所属: HPE
    役職: ソリューションアーキテクト
    Kubernetes SIG-Docs Japanese localization owner
    Cloud Native Ambassador
    Docker Meetup Tokyo、CNDT2020運営

    View full-size slide

  3. Kubernetesのネットワークは複雑

    View full-size slide

  4. ていうか、そもそもコンテナの
    ネットワークが複雑!

    View full-size slide

  5. 今日のゴール
    ● Dockerのネットワークがわかる
    ● DockerとKubernetesのなりたちの違いがわかる
    ○ DockerとKubernetesのネットワーク的な要件の違い
    ● Kubernetesでネットワークをつなげる仕組みの登場人物がわかる
    → コンテナネットワーク完全に理解した

    View full-size slide

  6. アジェンダ
    ● Dockerのネットワーク
    ○ コンテナとネットワークの関係
    ● Kubernetesのネットワーク
    ○ DockerとKubernetesのネットワーク要件の違い
    ■ Docker→Kubernetesに思考を引き上げる場合に生まれるネットワークの問題
    ■ Kubernetesでの解決策
    ● Kubernetesのネットワークを形作るコンポーネントとその役割
    ○ kube-proxy
    ○ CNI
    ■ よく使われるCNIの特徴

    View full-size slide

  7. Dockerのネットワーク

    View full-size slide

  8. Dockerのよくあるユースケース
    Docker Compose
    80:80
    3000
    3306

    View full-size slide

  9. Dockerのよくあるユースケース
    Docker Compose
    80:80
    3000
    3306
    Webなので公開
    アプリは
    内部だけ
    DBは
    内部だけ

    View full-size slide

  10. Dockerとネットワーク、ボリューム
    Volume Volume Volume
    Docker Volume
    Docker Container
    Docker Network docker0 bridge
    ローカルの80
    仮想NIC 仮想NIC 仮想NIC
    10.0.0.0/24
    172.16.0.0/24

    View full-size slide

  11. ネットワークとボリュームは外部割り当て?
    Volume Volume Volume
    Docker Volume
    Docker Container
    Docker Network docker0 bridge
    ローカルの80
    仮想NIC 仮想NIC 仮想NIC
    10.0.0.0/24
    172.16.0.0/24

    View full-size slide

  12. ネットワークとボリュームは外部割り当て
    Volume Volume Volume
    Docker Volume
    Docker Container
    Docker Network docker0 bridge
    ローカルの80
    仮想NIC 仮想NIC 仮想NIC

    View full-size slide

  13. ネットワークとボリュームは外部割り当て
    Volume Volume Volume
    Docker Volume
    Docker Container
    Docker Network docker0 bridge
    ローカルの80
    仮想NIC 仮想NIC 仮想NIC
    Kubernetes Novice Tokyo #2 のセッション資料が詳しいので
    合わせてご覧ください

    View full-size slide

  14. Dockerネットワークの種類
    ● bridge - 指定がない場合にデフォルトで使用
    ○ 所属するコンテナが直接通信でき、お手軽
    ● macvlan - macvlanが使える
    ○ 仮想NICにMACアドレスが持てる
    ○ VMから移行したい場合などに使えるかも?ただし ホストのNICが使えなくなる制限有
    ● none - 「何も繋がない」ができる
    ○ loopback(127.0.0.1)以外に仮想NICが繋がらないモード
    ● Network plugins - その他サードパーティのプラグインを使う場合
    ○ プラグイン自体とても少なく利用例が ほとんどない

    View full-size slide

  15. コンテナとネットワークの関係

    View full-size slide

  16. を話す前にコンテナの仕組みを
    さらっと復習します

    View full-size slide

  17. コンテナの仕組み
    /
    /home /var /tmp
    /var/a /var/b /var/c /tmp/d
    ここに、あるLinuxホストのファイルシステムがあります

    View full-size slide

  18. コンテナの仕組み
    /
    /home /var /tmp
    /var/a /var/b /var/c /tmp/d
    / / / /
    pivot_root pivot_root pivot_root pivot_root
    あるディレクトリをルートに見せかける pivot_root

    View full-size slide

  19. コンテナの仕組み
    /
    /home /var /tmp
    /var/a /var/b /var/c /tmp/d
    / / / /
    namespace namespace namespace namespace
    ユーザーIDやNW、プロセス空間などを分離する namespace
    root
    10.0.0.1/24
    root
    10.0.0.2/24
    root
    10.0.0.3/24
    root
    10.0.0.3/24

    View full-size slide

  20. コンテナの仕組み
    /
    /home /var /tmp
    /var/a /var/b /var/c /tmp/d
    / / / /
    各領域のCPU、メモリリソースなどを cgroupで制限
    root
    10.0.0.1/24
    root
    10.0.0.2/24
    root
    10.0.0.3/24
    root
    10.0.0.3/24
    1CPU
    2GB
    1CPU
    2GB
    1CPU
    2GB
    2CPU
    4GB

    View full-size slide

  21. コンテナの仕組み
    /
    /home /var /tmp
    /var/a /var/b /var/c /tmp/d
    / / / /
    アプリケーションが動作するために必要なファイルたちを
    tar.gz形式でパッケージングしてこいつらの上にのっけて ...
    root
    10.0.0.1/24
    root
    10.0.0.2/24
    root
    10.0.0.3/24
    root
    10.0.0.3/24
    1CPU
    2GB
    1CPU
    2GB
    1CPU
    2GB
    2CPU
    4GB
    nginx on
    Ubuntu
    Node on
    Alpine
    Ruby on
    CentOS
    Debian

    View full-size slide

  22. /var /tmp
    コンテナの仕組み
    /
    /home
    /var/a /var/b /var/c /tmp/d
    / / / /
    展開したファイルシステムの実行ファイルをプロセスとして起動!
    1CPU
    2GB
    1CPU
    2GB
    1CPU
    2GB
    2CPU
    4GB
    nginx on
    Ubuntu
    Node on
    Alpine
    Ruby on
    CentOS
    Debian
    root
    10.0.0.1/24
    root
    10.0.0.2/24
    root
    10.0.0.3/24
    root
    10.0.0.3/24
    プロセス起動!

    View full-size slide

  23. /var /tmp
    コンテナの仕組み
    /
    /home
    /var/a /var/b /var/c /tmp/d
    / / / /
    展開したファイルシステムの実行ファイルをプロセスとして起動!
    1CPU
    2GB
    1CPU
    2GB
    1CPU
    2GB
    2CPU
    4GB
    nginx on
    Ubuntu
    Node on
    Alpine
    Ruby on
    CentOS
    Debian
    root
    10.0.0.1/24
    root
    10.0.0.2/24
    root
    10.0.0.3/24
    root
    10.0.0.3/24
    プロセス起動!
    これ1つ1つがコンテナ

    View full-size slide

  24. /var /tmp
    コンテナの仕組み
    /
    /home
    /var/a /var/b /var/c /tmp/d
    / / / /
    展開したファイルシステムの実行ファイルをプロセスとして起動!
    1CPU
    2GB
    1CPU
    2GB
    1CPU
    2GB
    2CPU
    4GB
    nginx on
    Ubuntu
    Node on
    Alpine
    Ruby on
    CentOS
    Debian
    root
    10.0.0.1/24
    root
    10.0.0.2/24
    root
    10.0.0.3/24
    root
    10.0.0.3/24
    プロセス起動!
    これ1つ1つがコンテナ
    これがコンテナイメージね

    View full-size slide

  25. Dockerコンテナとネットワークの関係
    ● コンテナはさまざまなリソースを隔離した結果生まれるもの
    ○ ネットワークもその1要素で、 NICは付けたり付けなかったりできる
    ● Noneドライバーを用いた場合、ネットワーク的に隔離されたコンテナができあが

    ● ブリッジの場合は仮想スイッチにどんどん接続されて相互に接続ができる
    ○ Dockerの内部DNSも勝手に参加するので、コンテナ名がついていれば名前で DNSも引ける
    ○ 設定ファイルでdb:3306とかweb:80とかapp:3000みたいなことが書けるのはそのおかげ
    ○ 簡易的ではあるがいわゆる「サービスディスカバリ」の一種

    View full-size slide

  26. ここまでのまとめ
    ● Dockerのネットワークとボリュームは外からアタッチすることができる
    ○ docker volume, docker networkコマンドで確認してみてね!
    ● ネットワーク機構にはいくつかの種類がある
    ○ 要件に合わせて選択することが可能

    View full-size slide

  27. Kubernetesのネットワーク

    View full-size slide

  28. 手元のKubernetesの中身を覗いてみる
    ● 外部に公開しているLonghornのWeb UIは、TCPの80番でLoadBalancerが
    アタッチされている
    ● でも、Dockerではポートの割り当てが発生していない
    ○ なんで?

    View full-size slide

  29. 手元のKubernetesの中身を覗いてみる
    ● 外部に公開しているLonghornのWeb UIは、TCPの80番でLoadBalancerが
    アタッチされている
    ● でも、Dockerではポートの割り当てが発生していない
    ○ なんで?
    こたえ:
    Dockerのネットワークを使っていないから!!!

    View full-size slide

  30. Kubernetesの仕組み
    ● コンテナを中心とした「分散システム」
    ○ 複数のマシンリソース (物理/仮想マシン)をクラスターにまとめて、アプリケーションをいい感じに
    動かす
    ○ (設定次第だけど)どのマシンでコンテナが動いても「同じように」動作する必要がある
    → マシンの持つネットワークに依存しない透過的なネットワークが必要
    それが理由で、Kubernetesのネットワークの基本はOverlay network構成

    View full-size slide

  31. Kubernetesの仕組み
    Pod Pod Pod
    Pod network(overlay)
    Service Network(overlay)
    Node Network(not overlay)
    普通のサーバーがつながる
    ネットワーク
    ClusterIPなどサービス間の
    通信で使うネットワーク
    コンテナ(Pod)自体に
    IPアドレスを持たせるためのネッ
    トワーク
    kube-proxy
    CNI

    View full-size slide

  32. Kubernetesの仕組み
    Pod
    Pod Pod
    Node Network(not overlay)
    Pod network(overlay)
    Service Network(overlay)
    普通のサーバーがつながる
    ネットワーク
    ClusterIPなどサービス間の
    通信で使うネットワーク
    コンテナ(Pod)自体に
    IPアドレスを持たせるためのネッ
    トワーク
    Podが入れ替わっても
    同じように動作する
    Nodeが障害を起こすと
    Podは自動で退避
    kube-proxy
    CNI

    View full-size slide

  33. Kubernetesのネットワークコンポーネント
    ● kube-proxy - 各ノードで動作
    ○ 各ノードでコンテナネットワークへの入り口を作る役割
    ■ 無いと、コンテナの外と中の経路が通らない
    ○ Linuxのiptablesやipvsを利用(最近ではeBPFベースの実装もある )
    ○ Serviceの実装
    ■ https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/service.go
    ● CNI(Container Network Interface) - クラスター全体で動作
    ○ Docker network driver相当のプラグイン機構を提供
    ○ Overlay Networkを提供
    ○ 外のネットワーク(プロトコル)とKubernetesのネットワークをつなげる
    ○ 無いと、NodeのステータスがReadyにならない

    View full-size slide

  34. Kubernetesのネットワークコンポーネント
    ● kube-proxy
    ○ 各ノードでコンテナネットワークへの入り口を作る役割
    ○ Linuxのiptablesやipvsを利用(最近ではeBPFベースの実装もある )
    ○ Serviceの実装
    ■ https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/service.go
    ● CNI(Container Network Interface)
    ○ Docker network driver相当のプラグイン機構を提供
    ○ クラスター全体のOverlay Networkを提供
    ○ 外のネットワーク(プロトコル)とKubernetesのネットワークをつなげる
    ○ 無いと、NodeのステータスがReadyにならない

    View full-size slide

  35. Kubernetesのネットワークコンポーネント
    ● kube-proxy
    ○ 各ノードでコンテナネットワークへの入り口を作る役割
    ○ Linuxのiptablesやipvsを利用(最近ではeBPFベースの実装もある )
    ○ Serviceの実装
    ■ https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/service.go
    ● CNI(Container Network Interface)
    ○ Docker network driver相当のプラグイン機構を提供
    ○ クラスター全体のOverlay Networkを提供
    ○ 外のネットワーク(プロトコル)とKubernetesのネットワークをつなげる
    ○ 無いと、NodeのステータスがReadyにならない
    CNIでアタッチしたNIC
    kube-proxyでコンテナ外
    からの通信を流す

    View full-size slide

  36. いろいろなCNI
    ● Calico
    ○ 最も人気&歴史がある
    ○ BGP(L3)ベースのネットワークでスケールしやすい
    ● Cilium
    ○ eBPFを用いた高パフォーマンス &スケーラブルなプラグイン
    ○ 最近人気になってきた
    ○ GKEでも最近導入がアナウンスされた
    ● Weave Net
    ● Amazon VPC CNI plugin

    View full-size slide

  37. ここまでのまとめ
    ● Kubernetesが複数マシンを束ねて動かすためにはOverlay networkが重要
    ● CNIはOverlay networkの構築と、Pod(コンテナ)にネットワークの機能を
    与えるためのコンポーネント
    ● kube-proxyは、ノードに流れてきたPod向け通信をPodに流す役割を持つ

    View full-size slide

  38. ここまでのまとめ
    ● Kubernetesが複数マシンを束ねて動かすためにはOverlay networkが重要
    ● CNIはOverlay networkの構築と、Pod(コンテナ)にネットワークの機能を
    与えるためのコンポーネント
    ● kube-proxyは、ノードに流れてきたPod向け通信をPodに流す役割を持つ
    完全に理解できましたか?

    View full-size slide

  39. (質問があれば)Q&Aタイム

    View full-size slide