docker默认采用的是端口映射的方式来让外部访问,比如你启动一个MySQL,在container内部会有一个虚拟ip,默认是172.17之类的网段,宿主机可以ping通这个ip地址,但是除了宿主机能访问这个虚拟网段,其他任何机器(不管是否docker还是非docker)都无法访问,这个很容易理解,因为这个网段的ip本身就是虚拟出来的。因此要访问docker容器的方式采用的是端口映射,通过虚拟ip网段和宿主机映射端口,你直接访问宿主机的端口就可以了。

比如:

e91703882bd0        registry            "/entrypoint.sh /etc   11 days ago         Up 7 minutes        0.0.0.0:5000->5000/tcp   hopeful_gates

以上你要访问这个容器的5000端口,实际需要访问docker宿主机的5000端口,因为容器和宿主机做了绑定。以上属于docker基本概念,就不细说了。

那么问题来了,当我们使用k8s来管理docker容器,如果底层全部采用端口映射,那将是多么麻烦的一件事?每个node可能有上百个容器,全部需要做端口映射,如果能够直接访问这些虚拟ip,和用实际的ip一样,这样内部调用直接采用ip和端口即可,这样做就会方便很多。

flannel就是解决这个问题的一个组件,我们先来看一下官网对flannel的解释:

Platforms like Kubernetes assume that each container (pod) has a unique, routable IP inside the cluster. The advantage of this model is that it removes the port mapping complexities that come from sharing a single host IP.Flannel is responsible for providing a layer 3 IPv4 network between multiple nodes in a cluster. Flannel does not control how containers are networked to the host, only how the traffic is transported between hosts. However, flannel does provide a CNI plugin for Kubernetes and a guidance on integrating with Docker.

第一句话就是说使用共享ip来替代复杂的端口映射,这就是flannel的意义。

1. 安装flannel, 只需要在k8s的node节点安装。先去官网下载最新版本,然后解压缩。

flannel会指定一个网段给所有docker使用,而且是自动分配的,另外flannel使用etcd来管理网端的信息。默认的key是:/coreos.com/network/config , 简单说就是flannel会去etcd获取这个key,以此来获取定义好的网段信息。

写入网段信息到etcd:

/data/etcd/etcdctl --ca-file=/data/etcd/cert/ca.pem --cert-file=/data/etcd/cert/peer.pem --key-file=/data/etcd/cert/peer-key.pem --endpoints=https://10.203.3.96:2379,https://10.203.0.46:2379,https://10.203.0.43:2379 mk /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'

提示:这里有一个问题,flannel不能使用etcd 3的版本,但是实际上我们现在很多环境都是用最新版,因此3版本以上的etcd在安装的时候必须 --enable-v2,如下:

/data/etcd/etcd --name=etcd-node2 --data-dir=/data/etcd/data --listen-client-urls=https://10.203.3.96:2379 --listen-peer-urls=https://10.203.3.96:2380 --advertise-client-urls=https://10.203.3.96:2379 --initial-advertise-peer-urls=https://10.203.3.96:2380  --initial-cluster=etcd-node1=https://10.203.0.46:2380,etcd-node2=https://10.203.3.96:2380,etcd-node3=https://10.203.0.43:2380 --initial-cluster-state=new --peer-key-file=/data/etcd/cert/peer-key.pem --peer-cert-file=/data/etcd/cert/peer.pem --key-file=/data/etcd/cert/peer-key.pem --cert-file=/data/etcd/cert/peer.pem --client-cert-auth --trusted-ca-file=/data/etcd/cert/ca.pem --peer-client-cert-auth --peer-trusted-ca-file=/data/etcd/cert/ca.pem --enable-v2

如果你是3以上的etcd版本,需要关闭etcd,然后添加--enable-v2并重启,否者无法使用flannel,报错信息是can't get config之类的信息。

2.  启动flannel

./flanneld --ip-masq --etcd-endpoints=https://10.203.0.43:2379,https://10.203.3.96:2379,https://10.203.0.46:2379 -etcd-cafile=/data/etcd/cert/ca.pem -etcd-certfile=/data/etcd/cert/peer.pem -etcd-keyfile=/data/etcd/cert/peer-key.pem &

3. 生成subnet.env,docker将会使用这个subnet.env来启动。

/data/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env

来看一下subnet.env什么内容:

