为了账号安全,请及时绑定邮箱和手机立即绑定

橘子皮学docker之Kubernetes的网络知识

标签:
Docker

目录

  • docker的网络通信

  • kubernetes的网络通信

  • 总结

kubernetes集群搭建完成后,使用docker  ps命令,可以看到正在跑的容器,其中一个容器名字叫flannel。这个flannel是一个开源的网络组件,了解flannel之前,先回顾下docker的网络通信吧。

docker version:17.03
kubernetes version:1.90

docker的网络通信

[root@k8s02 ~]# docker network lsNETWORK ID          NAME                DRIVER              SCOPE
acd552bcdec2        bridge              bridge              local3fba01ae965e        host                host                local1f2f59916861        none                null                local

docker network ls
查看docker 网络。相比较docker旧版本,17.03版本的docker有三种网络类型。

  • bridge:桥接模式

    • 桥接模式,也是默认的default的网络模式。一个容器一个network的namesapce。

    • 容器与宿主机的通信是通过桥接模式进行的,这个网桥桥,就是docker0。这个网桥工作方式和物理交换机类似,这个宿主机上的所有容器通过docker0连在了同一个二层网络中

    • 通过ip a或者ifconfig指令,可以看到docker0网桥。每生成一个容器,就会产生一对veth。

    • 通信的过程大概就是dockervethdocker0veth宿主机这样。
      容器的ip由网桥分配,网桥是容器的默认网关,不写--net的话,默认的用的就是bridge模式,使用这种模式时,实际上实在iptables里做了DNAT规则,实现转发功能

    • docker在iptables里做了DNAT,允许所有的容器可以访问外部网络,但是不允许外部的网络访问容器,如果要访问,只能通过开放端口

  • host:主机模式。

    • 需要在启动容器时加上参数--net=host。容器和宿主机共享一个network的namespace。容器的ip就是宿主机的ip、容器的端口的就是宿主机的端口。

    • 注意:只是共享network的namesapce,但是其他方面比如文件系统这些还是和宿主机隔离的。

    • 通常用于跨主机的docker通信

  • none:这个模式docker容器拥有自己的network namespace ,但是不为容器进行网络配置,容器的网卡、ip这些需要自己配置。用的比较少

kubernetes的网络通信

这里主要讲讲我对容器与容器之间通信、pod与pod之间通信的理解

  • 容器与容器之间的通信:
    同一个pod中的容器可以直接通信,他们共享一个network 的namespace,共享同一个linux的协议栈。每个容器都可以通过localhost访问对方的端口。简单安全高效,稍微牺牲了点同一个pod中的容器之间的安全隔离性

  • pod与pod之间的通信:

    • 同一个node中,pod与pod之间的通信:类似于上面讲的dokcer的默认通信。pod与pod之间通信也是通过veth对连接docker0网桥进行通信的

    • 不同node中,pod之间的通信:不同node之间pod的通信,必须通过宿主机的ip进行寻址,有什么办法可以解决呢:1、把pod的ip和宿主机的ip关联起来。2、整个集群中pod的ip进行分配,不能有冲突。为了达到这个目的,采用了开源网络组件,flannel。

Flannel的功能:
1、给每个集群内的pod分配不冲突的ip地址
2、在这些ip之间建立overlay网络,进行通信。

ifocnfig

flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1400
        inet 10.244.1.0  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::b4ca:f7ff:fe2b:b391  prefixlen 64  scopeid 0x20<link>
        ether b6:ca:f7:2b:b3:91  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 8 overruns 0  carrier 0  collisions 0

创建了一个flannel的网桥,既然是网桥,连接了哪两部分呢,一段是docker0,用来与容器通信,另一端是flanneld的服务进程。

flanneld的进程作用:
连接到etcd,来管理分配ip,同时在内存中建立pod节点路由表,下连接到docker0和物理网络,利用路由表,从而完成pod之间的通信

flannel工作原理:
通过修改docker的启动参数,将他分配好的ip穿进去
--bip=ip/24

缺点:
有一些网络延时
使用的UDP传输协议,非可靠。

总结

跟openstack一样,docker集群的网络也是一大难题。本文将、讲的比较浅显,是我自己学习的笔记,如果需要深入了解,请参照官网和kubernetes的社区。



作者:OrangeLoveMilan
链接:https://www.jianshu.com/p/d531ef6f437e


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
40
获赞与收藏
125

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消