際際滷

際際滷Share a Scribd company logo
コンテナのネットワ`クインタ`フェ`ス
そのg廾返隈とその鮄辰砲弔い
@JTF 2017, 2017/8/27
爽 崘雰
s1061123@gmail.com
id:s1061123, @s1061123
Agenda
〜コンテナのネットワ`クについて
〜gHの返隈
〜コ`ドの盾h
〜鮄
Agenda
〜コンテナのネットワ`クについて
〜 どんなインタ`フェイスで宥佚しているのか
〜 どうやって麿のコンテナと蛍xしているのか
〜 gHの返隈
〜コ`ドの盾h
〜鮄
コンテナで聞ってるネットワ`クインタ`フェイスって
tom@kagaribi $ docker run -it --rm centos_test bash
[root@5c747e947ec9 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN qlen 1
link/tunnel6 :: brd ::
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1
link/sit 0.0.0.0 brd 0.0.0.0
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
[root@5c747e947ec9 /]#
コンテナで聞ってるネットワ`クインタ`フェイスって
[root@5c747e947ec9 /]# ip -d a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN qlen 1
link/tunnel6 :: brd :: promiscuity 0
ip6tnl ip6ip6 remote :: local :: encaplimit 0 hoplimit 0 tclass 0x00 flowlabel 0x00000
(flowinfo 0x00000000)
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1
link/sit 0.0.0.0 brd 0.0.0.0 promiscuity 0
sit remote any local any ttl 64 nopmtudisc 6rd-prefix 2002::/16
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 0
veth
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
`-d¨ / `-details¨
オプションを弖紗
コンテナで聞ってるネットワ`クインタ`フェイスって
32: eth0@if33: <BROADCAST,
link/ether 02:42:ac:11
veth
inet 172.17.0.2/16 sco
valid_lft forever p
コンテナで聞ってるネットワ`クインタ`フェイスって
32: eth0@if33: <BROADCAST,
link/ether 02:42:ac:11
veth
inet 172.17.0.2/16 sco
valid_lft forever p
ifi_index
= IFインデックス
IFLA_IFNAME
= 兆念
中のインタ`フェ`スの
ifi_index or 中の兆念
veth
= カ`ネルが戻工する∀
L2インタ`フェ`ス
vethとは
〜 カ`ネルが戻工するL2∀襯ぅ鵐食`フェ`ス
〜 OpenVZから喇栖
〜 Linuxカ`ネル坪では <kernel>/drivers/net/veth.c でg廾
〜 P2P (Point-to-point)での俊A侘B
〜 つまり猜(俊A枠)は匯つ
〜 俊A枠はIFLA_LINK_NETNSIDで_J
〜 `ip link add¨コマンドで恬撹辛嬬
〜 箭: ^ ip link add veth1 type veth peer name veth2 ̄
Agenda
〜コンテナのネットワ`クについて
〜 どんなインタ`フェイスで宥佚しているのか
〜 どうやって麿のコンテナと蛍xしているのか
〜 gHの返隈
〜コ`ドの盾h
〜鮄
コンテナのネットワ`クの蛍x
namespace (兆念腎g)というものでネットワ`クを
根む光Nリソ`スを蛍x
〜 PID_NS: pid腎gを蛍x
〜 NET_NS: ネットワ`クを蛍x (○ これ)
〜 USER_NS: ユ`ザ慙泙魴幃x
〜 IPC_NS: メッセ`ジキュ`?shmemの蛍x
〜 UTS_NS: ホストネ`ムの蛍x
コンテナのネットワ`クの蛍x
NET_NS:
〜<kernel>/include/net/net_namespace.h に協x
〜 IPv4 (arp/ル`ティング 根む)
〜 IPv6 (neighbor/ル`ティング 根む)
〜 Unixドメインソケット
〜 netfilter (箭: iptables)
〜 conntrack (NATテ`ブル)
〜 その麿(MPLS, sctp吉)
これらをNET_NS
に蛍x
コンテナ阿坊幃x
コンテナのネットワ`クの蛍x
ホスト
NET_NS1 (ホストのNET_NS) NET_NS2 (dockerで恬撹)
em1
192.168.1.1
bash bash
eth0
192.168.1.1
揖じアドレスで
も栽しない!
コンテナのネットワ`クの蛍x
'docker run --net host ...¨
`docker run --net bridge ´¨
`docker run --net none ...¨
ホスト
NET_NS1 (ホストのNET_NS)
em1
192.168.1.1
bash
`docker run --net host ´ bash¨ の栽
dockerで恬撹
'--net host': NET_NSを恬撹せずにホストのものをそのまま送喘 (pidは蛍x)
`docker run --net bridge ´ bash¨ の栽
ホスト
NET_NS1 (ホストのNET_NS)
em1
192.168.1.1
Bridge
(docker0)
NET_NS2 (dockerで恬撹)
bash
dockerで恬撹
veth
veth
'--net bridge':
NET_NSを恬撹して、ホストのNET_NSにあるブリッジ(docker0)とvethで俊A
lo
`docker run --net none ´ bash¨ の栽
ホスト
NET_NS1 (ホストのNET_NS) NET_NS2 (dockerで恬撹)
em1
192.168.1.1
bash bash
'--net none: NET_NSを恬撹して、麿に採も佩なわない
lo
しかしlo吉のデバイスはNET_NS
恬撹rにカ`ネルが徭啜弔没
撹
<kernel>/net/core/net_namespace.c:
setup_net()
Agenda
〜コンテナのネットワ`クについて
〜gHの返隈
〜dockerがどのように戻工しているのか
〜k8sがどのように戻工しているのか
〜コ`ドの盾h
〜鮄
Agenda
〜コンテナのネットワ`クについて
〜gHの返隈
〜dockerがどのように戻工しているのか
〜k8sがどのように戻工しているのか
〜コ`ドの盾h
〜鮄
dockerの栽
〜 Docker徭附はネットワ`クを恬撹しない
〜 libnetworkを聞喘して恬撹
〜 libnetworkはドライバでどのようなネットワ`クを峺
協辛嬬
〜 ドライバでは參和のAPIをg廾している
〜 Config
〜 {Create,Delete}Network
〜 {Create,Delete}Endpoint
〜 Join, Leave
箭
$ docker inspect test | jq .[]."NetworkSettings"
{
"Bridge": "",
"SandboxID": "be01b37c006ad9139c1f3b648dbf02d29761f630c33e9620d60fcd401aae0b5b",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/be01b37c006a",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "118e24eb9ef5727d3d43814866597b07c4429bc9b055b941285b6d7b6e300388",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
Agenda
〜コンテナのネットワ`クについて
〜gHの返隈
〜dockerがどのように戻工しているのか
〜K8sがどのように戻工しているのか
〜 コンテナランタイム: docker
〜 ネットワ`ク: CNI (Calico)
〜コ`ドの盾h
〜鮄
箭
$ docker inspect k8s_test1-node1_centos1-2797499804-fdqd1_default_018173b3-8247-11e7-b2d6-
525400075920_0 | jq .[]."NetworkSettings"
{
"Bridge": "",
"SandboxID": "",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": null,
"SandboxKey": "",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": null
箭
$ kubectl get -o wide pod
NAME READY STATUS RESTARTS AGE IP NODE
centos1-2797499804-fdqd1 1/1 Running 0 9m 192.168.58.193 k8s-node02
$ docker exec -it k8s_test1-node1_centos1-2797499804-fdqd1_default_018173b3-8247-11e7-b2d6-525400075920_0 bash
[root@centos1-2797499804-fdqd1 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 22:e6:c3:21:5f:a7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.58.193/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20e6:c3ff:fe21:5fa7/64 scope link
valid_lft forever preferred_lft forever
k8sの栽
k8sの栽は
〜 コンテナランタイム: docker
〜 ネットワ`ク: CNI (Calico)
Y惚
〜 docker箸魯優奪肇鍠`クがoいという
〜 k8sからるとネットワ`クはあるという
★ gHコンテナにはネットワ`クがえる
k8sのコンテナとネットワ`クのvS
1. kubectlでコンテナの軟喘綜
2. kubeletがdockerでコンテナを"--net none"で軟
gHにはdocker APIU喇なので NetworkMode = "none"
1. コンテナはネットワ`クoしで軟
★なのでdockerからるとネットワ`クはなしで軟咾靴討い
1. kubeletがCNIを軟咾靴謄灰鵐謄覆縫優奪肇鍠`クを弖紗
★なのでk8sはネットワ`クをJRしている&
ネットワ`クがgHに贋壓する
Agenda
〜コンテナのネットワ`クについて
〜gHの返隈
〜コ`ドの盾h (階待井)
〜 CNIがどのようにインタ`フェ`スをコンテナにvB原けしているのか
〜 CNIプロジェクト云社のbridgeプラグイン
〜 github.com/containernetworking/plugins/main/bridge/bridge.g
o
〜 500佩殻業
〜鮄
bridge.go
489 func main() {
490 skel.PluginMain(cmdAdd, cmdDel, version.All)
491 }
〜 https://github.com/containernetworking/cni に碧
〜 CNIはg悶でg佩できるものならなんでもOK (shell scriptも辛)
〜 g廾するものはADDとDELとVERSIONの3凋綜
〜 駅勣な秤鵑STDINとh廠篳で戻工
〜 STDIN: ネットワ`クの秤 (/etc/cni/net.d)
〜 h廠篳: コマンド(ADD/DEL/VERSION)とコンテナの秤
bridge.go
310 func cmdAdd(args *skel.CmdArgs) error {
//待
324 br, brInterface, err := setupBridge(n)
//待
329 netns, err := ns.GetNS(args.Netns)
//待
335 hostInterface, containerInterface, err := setupVeth(netns, br, args.IfName,
n.MTU, n.HairpinMode)
//待
365 if err := netns.Do(func(_ ns.NetNS) error {
//待
375 if err := ipam.ConfigureIface(args.IfName, result); err != nil {
ブリッジをつけて
コンテナのNET_NSを
函誼
Vethの恬撹とブリッ
ジへの俊A
コンテナのNET_NSに
卞咾靴
IPアドレスをO協
bridge.go
コ`ドから蛍かること
〜 vethはnetlink (kernelのC嬬)で恬撹辛嬬
〜 netlinkのIFLA_NET_NS_FDでインタ`フェ`スを麿のNET_NSに卞
〜 setns()システムコ`ルを聞うことでプログラム坪で錬李したNET_NSに卞
〜 Go冱Zではnetlink, netns吉のライブラリがgithubに贋壓すること
★ これらを聞えばコンテナのネットワ`クを徭喇に筝辛嬬
Agenda
〜コンテナのネットワ`クについて
〜gHの返隈
〜コ`ドの盾h (階待井)
〜鮄
〜 ここまでの岑からツ`ルを恬ってみました
〜 ツ`ルの盾h
〜 デモ
koko (Container Connector)
https://github.com/redhat-nfvpe/koko
netns, netlinkを聞ってコンテナをp2pで俊Aするコマンド
コンテナ:
docker, netns, PID
インタ`フェ`ス:
veth, vxlan, vlan, macvlan
Port-mirroring (network tapping)
ingress, egress, both
demo1
〜 dockerとnetnsgをvethで俊Aしてping
koko -d test1,eth0,192.168.1.1/24 -d test2,eth0,192.168.1.2/24
demo2
〜 dockerのコンテナにveth3を恬撹
〜 veth2が鞭佚するパケットをミラ`して、vxlanにして麿のホストに僕佚
koko -d node1,mirror1,mirror:ingress:eth0 -x eth1,10.10.10.2,100
Agenda
〜コンテナのネットワ`クについて
〜gHの返隈
〜コ`ドの盾h
〜鮄
Thanks!
Any questions?
You can find me at
@s1061123
&
s1061123@gmail.com
際際滷sCarnival icons are editable shapes.
This means that you can:
¢ Resize them without losing quality.
¢ Change fill color and opacity.
¢ Change line color, width and style.
Isn¨t that nice? :)
Examples:
Now you can use any emoji as an icon!
And of course it resizes without losing quality and you can change the color.
How? Follow Google instructions
https://twitter.com/googledocs/status/730087240156643328
???????????????
???????????????
?????? and many more...
?

More Related Content

コンテナのネットワ`クインタ`フェ`ス そのg廾返隈とその鮄辰砲弔い

Editor's Notes

  • #2: http://www.slidescarnival.com/ja/%E3%82%A2%E3%82%A4%E3%82%A2%E3%83%A9%E3%82%B9%E3%81%AE%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88/1681