Docker与flannel
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相关推荐
- Docker的Flannel网络配置
一.简介 1.介绍 Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Open vSwitch(虚拟交换机).Calico Flannel是CoreOS团队针对 ...
- 在 Docker 中使用 flannel - 每天5分钟玩转 Docker 容器技术(60)
上一节我们安装和配置了 flannel,本节在 Docker 中使用 flannel. 配置 Docker 连接 flannel 编辑 host1 的 Docker 配置文件 /etc/systemd ...
- CentOS安装etcd和flannel实现Docker跨物理机通信
1.安装etcd yum install etcdsystemctl stop etcd systemctl start etcd systemctl status etcd 查看etcd是否启动成功 ...
- Docker 跨主机容器网络通信 -- Flannel 实现
一.简介 Flannel 是一种基于 overlay 网络的跨主机容器网络解决方案,也就是将 TCP 数据包封装在另一种网络包里面进行路由转发和通信,Flannel 是 CoreOS 开发,专门用于 ...
- docker flannel网络部署和路由走向分析
1.flannel介绍 flannel是coreos开发的容器网络解决方案.flannel为每个host分配一个subnet,容器从此subnet中分配ip.这些ip可以在host间路由,容器间无需n ...
- kubernetes (k8s)的二进制部署单节点(etcd和flannel网络)
文章目录 1 常见的k8s部署方式 2 环境准备 2.1 拓扑 2.2 所有主机关闭防火墙,selinux,swap 2.3 所有主机配置主机名,并再maser上做主机映射 2.4 所有主机将桥接的I ...
- 覆盖网络 Flannel 0.7
资源 https://github.com/coreos/fla... 官方资源 https://github.com/coreos/fla... 下载地址 特性 概念 Flannel会修改Docke ...
- Kubernetes二进制部署——Flannel网络
Kubernetes二进制部署--Flannel网络 一.Flannel简介 二.Flannel原理 三.Flannel的作用 四.Flannel 网络配置 1.node 节点安装 docker 2. ...
- 利用 Docker 在不同宿主机做 CentOS 系统容器 | 原力计划
作者 | 于先森2017 责编 | 伍杏玲 出品 | CSDN博客 最近公司新接到一个项目,惯例是通过技术架构.业务需求.用户量还有以往的经验大概评估出一份资源配置表格提供给客户,让客户参考采购的服务 ...
最新文章
- Java框架JSON-RPC项目demo代码实战 + JAVA WEB配置虚拟目录(转自21天java web开发)
- 分析RAC下一个SPFILE整合的三篇文章的文件更改
- 团队冲刺站立会议07
- Spring属性占位符配置器–一些不太明显的选项
- java中如何使用反射调用方法以及获得类中的属性
- cf Round 613
- numpy 生成任意shape的随机整数
- 突然!高通骁龙855 Plus公布:手机厂商们集体沸腾
- puml绘制思维导图_定制工作计划有哪些操作,4款工作思维导图模板助你效率蹭蹭上涨...
- 安卓 App 库存系统开发 终端设备 SDK 分析
- linux media v4l2,Linux kernel drivers/media/v4l2-core/videobuf2-v4l2.c拒绝服务漏洞(CVE-2016-4568)...
- java 局域网广播_java UDP实现局域网广播 | 学步园
- 关于计算机科学与技术二级学科的一点介绍
- 关于8.0出现Only fullscreen opaque activities can request orientation
- 原版安装Win10 1909专业版 64位MSDN镜像2020 05
- 如何快捷地下载知乎中的视频
- Android常用十大框架
- 用Excel制作不一样的分割图表
- java调用阿里云短信服务器-发送短信
- 禁止浏览器返回登入页面
热门文章
- JAVA 设置银行账户类Acount
- 【模电】电场、磁场、电磁场的屏蔽原理
- apache-atlas-2.0.0 安装
- 1032.挖掘机技术哪家强
- 目标检测 Faster R-CNN运行及实时性DEMO测试
- Gavin老师Transformer直播课感悟 - Rasa项目实战之电商零售对话机器人通过Rasa interactive进行问题修正与调试演示(八十四)
- 激光标准(laser standards)
- 1069 微博转发抽奖 (20 分)(算法分析+代码实现)
- 未选择的路 作者:罗伯特·弗罗斯特
- 研究生综合英语上第五单元