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

目录

  • docker的网络通信
  • kubernetes的网络通信
  • 总结

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

docker version:17.03
kubernetes version:1.90

docker的网络通信

[root@k8s02 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
acd552bcdec2        bridge              bridge              local
3fba01ae965e        host                host                local
1f2f59916861        none                null                local

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

  • bridge:桥接模式

    • 桥接模式,也是默认的default的网络模式。一个容器一个network的namesapce。
    • 容器与宿主机的通信是通过桥接模式进行的,这个网桥桥,就是docker0。这个网桥工作方式和物理交换机类似,这个宿主机上的所有容器通过docker0连在了同一个二层网络中
    • 通过ip a或者ifconfig指令,可以看到docker0网桥。每生成一个容器,就会产生一对veth。
    • 通信的过程大概就是docker→veth→docker0→veth→宿主机这样。
      容器的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的社区。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求。而容器的网络通信...
    糙老爷们儿吃什么樱桃阅读 8,994评论 1 5
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 13,576评论 0 120
  • •Kubernetes介绍1.背景介绍云计算飞速发展- IaaS- PaaS- SaaSDocker技术突飞猛进-...
    Zero___阅读 14,942评论 0 21
  • 关于docker网络模式有四种,内容如下,至于内容从来哪的,我也不知道,反正网上找的 前言:我们在使用docker...
    撸大师阅读 14,425评论 3 9
  • 此刻脑子有些乱,有一肚子的话却不知该如何表达。 之前日记中一直在写梦想与努力,可今天我却不敢说梦想与努力。一提到它...
    Catherine_龙猫阅读 1,365评论 0 0