首页 > 系统 > Linux >

业界docker实现的技术教程

2019-01-15

业界docker实现的技术教程。单实例性能调优 + 万兆卡的性能发挥出来。需要对OVS(Open vSwitch)做一些改进 多机房:多机房及可用域支持 容器网络需求 Iptables 有些坑 跨主机容器间网络访问 容器网络是否需要具备IP地址漂移能力。

业界使用架构

单实例性能调优 + 万兆卡的性能发挥出来。需要对OVS(Open vSwitch)做一些改进 多机房:多机房及可用域支持 容器网络需求 Iptables 有些坑 跨主机容器间网络访问 容器网络是否需要具备IP地址漂移能力 容器网络面临的问题 Docker Host 模式,混布存在端口冲突。 Docker NAT 模式,Ip地址敏感服务改造大,无法支持服务发现 Overlay网络,涉及IP地址规划,MAC地址分配,网络设备收敛比等问题 Overlay网络安全性,可维护性, 容量规划 版本升级(docker/mesos/k8s)本身的升级 docker 对有状态的服务进行容器化的问题 kafka / mysql
网络选型(k8s和mesos)

思考 && 痛点

可否跨机器访问 跨域访问 flannel可以跨容器通信 跨主机的容器互联 容器与外部互联 是否支持静态ip , 固定ip 域名访问 固定ip的话,那么就需要每次部署或者更新或重启的时候,ip保持不变 overlay network, Docker 1.6 可以实现跨主机通信 是否支持dns 4层/7层访问 容器库容后的网络 ip端口,最好不要自行手动规划 网络策略,防御 ,隔离 容器集群不同应用之间的网络隔离和流量限制

docker 网络

host模式: 容器都是直接共享主机网络空间的,容器需要使用-p来进行端口映射, 无法启动两个都监听在 80 端口的容器, 并且没有做到隔离 container模式: 一个容器直接使用另外一个已经存在容器的网络配置:ip 信息和网络端口等所有网络相关的信息都共享 Bridge模式: 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关 容器的IP在容器重启的时候会改变 不同主机间容器通信需要依赖第三方方案如:pipework
方案 方案类别 隧道方案, 通过隧道,或者说Overlay Networking的方式: Weave,UDP广播,本机建立新的BR,通过PCAP互通。 Open vSwitch(OVS),基于VxLAN和GRE协议,但是性能方面损失比较严重。 Flannel,UDP广播,VxLan。 路由方案 Calico,基于BGP协议的路由方案,支持很细致的ACL控制,对混合云亲和度比较高。 Macvlan,从逻辑和Kernel层来看隔离性和性能最优的方案,基于二层隔离,所以需要二层路由器支持,大多数云服务商不支持,所以混合云上比较难以实现。 性能好,没有NAT,效率比较高, 但是受限于路由表,另外每个容器都有一个ip,那么业务ip可能会被用光. 网络的两大阵营 Docker Libnetwork Container Network Model(CNM)阵营(Docker Libnetwork的优势就是原生,而且和Docker容器生命周期结合紧密) Docker Swarm overlay Macvlan & IP network drivers Calico Contiv(from Cisco) Container Network Interface(CNI)阵营 (CNI的优势是兼容其他容器技术(e.g. rkt)及上层编排系统(Kuberneres & Mesos)) Kubernetes Weave Macvlan Flannel Calico Contiv Mesos CNI 常见的解决方案有: flannel vxlan,overlay方式 calico 容器间网络三层隔离,无需要担心arp风暴 基于iptable/linux kernel包转发效率高,损耗低 Calico没有多租户的概念,所有容器节点都要求可被路由,IP地址不能重复 ipvlan macvlan,物理二层/三层隔离,目前需要pipework工具在单个节点上配置,仅做了vlan隔离,不解决arp广播 swarm native vxlan,跟flannel vxlan类似 neutron sdn,选择就多种了,ml2+ovsplugin,midonet,vlan or vxlan Weave 能够创建一个虚拟网络来连接部署在多台主机上的Docker容器, 外部设备能够访问Weave网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上 contiv 思科主导,sdn解决方案,可以用纯软的ovs,也可以用ovs+cisco硬件sdn controller 基于 OpenvSwitch,以插件化的形式支持容器访问网络,支持 VLAN,Vxlan,多租户,主机访问控制策略等 SDN能力,能够对容器的网络访问做更精细的控制 京东基于相同的技术栈(OVS + VLAN)已支持10w+ 容器的运行 linux bridge+三层交换机:host上 linux bridge 设置为三层交换机的子网网段,容器之间通信走二层交换,容器与外部走三层交换机的网关。 业界常用网络选型 kubernetes + flannel Kubernetes采用扁平化的网络模型,要求每个Pod拥有一个全局唯一IP,Pod直接可以跨主机通信。目前比较成熟的方案是利用Flannel Flannel已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发模式。 kubernetes 下有 flannel、openvswitch和weave可以实现Overlay Network 唯品会 contiv netplugin方案(固定外网ip) + flannel 京东 Flannel + Neutron + OVS Flannel性能: 官方:带宽没有下降,延迟明显变大 Mesos + Caclio Mesos支持CNI标准规范 一容器一ip, 网络隔离, DNS服务发现, ip分配, L3的虚拟网络 去哪儿 Mesos + Caclio 七牛 Bridge+ NAT + Open vSwitch 魅族云 OVS & VLAN + SR-IOV ucloud: vswitch overlay的"大二层"网络SDN组网方案 + ipvlan
日志监控选型(包括监控,统计)