[root@oyoshbddwatlasyprd1 flannel]# cat /run/flannel/subnet.env
DOCKER_OPT_BIP="--bip=172.17.83.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=false"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_NETWORK_OPTIONS=" --bip=172.17.83.1/24 --ip-masq=false --mtu=1450"

大家可以看到,这个内容其实是随机生成的,172.17.83.1/24,表示docker使用这个虚拟网段,docker启动的时候需要使用这个配置来启动。

4. 修改docker.service,以便指定subnet.env文件来启动

#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
EnvironmentFile=/run/flannel/subnet.env
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS

第一行注释掉的是默认的启动命令,现在改成根据subnet.env的变量DOCKER_NETWORK_OPTIONS来启动docker.

5. 重新启动docker

systemctl daemon-reload
systemctl restart docker

6. 确认docker网段

第一台机器:

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450inet 172.17.52.1  netmask 255.255.255.0  broadcast 172.17.52.255ether 02:42:02:ff:28:6a  txqueuelen 0  (Ethernet)RX packets 1312218  bytes 91088448 (86.8 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 1403712  bytes 3494588370 (3.2 GiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 10.203.0.46  netmask 255.255.254.0  broadcast 10.203.1.255ether 00:16:3e:06:f3:4d  txqueuelen 1000  (Ethernet)RX packets 37252931  bytes 11557211415 (10.7 GiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 33898339  bytes 6693779547 (6.2 GiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450inet 172.17.52.0  netmask 255.255.255.255  broadcast 0.0.0.0ether 3a:40:68:15:5c:45  txqueuelen 0  (Ethernet)RX packets 5  bytes 420 (420.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 5  bytes 420 (420.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

第二台机器:

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500inet 172.17.83.1  netmask 255.255.255.0  broadcast 172.17.83.255ether 02:42:53:e1:69:7c  txqueuelen 0  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 10.203.3.96  netmask 255.255.254.0  broadcast 10.203.3.255ether 00:16:3e:12:21:46  txqueuelen 1000  (Ethernet)RX packets 560672439  bytes 440894465247 (410.6 GiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 526563533  bytes 202796272242 (188.8 GiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450inet 172.17.83.0  netmask 255.255.255.255  broadcast 0.0.0.0ether 2a:2e:0d:a8:5a:3a  txqueuelen 0  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

仔细看网段,这2台机器是不一样的,都是flannel随机生成的。

7. 测试别的机器能够访问容器的虚拟ip

我们随便启动一个容器:

[root@oyoshbddwatlasprd0 flannel]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
e91703882bd0        registry            "/entrypoint.sh /etc   11 days ago         Up 34 minutes       0.0.0.0:5000->5000/tcp   hopeful_gates
[root@oyoshbddwatlasprd0 flannel]# docker exec -it e91703882bd0 sh
/ # ifconfig -a
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:34:02  inet addr:172.17.52.2  Bcast:172.17.52.255  Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1RX packets:10 errors:0 dropped:0 overruns:0 frame:0TX packets:10 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:868 (868.0 B)  TX bytes:868 (868.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0UP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)/ # 

上面有一个容器,它的ip是: 172.17.52.2 ,随便找一个别的docker机器来访问这个ip

[root@oyoshbddwatlasyprd1 flannel]# ping 172.17.52.2
PING 172.17.52.2 (172.17.52.2) 56(84) bytes of data.
64 bytes from 172.17.52.2: icmp_seq=1 ttl=63 time=1.06 ms
64 bytes from 172.17.52.2: icmp_seq=2 ttl=63 time=0.990 ms
64 bytes from 172.17.52.2: icmp_seq=3 ttl=63 time=1.00 ms
64 bytes from 172.17.52.2: icmp_seq=4 ttl=63 time=1.00 ms
64 bytes from 172.17.52.2: icmp_seq=5 ttl=63 time=1.00 ms

很明显,我在prd1上访问prd0的虚拟ip是通的。这就意味不需要再做什么端口映射了,因为docker配合flannel能够让docker的虚拟ip随意访问,直接访问即可,无需端口映射了。

在k8s里经常会提到网络模型的概念cni, 实际上这个就是所谓的网络模型。

Docker与flannel相关推荐

  1. Docker的Flannel网络配置

    一.简介 1.介绍 Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Open vSwitch(虚拟交换机).Calico Flannel是CoreOS团队针对 ...

  2. 在 Docker 中使用 flannel - 每天5分钟玩转 Docker 容器技术(60)

    上一节我们安装和配置了 flannel,本节在 Docker 中使用 flannel. 配置 Docker 连接 flannel 编辑 host1 的 Docker 配置文件 /etc/systemd ...

  3. CentOS安装etcd和flannel实现Docker跨物理机通信

    1.安装etcd yum install etcdsystemctl stop etcd systemctl start etcd systemctl status etcd 查看etcd是否启动成功 ...

  4. Docker 跨主机容器网络通信 -- Flannel 实现

    一.简介 Flannel 是一种基于 overlay 网络的跨主机容器网络解决方案,也就是将 TCP 数据包封装在另一种网络包里面进行路由转发和通信,Flannel 是 CoreOS 开发,专门用于 ...

  5. docker flannel网络部署和路由走向分析

    1.flannel介绍 flannel是coreos开发的容器网络解决方案.flannel为每个host分配一个subnet,容器从此subnet中分配ip.这些ip可以在host间路由,容器间无需n ...

  6. kubernetes (k8s)的二进制部署单节点(etcd和flannel网络)

    文章目录 1 常见的k8s部署方式 2 环境准备 2.1 拓扑 2.2 所有主机关闭防火墙,selinux,swap 2.3 所有主机配置主机名,并再maser上做主机映射 2.4 所有主机将桥接的I ...

  7. 覆盖网络 Flannel 0.7

    资源 https://github.com/coreos/fla... 官方资源 https://github.com/coreos/fla... 下载地址 特性 概念 Flannel会修改Docke ...

  8. Kubernetes二进制部署——Flannel网络

    Kubernetes二进制部署--Flannel网络 一.Flannel简介 二.Flannel原理 三.Flannel的作用 四.Flannel 网络配置 1.node 节点安装 docker 2. ...

  9. 利用 Docker 在不同宿主机做 CentOS 系统容器 | 原力计划

    作者 | 于先森2017 责编 | 伍杏玲 出品 | CSDN博客 最近公司新接到一个项目,惯例是通过技术架构.业务需求.用户量还有以往的经验大概评估出一份资源配置表格提供给客户,让客户参考采购的服务 ...

最新文章

  1. Java框架JSON-RPC项目demo代码实战 + JAVA WEB配置虚拟目录(转自21天java web开发)
  2. 分析RAC下一个SPFILE整合的三篇文章的文件更改
  3. 团队冲刺站立会议07
  4. Spring属性占位符配置器–一些不太明显的选项
  5. java中如何使用反射调用方法以及获得类中的属性
  6. cf Round 613
  7. numpy 生成任意shape的随机整数
  8. 突然!高通骁龙855 Plus公布:手机厂商们集体沸腾
  9. puml绘制思维导图_定制工作计划有哪些操作,4款工作思维导图模板助你效率蹭蹭上涨...
  10. 安卓 App 库存系统开发 终端设备 SDK 分析
  11. linux media v4l2,Linux kernel drivers/media/v4l2-core/videobuf2-v4l2.c拒绝服务漏洞(CVE-2016-4568)...
  12. java 局域网广播_java UDP实现局域网广播 | 学步园
  13. 关于计算机科学与技术二级学科的一点介绍
  14. 关于8.0出现Only fullscreen opaque activities can request orientation
  15. 原版安装Win10 1909专业版 64位MSDN镜像2020 05
  16. 如何快捷地下载知乎中的视频
  17. Android常用十大框架
  18. 用Excel制作不一样的分割图表
  19. java调用阿里云短信服务器-发送短信
  20. 禁止浏览器返回登入页面

热门文章

  1. JAVA 设置银行账户类Acount
  2. 【模电】电场、磁场、电磁场的屏蔽原理
  3. apache-atlas-2.0.0 安装
  4. 1032.挖掘机技术哪家强
  5. 目标检测 Faster R-CNN运行及实时性DEMO测试
  6. Gavin老师Transformer直播课感悟 - Rasa项目实战之电商零售对话机器人通过Rasa interactive进行问题修正与调试演示(八十四)
  7. 激光标准(laser standards)
  8. 1069 微博转发抽奖 (20 分)(算法分析+代码实现)
  9. 未选择的路 作者:罗伯特·弗罗斯特
  10. 研究生综合英语上第五单元