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

CNIふぉーびぎなーず

Avatar for Tomofumi Hayashi Tomofumi Hayashi
July 25, 2020
21

 CNIふぉーびぎなーず

Avatar for Tomofumi Hayashi

Tomofumi Hayashi

July 25, 2020
Tweet

Transcript

  1. Agenda • CNIの概要 ◦ CNIって何? ◦ CNIって何をするの? • CNIの機能 ◦

    CNIってどうやって使われるの? ◦ CNIってどうやって設定するの? • CNIを使ってみよう ◦ podmanを使って設定しよう! ◦ (中・上級者向け)cnitoolsを使って設定しよう! Slide: https://bit.ly/2E88Yca
  2. Agenda • CNIの概要 ◦ CNIって何? ◦ CNIって何をするの? • CNIの機能 ◦

    CNIってどうやって使われるの? ◦ CNIってどうやって設定するの? • CNIを使ってみよう ◦ podmanを使って設定しよう! ◦ (中・上級者向け)cnitoolsを使って設定しよう! Slide: https://bit.ly/2E88Yca
  3. CNIの概要 • CNIって何? →コンテナにインターフェイスを追加するためのプラグイン機構を提供する… ◦ プロジェクトの名前 ◦ ソフトの仕様 (SPEC=Specification) ◦

    CNIプロジェクトで開発・配布しているライブラリ ◦ CNIプロジェクトで開発・配布しているプラグイン ◦ プロジェクト外の人が開発・配布しているプラグイン (過去の経験より) Slide: https://bit.ly/2E88Yca
  4. CNIの概要 • CNIって何? →コンテナにインターフェイスを追加するためのプラグイン機構を提供する… ◦ プロジェクトの名前 ◦ ソフトの仕様 (SPEC=Specification) ◦

    CNIプロジェクトで開発・配布しているライブラリ ◦ CNIプロジェクトで開発・配布しているプラグイン ◦ プロジェクト外の人が開発・配布しているプラグイン (過去の経験より) Slide: https://bit.ly/2E88Yca
  5. CNIの概要 • CNIって何? →コンテナにインターフェイスを追加するためのプラグイン機構を提供する… ◦ プロジェクトの名前 ▪ CNCF (Cloud Native

    Computing Foundation)が管理しているプロジェクト(Incubating Projects)の一つ ▪ 2017/5にCNCFでホスト ▪ https://github.com/containernetworking/ ◦ CNIプロジェクトで管理しているソフトの仕様 (=Spec,Specification) ◦ CNIプロジェクトで開発・配布しているライブラリ ◦ CNIプロジェクトで開発・配布しているプラグイン ◦ プロジェクト外の人が開発・配布している、CNIの仕様に沿って作られたプラグイン (過去の経験より) Slide: https://bit.ly/2E88Yca
  6. CNIの概要 • CNIって何? →コンテナにインターフェイスを追加するためのプラグイン機構を提供する… ◦ プロジェクトの名前 ◦ CNIプロジェクトで管理しているソフトの仕様 (=Spec,Specification) ▪

    githubのリポジトリに存在 ▪ https://github.com/containernetworking/cni/blob/master/SPEC.md • ↑(=master)は開発版・議論中バージョンで変更の可能性大 • タグ付けされているものが確定している仕様(最新はv0.4.0) ◦ 例: https://github.com/containernetworking/cni/blob/spec-v0.4.0/SPEC.md ◦ CNIプロジェクトで開発・配布しているライブラリ ◦ CNIプロジェクトで開発・配布しているプラグイン ◦ プロジェクト外の人が開発・配布している、CNIの仕様に沿って作られたプラグイン (過去の経験より) Slide: https://bit.ly/2E88Yca
  7. CNIの概要 • CNIって何? →コンテナにインターフェイスを追加するためのプラグイン機構を提供する… ◦ プロジェクトの名前 ◦ CNIプロジェクトで管理しているソフトの仕様 (=Spec,Specification) ◦

    CNIプロジェクトで開発・配布しているライブラリ ▪ CNIプロジェクトでCNIプラグイン開発に必要なライブラリ、CNIランタイムのライブラ リをGo言語で開発 ▪ https://github.com/containernetworking/cni ◦ CNIプロジェクトで開発・配布しているプラグイン ◦ プロジェクト外の人が開発・配布している、CNIの仕様に沿って作られたプラグイン (過去の経験より) Slide: https://bit.ly/2E88Yca
  8. CNIの概要 • CNIって何? →コンテナにインターフェイスを追加するためのプラグイン機構を提供する… ◦ プロジェクトの名前 ◦ CNIプロジェクトで管理しているソフトの仕様 (=Spec,Specification) ◦

    CNIプロジェクトで開発・配布しているライブラリ ◦ CNIプロジェクトで開発・配布しているプラグイン ▪ CNIプロジェクトでサンプルとなるようなシンプルなプラグインを開発・配布 ▪ https://github.com/containernetworking/plugins ▪ このプラグインにもバージョンが存在(最新はv0.8.6) ←上の仕様のバージョンとは独立! ◦ プロジェクト外の人が開発・配布している、CNIの仕様に沿って作られたプラグイン (過去の経験より) Slide: https://bit.ly/2E88Yca
  9. CNIの概要 • CNIって何? →コンテナにインターフェイスを追加するためのプラグイン機構を提供する… ◦ プロジェクトの名前 ◦ CNIプロジェクトで管理しているソフトの仕様 (=Spec,Specification) ◦

    CNIプロジェクトで開発・配布しているライブラリ ◦ CNIプロジェクトで開発・配布しているプラグイン ◦ プロジェクト外の人が開発・配布している、CNIの仕様に沿って作られたプラグイン (過去の経験より) ▪ 上のCNIの仕様を充たした、他のコミュニティ・ベンダーによるプラグイン ▪ Amazon ECS CNI plugins, calico, cilium, Cisco ACI CNI, Nuage CNI, ovn-kubernetes, NSX-T CNI Plug-in (https://github.com/containernetworking/cni/ から抜粋) Slide: https://bit.ly/2E88Yca
  10. CNIの概要 • CNIって何? →コンテナにインターフェイスを追加するためのプラグイン機構を提供する… ◦ プロジェクトの名前 ◦ CNIプロジェクトで管理しているソフトの仕様 (=Spec,Specification) ◦

    CNIプロジェクトで開発・配布しているライブラリ ◦ CNIプロジェクトで開発・配布しているプラグイン ◦ プロジェクト外の人が開発・配布している、CNIの仕様に沿って作られたプラグイン (過去の経験より) Slide: https://bit.ly/2E88Yca
  11. CNIの概要 • CNIって何? →コンテナにインターフェイスを追加するためのプラグイン機構を提供する… ◦ プロジェクトの名前 ◦ CNIプロジェクトで管理しているソフトの仕様 (=Spec,Specification) ◦

    CNIプロジェクトで開発・配布しているライブラリ ◦ CNIプロジェクトで開発・配布しているソフトウェア ◦ プロジェクト外の人が開発・配布している、CNIの仕様に沿って作られたソフトウェア (過去の経験より) Slide: https://bit.ly/2E88Yca
  12. Agenda • CNIの概要 ◦ CNIって何? ◦ CNIって何をするの? • CNIの機能 ◦

    CNIってどうやって使われるの? ◦ CNIってどうやって設定するの? • CNIを使ってみよう ◦ podmanを使って設定しよう! ◦ (中・上級者向け)cnitoolsを使って設定しよう! Slide: https://bit.ly/2E88Yca
  13. • CNIって何をするの? コンテナにインターフェイスを追加します。 CNIの概要 1) コンテナランタイム(cri-o, docker等)がコンテナ 用の独立されたリソースをLinux kernelから確保し ます

    ◦ ファイルシステム ◦ PID ◦ ネットワーク ◦ etc (ユーザーとか)... 参考資料: https://speakerdeck.com/tenforward/jtf2017 https://www.slideshare.net/s1061123/ss-79184035 Linux Podになるまえのなにか kubectl create -f sample_pod.yml ... Slide: https://bit.ly/2E88Yca
  14. • CNIって何をするの? コンテナにインターフェイスを追加します。 CNIの概要 2) 独立したリソース空間には最初何も入っていま せん(独立している訳ですから)。ですのでそこに 必要なものを入れていきます。 • User

    (UID) • コンテナイメージをファイルシステム にマウント • ネットワークインターフェイスの追加 Linux Podになるまえのなにか kubectl create -f sample_pod.yml ... これ!! eth0 lo Slide: https://bit.ly/2E88Yca
  15. • CNIってどこで使っているの? →CNIプロジェクトのページに記載されているだけでも以下の通りです • rkt - container engine • Kubernetes

    - a system to simplify container operations • OpenShift - Kubernetes with additional enterprise features • Cloud Foundry - a platform for cloud applications • Apache Mesos - a distributed systems kernel • Amazon ECS - a highly scalable, high performance container management service • Singularity - container platform optimized for HPC, EPC, and AI • OpenSVC - orchestrator for legacy and containerized application stacks CNIの概要 Slide: https://bit.ly/2E88Yca
  16. Agenda • CNIの概要 ◦ CNIって何? ◦ CNIって何をするの? • CNIの機能 ◦

    CNIってどうやって使われるの? ◦ CNIってどうやって設定するの? • CNIを使ってみよう ◦ podmanを使って設定しよう! ◦ (中・上級者向け)cnitoolsを使って設定しよう! Slide: https://bit.ly/2E88Yca
  17. CNIを使ったコンテナ起動の例 (podmanの場合) CNIってどうやって使われるの? podman ocicni libcni CNI Plugin https://github.com/containers/podman https://github.com/cri-o/ocicni

    https://github.com/containernetworking/cni podmanがcri-oプロジェクトのocicniライブラリを使っ て、CNIプロジェクトのlibcniを呼ぶことで、CNI Pluginを実行し、コンテナにインターフェイスを追加 する Slide: https://bit.ly/2E88Yca
  18. CNIを使ったコンテナ起動の例 (Kubernetesの場合) CNIってどうやって使われるの? k8s kubelet cri-o コントローラーからの依頼 k8s kubelet docker

    コントローラーからの依頼 k8s kubelet ocicni libcni CNI Plugin libcni ネットワーク無しで コンテナ作成! Slide: https://bit.ly/2E88Yca
  19. CNI Pluginがどうやって実行されるのか? どうやって設定されていくのか? → 仕様 (SPEC.md)に記載 CNIってどうやって使われるの? libcni CNI Plugin

    1: Pluginの実行 命令 • インターフェイスの追加/削除? ネットワークの設定情報 • どんなPluginを使って… • どのIPを割り当てて… • どんなインターフェイス名で… 設定するコンテナの情報 • KernelでのコンテナID • (K8sの場合)Podの名前 • (K8sの場合)Namespace Slide: https://bit.ly/2E88Yca
  20. CNI Pluginがどうやって実行されるのか? どうやって設定されていくのか? → 仕様 (SPEC.md)に記載 CNIってどうやって使われるの? libcni CNI Plugin

    1: Pluginの実行 Pluginに渡されるもの 標準入力 • CNIの設定ファイル (コンテナランタイム側 で設定する。主に/etc/cni/net.d)にあるファイ ルの中身をそのまま送る 環境変数 • CNI_COMMAND: ADD/DEL/CHECK • CNI_CONTAINERID: コンテナID • CNI_NETNS: 設定するコンテナの識別子 • CNI_IFNAME: 追加するインターフェイス名 • CNI_ARGS: (やや古い形の)追加の情報 • CNI_PATH: CNIのプラグインのパス (主にど ちらか ◦ /opt/cni/bin ◦ /usr/libexec/cni Slide: https://bit.ly/2E88Yca
  21. CNI Pluginがどうやって実行されるのか? どうやって設定されていくのか? → 仕様 (SPEC.md)に記載 CNIってどうやって使われるの? libcni CNI Plugin

    1: Pluginの実行 実際にやっていることをコマンドにすると… $ export CNI_PATH=/opt/cni/bin $ export CNI_COMMAND=ADD $ export PATH=$CNI_PATH:$PATH $ export CNI_CONTAINERID=$contid $ export CNI_NETNS=$netns $ export CNI_IFNAME=eth0 $ /opt/cni/bin/flannel < /etc/cni/net.d/00-flannel.conf Slide: https://bit.ly/2E88Yca
  22. CNIってどうやって使われるの? CNI Pluginの設定ファイルの例(最低限必要なものだと) { "name": "myflannel", "cniVersion": "0.4.0", "type": "flannel"

    } 設定ファイルの名前。 自由に設定可能だけれど、ディレクトリ内では固有 にしておくのが吉 使用するCNI(SPEC)のバージョン。最新は0.4.0 古いものだと使えない機能があるかもしれないので なるべく最新を使うようにするとよい 使用するPluginの名前。Pluginのバイナリのファイル名 flannelプラグインが行なうこと • インターフェイス作成 • IPアドレス 00-flannel.conf Slide: https://bit.ly/2E88Yca
  23. CNIってどうやって使われるの? CNI Pluginの設定ファイルの例(やや複雑) { "name": "mymacvlan", "cniVersion": "0.4.0", "type": "macvlan",

    "master": "eth0", "ipam": { "type": "host-local", "subnet": "10.10.0.0/16" } } Macvlanを作る元の物理インターフェイスを指定。 macvlan CNIプラグイン固有の設定。 IPAM (IP Address Management)=IPアドレスの管理に 使用するプラグイン用の設定ブロック IPAM (IP Address Management)=IPアドレスの管理に 使用するプラグインを指定。 使用したいIPアドレスのサブネットを指定。 host-localプラグイン固有の設定。 00-macvlan.conf Slide: https://bit.ly/2E88Yca
  24. CNIってどうやって使われるの? CNI Pluginの設定ファイルの例(やや複雑) { "name": "mymacvlan", "cniVersion": "0.4.0", "type": "macvlan",

    "master": "eth0", "ipam": { "type": "host-local", "subnet": "10.10.0.0/16" } } macvlanプラグインが行なうこと • インターフェースの作成 host-localプラグインが行なうこと • IPアドレスの設定 00-macvlan.conf Slide: https://bit.ly/2E88Yca
  25. CNIってどうやって使われるの? CNI Pluginの設定ファイルの例(もっと複雑) { "name": "mymacvlan2", "cniVersion": "0.4.0", "plugins": [

    { "cniVersion": "0.4.0", "type": "macvlan", "master": "eth0", "ipam": { "type": "host- local", "subnet": "10.10.0.0/16" }, }, { "type": "tuning", "mtu": 1454 } ] } 00-macvlan.conflist 複数のPluginを記述するためのブロック 直前に設定したインターフェイス(=macvlan)のMTUを 変更する。tuningプラグイン固有の設定 Slide: https://bit.ly/2E88Yca
  26. CNIってどうやって使われるの? CNI Pluginの設定ファイルの例(もっと複雑) { "name": "mymacvlan2", "cniVersion": "0.4.0", "plugins": [

    { "cniVersion": "0.4.0", "type": "macvlan", "master": "eth0", "ipam": { "type": "host- local", "subnet": "10.10.0.0/16" }, }, { "type": "tuning", "mtu": 1454 } ] } macvlanプラグインが行なうこと • インターフェースの作成 host-localプラグインが行なうこと • IPアドレスの設定 tuningプラグインが行なうこと • macvlanのインターフェイスの MTUの設定 00-macvlan.conflist Slide: https://bit.ly/2E88Yca
  27. CNIってどうやって使われるの? CNI Pluginの設定ファイルの例(最低限必要なものだと) Q: もし複数のCNIの設定ファイルを同じ/etc/cni/net.d/に置いていたら? →動作は各ソフトによって異なるので注意です • K8s/docker: アルファベット順で一番最初にくるファイルを使用 •

    K8s/cri-o: 最初に置いたファイルを使用 • podman: デフォルトはアルファベット順。実行時に(CNIの'name’の値で)指定可能 (フ ァイル名での指定ではないので注意) Slide: https://bit.ly/2E88Yca
  28. CNI Pluginがどうやって実行されるのか? どうやって設定されていくのか? CNIってどうやって使われるの? libcni CNI Plugin 2: 実行結果を返す {

    "cniVersion": "0.4.0", "name": "dbnet", "type": "tuning", "sysctl": { "net.core.somaxconn": "500" }, "prevResult": { "ips": [ { "version": "4", "address": "10.0.0.5/32", "interface": 2 } ], "interfaces": [ { "name": "cni0", "mac": "00:11:22:33:44:55" }, { "name": "veth3243", "mac": "55:44:33:22:11:11" }, { "name": "eth0", "mac": "99:88:77:66:55:44", "sandbox": "/var/run/netns/blue" } ], "dns": { "nameservers": [ "10.1.0.1" ] } } } Slide: https://bit.ly/2E88Yca
  29. Agenda • CNIの概要 ◦ CNIって何? ◦ CNIって何をするの? • CNIの機能 ◦

    CNIってどうやって使われるの? ◦ CNIってどうやって設定するの? • CNIを使ってみよう ◦ podmanを使って設定しよう! Slide: https://bit.ly/2E88Yca
  30. CNIを使ってみよう podmanを使ってコンテナを立ち上げる方法 podman run <イメージ名> <コマン ド> $ podman run

    -it docker.io/centos/tools bash [root@97a44745c491 /]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 (略) 2: tap0: <BROADCAST,UP,LOWER_UP> mtu 65520 qdisc fq_codel state UNKNOWN group default qlen 1000 link/ether 02:b7:68:b2:dc:46 brd ff:ff:ff:ff:ff:ff inet 10.0.2.100/24 brd 10.0.2.255 scope global tap0 valid_lft forever preferred_lft forever inet6 fd00::b7:68ff:feb2:dc46/64 scope global mngtmpaddr dynamic valid_lft 86399sec preferred_lft 14399sec inet6 fe80::b7:68ff:feb2:dc46/64 scope link valid_lft forever preferred_lft forever 注:この場合だとrootlessコンテナで起動するので slirp4netnsで起動します (CNIではない) Slide: https://bit.ly/2E88Yca
  31. CNIを使ってみよう podmanを使ってコンテナを立ち上げる方法 sudo podman run --network=<CNIコンフィグ名> <イメージ名> <コマン ド> $

    sudo podman run -it --network=podman docker.io/centos/tools bash [root@7886b3e87f9e /]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 (略) 3: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether be:ac:f8:be:99:39 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.88.0.20/16 brd 10.88.255.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::bcac:f8ff:febe:9939/64 scope link valid_lft forever preferred_lft forever • --cni-config-dirでCNIコンフィグファイルのパスを変更可 • CNIで起動する場合rootで実行する必要があります • CNIコンフィグ名は、CNIのコンフィグファイル内にある ”name”を指定します。ファイル名ではないので注意 Slide: https://bit.ly/2E88Yca
  32. Agenda • CNIの概要 ◦ CNIって何? ◦ CNIって何をするの? • CNIの機能 ◦

    CNIってどうやって使われるの? ◦ CNIってどうやって設定するの? • CNIを使ってみよう ◦ podmanを使って設定しよう! Slide: https://bit.ly/2E88Yca
  33. このあとは…? • podman • 他にも仕様のドキュメントがあるよ! ◦ https://github.com/containernetworking/cni/blob/master/CONVENTIONS.md ◦ ‘Capabilities’, ‘runtimeConfig’,

    ‘args’などの仕様はこちらに記載されています ◦ 'Capabilities’ / ’runtimeConfig’をテストしたい場合はcnitoolで可能(podmanではまだ無理です…) ◦ https://github.com/containernetworking/cni/tree/master/cnitool • https://github.com/containernetworking/plugins のコードを読んでみよう! ◦ ipvlan, macvlan等は比較的シンプルなので読みやすい…はず • 他のプラグインを使ってみよう! Slide: https://bit.ly/2E88Yca