docker由于分层设计模式,容器里面无法固化数据, 容器销毁里面的数据就会丢失, 因此建议将日志挂载到宿主机上, 或者使用分布式存储如ceph
stdout/stderr类型的日志,可通过logspout转发到syslog中心来收集
Docker 的LogDriver 能输出日志到特定的端点,例如Fluentd,Syslog,或者Journald。 Logspout能将容器日志路由到Syslog或者第三方的诸如Redis,Kafka或者Logstash的模块中。

方案介绍 采用容器外收集。将主机磁盘挂在为容器中的日志目录和文件。 将容器中应用的控制到日志也重定向到日志目录。 在主机上对应用日志目录和docker日志目录做日志收集和轮换。 监控可选方案 cAdvisor + InfluxDB + Grafana cAdvisor + Prometheus + Grafana Graphite Zabbix Datadog 日志可选方案 logstash ELK Graylog flume heka fluentd

业界方案

阿里云 : cAdvisor + InfuxDB + prometheus 协程: ELK 知乎: Graphite + cAdvisor
镜像管理 镜像总是从Dockerfile生成 镜像之间应该避免依赖过深,建议为三层,这三层分别是基础的操作系统镜像、中间件镜像和应用镜像 所有镜像都应该有对应的Git仓库,以方便后续的更新

Registry

单点问题,对应的解决方案可以考虑DRBD、分布式存储以及云存储 Regitry的性能问题,目前可用的解决方案是通过HTTP反向代理缓存来加速Layer的下载, 或者提供镜像mirror Registry用户权限,Nginx LUA可以提供一个简单快速的实现方案
个人理解 选型不能只看编排, 还要看存储/网络等方面的支持 swarm以前有些缺陷,如不能检测失败节点并重启,最新版的也实现 k8s 只是用来调度docker mesos是用来管理机器集群. 通过Marathon才能间接管理docker 对应网络的支持 是否能够跨主机/跨域 是否能够固定ip/ dns解析 CNI 标准的支持 对于存储的支持 是否能够固化 是否支持分布式存储 对于编排/调度/升级 是否支持回滚 在线升级 滚动升级 是否能够细粒度分配cpu/内存等 是否支持有状态服务的容器化 和 调度 自动扩缩容能力 服务注册/发现机制 / 负载均衡 是否有合适的服务注册机制 负载均衡是否能够满足各种业务场景需求 其他 隔离, 除了cgroup和namespace, 还有其他的隔离,比如网络隔离
相关文章
最新文章
热点推荐