本文档适用人员:广义上的技术人员
- 集装箱还是卷挂载?
- Host Networking 还是 Bridge Networking?
- 容器要固定IP吗?
- 容器内部如何获取宿主机的IP?
- 待续
首先,你要明白容器并不是虚拟机,虽然它可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题,但它真的不是虚拟机。以往我们的开发、配置管理、部署发布、监控报警思路都要跟着变。
- 规格标准,在港口和船上可以层叠摆放,节省大量空间,
- 可以进行快速装卸,并可从一种运输工具方便地换装到另一种运输工具,
- 途中转运不用移动箱内货物,就可以直接换装,
- 货物的装满和卸空很方便。
- 从货运工人角度考虑,整体才是最经济的。
- 这也导致装卸复杂度增加。
- 代码放到 slave 节点的本地磁盘:那么必须要有一种机制,来确保每台 slave 上代码包版本的一致性,而且对于磁盘空间和网络分发来讲也是一种浪费(考虑一下 100 台 slave,其中可能只有 10 台需要运行这个版本的代码)
- 代码放到分布式共享文件系统(如 ceph):它倒是解决了数据过度冗余以及一致性的问题,但分布式共享文件系统本身成为了『单点』,虽然可以设置多个副本。它的性能和可靠性都必须得到充分保障才行。
伦理片 http://www.dotdy.com/
网络基础
Docker 现有的网络模型主要是通过使用 Network namespace、Linux Bridge、iptables、veth pair 等技术实现的。( 出处8)- Network namespace:它主要提供了网络资源的隔离,包括网络设备、IPv4/IPv6 协议栈、IP 路由表、防火墙、/proc/net 目录、/sys/class/net 目录、端口(socket)等。
- Linux Bridge:功能相当于物理交换机,为连在其上的设备(容器)转发数据帧,如 docker0 网桥。
- Iptables:主要为容器提供 NAT 以及容器网络安全。
- veth pair:两个虚拟网卡组成的数据通道。在 Docker 中,用于连接 Docker 容器和 Linux Bridge。一端在容器中作为 eth0 网卡,另一端在 Linux Bridge 中作为网桥的一个端口。
- none:关闭了 container 内的网络连接。容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置 IP 等。
- bridge:通过 veth 接口来连接其他 container。这是 docker 的默认选项。
- host:允许 container 使用 host 的网络堆栈信息。容器和宿主机共享 Network namespace。
- container:使用另外一个 container 的网络堆栈信息。kubernetes 中的 pod 就是多个容器共享一个 Network namespace。
公司
|
网络方案
|
备注
|
网易(2014)
|
tinc+quagga+pipework
|
Pipework 是对 Docker Bridge 的扩展,它由 200 多行 shell 脚本实现。通过使用 ip、brctl、ovs-vsctl 等命令来为 Docker 容器配置自定义的网桥、网卡、路由等。
|
CoreOS(2014)
|
flannel
|
flannel 属于隧道方案,UDP 广播,VxLan。
|
大众点评网(2015) |
Bridge Networking 工作在 level 2 的模式,使公共 IP 得以暴露出来,这部分是做了定制的
|
|
汽车之家(2015) |
Bridge Networking
|
|
去哪儿(2015)
|
Host Networking
|
『大吞吐量平台下,bridge 模式性能测试都偏低,于是选择了 host 模式』——20150915,徐磊
|
芒果TV(2015)
|
Macvlan
|
属于路由方案。『从逻辑和 Kernel 层来看隔离性和性能最优的方案,基于二层隔离,所以需要二层路由器支持,大多数云服务商不支持,所以混合云上比较难以实现』——20150505,彭哲夫
|
新浪微博(2015)
|
Host Networking
|
|
Docker 部署被诟病最多就是网络,平台目前采用的是 host 模式,为什么没有采用 NAT 或者 Bridge 呢?由于涉及的技术细节比较繁冗,这里仅分享一些踩过的坑。例如 NAT 使用 iptables 底层流量转发依靠内核 netfilter 模块,其默认仅保持 65536 个链接,在服务有大量链接的场景下,会出现大量拒绝链接的现象。再如 Bridge 的 MAC 地址默认是选择其子接口中最先的一个,这样就会导致一个宿主机下多个容器启停时出现网络瞬断。还有很多问题不一一列举,平台未来计划采用 vlanif 的方案来解决容器网络部署难题。
- 采用 SDN(软件定义网络) 技术,如 flannel,weave 等,直接将容器内网打通;
- 采用 NAT(网络地址转换) 技术,直接使用 slave 主机的 IP 地址互通。
Docker网络模型以后如何发展
If you’re using named Docker instances, then adding the IP address 10.40.33.21 to a Docker instance bind is as simple as:
pipework br0 bind 10.40.33.21/24
If you want to route out of 10.40.33.1, change it to:
pipework br0 bind 10.40.33.21/24@10.40.33.1
(出处:https://opsbot.com/advanced-docker-networking-pipework/)
- 我们的线上还有 php 或者其他开发语言的应用,它怎么调用容器化的 java 工程呢?
- 容器化的工程如何对外网提供服务 ,如何把它放入 nginx 和 F5中呢?
curl 172.28.128.3:8500/v1/catalog/service/python-micro-service[{"Node":"host-1","Address":"172.28.128.3","ServiceID":"registrator:service1:5000","ServiceName":"python-micro-service","ServiceTags":null,"ServicePort":49154}]
目前,我们容器管理集群的技术栈包括以下内容:
- mesos(资源调度)
- marathon(服务编排)
- chronos(分布式计划任务)
- docker(容器引擎)
- consul+registrator(服务注册和发现)
- haproxy(负载均衡)
- prometheus(服务监控)
- nagios/zabbix(节点监控)
- salt(节点配置管理)
- cobbler(节点自动化装机)
- ELK(日志收集分析)
窝窝持续集成管理平台在这些技术的基础上,实现了我们的集群管理、容器管理、应用管理等业务流程。