容器私有云和持续发布都要解决哪些基础问题 第一集
本文档适用人员:广义上的技术人员
- 集装箱还是卷挂载?
- Host Networking 还是 Bridge Networking?
- 容器要固定IP吗?
- 容器内部如何获取宿主机的IP?
- 待续
首先,你要明白容器并不是虚拟机,虽然它可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题,但它真的不是虚拟机。以往我们的开发、配置管理、部署发布、监控报警思路都要跟着变。
0x00 集装箱还是卷挂载?
|
我们再来看一下 Docker 的 Logo,它隐含天机:
- 规格标准,在港口和船上可以层叠摆放,节省大量空间,
- 可以进行快速装卸,并可从一种运输工具方便地换装到另一种运输工具,
- 途中转运不用移动箱内货物,就可以直接换装,
- 货物的装满和卸空很方便。
- 从货运工人角度考虑,整体才是最经济的。
- 这也导致装卸复杂度增加。
- 代码放到 slave 节点的本地磁盘:那么必须要有一种机制,来确保每台 slave 上代码包版本的一致性,而且对于磁盘空间和网络分发来讲也是一种浪费(考虑一下 100 台 slave,其中可能只有 10 台需要运行这个版本的代码)
- 代码放到分布式共享文件系统(如 ceph):它倒是解决了数据过度冗余以及一致性的问题,但分布式共享文件系统本身成为了『单点』,虽然可以设置多个副本。它的性能和可靠性都必须得到充分保障才行。
0x01 Host Networking 还是 Bridge Networking?
网络基础
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。
我们需要从中选一个作为我们的网络方案,实际上只有 bridge 和 host 两种模式可选。(想了解这四个参数,请翻到附录B之 Network settings。)
公司
|
网络方案
|
备注
|
网易(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网络模型以后如何发展
0x02 容器要固定IP吗?
上一章节里提到的 Pipework 可以做到让容器有一个可以直接访问的静态 IP 地址,just like this:
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}]
0x03 容器内部如何获取宿主机的IP?
Registry/Repository/Image/Tag:
Registry 存储镜像数据,并且提供拉取和上传镜像的功能。Registry 中镜像是通过 Repository 来组织的,而每个 Repository 又包含了若干个 Image。
比如,你在本地机器上运行 docker image 命令,可能会得到这样的输出结果:
我们常说的“ubuntu”镜像其实不是一个镜像名称,而是代表了一个名为 ubuntu 的 Repository,同时在这个 Repository 下面有一系列打了 tag 的 Image,Image 的标记是一个 GUID,为了方便也可以通过 Repository:tag 来引用。
——《玩转Docker镜像,2014,孙宏亮》
|
Network settings:
docker run --net 的四个参数进一步解释如下:
None:
将网络模式设置为 none 时,这个 container 将不允许访问任何外部 router。这个 container 内部只会有一个 loopback 接口,而且不存在任何可以访问外部网络的 router。
Bridge:
默认为 bridge 模式。此时在 host 上面将存在一个 docker0 的网络接口,同时会针对 container 创建一对 veth 接口。其中一个 veth 接口是在 host 充当网卡桥接作用,另一个 veth 接口存在于 container 的命名空间中,并且指向 container 的 loopback。docker 会自动给这个 container 分配一个 IP,并且将 container 内的数据通过桥接转发到外部。
如下图(图作者冯明振)所示:
容器 eth0 网卡从 docker0 网桥所在的 IP 网段中选取一个未使用的 IP,容器的 IP 在容器重启的时候会改变。docker0 的 IP 为所有容器的默认网关。容器与外界通信为 NAT。
Host:
此时,这个 container 将完全共享 host 的网络堆栈。host 所有的网络接口将完全对 container 开放。container 的主机名也会存在于 host 的 hostname 中。这时,container 所有对外暴露的 port 和对其它 container 的 link,将完全失效。
Container:
此时,这个 container 将完全复用另一个 container 的网络堆栈。
|
目前,我们容器管理集群的技术栈包括以下内容:
- mesos(资源调度)
- marathon(服务编排)
- chronos(分布式计划任务)
- docker(容器引擎)
- consul+registrator(服务注册和发现)
- haproxy(负载均衡)
- prometheus(服务监控)
- nagios/zabbix(节点监控)
- salt(节点配置管理)
- cobbler(节点自动化装机)
- ELK(日志收集分析)
窝窝持续集成管理平台在这些技术的基础上,实现了我们的集群管理、容器管理、应用管理等业务流程。
容器私有云和持续发布都要解决哪些基础问题 第一集相关推荐
- 江苏农信金融云热点问答:银行如何统筹推进私有云和行业云建设?
当前,金融领域已经成为应用云计算技术最迫切的行业之一.随着大量的金融机构开始依托云来承载应用和处理高并发业务,云计算技术正在与金融行业快速结合,在金融行业内快速发展.2020年是"十三五&q ...
- 云计算技术都要学什么?教你分清公有云、私有云和混合云
云计算的基本原理是,通过使计算分布在大量的分布式计算机上,而非本地计算机或远程服务器中,企业数据中心的运行将更相似于互联网.这使得企业能够将资源切换到需要的应用上,根据需求访问计算机和存储系统.云计算 ...
- 2020 OpenInfra Days China :OpenStack+Kubernetes,构建新一代私有云和容器云
8月16-17日,由OpenStack基金会举办的国内极具影响力的开源盛会2020 OpenInfra Days China在线上召开.本次大会聚焦"智能开源基础设施",围绕人工智 ...
- 初探在容器上构建持续部署!
作者 | 倚天码农 责编 | 徐威龙 封图| CSDN下载于视觉中国 要想理解持续集成和持续部署,先要了解它的部分组成,以及各个组成部分之间的关系.下面这张图是我见过的最简洁.清晰的持续部署和集成的关 ...
- CI/CD——构建企业级Docker+Jenkins+Git+Harbor流水线自动化持续集成持续发布平台
构建企业级Docker+Jenkins+Git+Harbor流水线自动化持续集成持续发布平台 CI/CD是什么? 持续集成(CI)/持续交付(CD)的优势 自动化部署流程图 Git Github Gi ...
- jenkins ---持续集成/持续发布
持续集成/持续发布 CI/CD Jenkins Jenkins概述 Jenkins目标 Jenkins特性 部署 环境准备 1.部署git 2.jdk环境部署 3.部署maven 4.部署tomcat ...
- 微服务容器部署与持续集成(Jenkins)
微服务容器部署与持续集成(Jenkins) 一.微服务容器部署 1.Dockerfile 1.1 Dockerfile简介 1.2 使用脚本创建镜像 2.Docker私有仓库 2.1 私有仓库搭建与配 ...
- 【linux】持续集成与持续发布CICD
文章目录 DevOps的发展历程 原始开发时代 瀑布开发时代 敏捷开发时代 精益开发时代 DevOps 版本控制概念 什么是版本? 什么是版本控制? 常见的版本控制系统及比较 git的安装 git应用 ...
- 私有云和公有云区别_公共云和私有云有什么区别?
私有云和公有云区别 Cloud storage and computing are no longer a new concept. Cloud is one of the most recogniz ...
最新文章
- transactionscope 中的异步 处理 异常_.NET Core中TransactionScope事务处理方法介绍及注意事项...
- MongoDB的学习--聚合
- 网络营销立足于网站自身的优化与运营
- Elasticsearch之CURL命令的version控制
- 震惊!评审专家将论文拒稿后修改发表
- storyboard隐藏iphone软键盘
- C++学习笔记6:多文件编程
- [Oracle] SQL*Loader 详细使用教程(3)- 控制文件
- [tf] tf.gradients vs optimizer.compute_gradients
- 把C#当作脚本语言来用
- python中国官网-Python教程
- c语言中有无注释重要吗,求助!有什么问题没考虑到吗? (c语言,大部分注释都写啦)...
- java对接芯烨XP58系列打印机,网络驱动
- Xshell 如何导入 PuTTYgen 生成的 key
- 【NOIP2016提高组】蚯蚓
- 笑话生成器_爸爸笑话发生器
- 智能车图像处理-阳光算法
- Pytorch:NLP 迁移学习、NLP中的标准数据集、NLP中的常用预训练模型、加载和使用预训练模型、huggingface的transfomers微调脚本文件
- python数据分析算法调用_python数据分析算法(决策树2)CART算法
- 打造自己的MVC框架
热门文章
- vc 6.0 显示文件全路径_Linux常用命令大全(非常全!!!)
- c盘扩展卷是灰色的_技术丨电脑C盘装太满?这几招轻松释放空间
- Linux 错误 Permission denied问题
- 台式电脑配置单_5000元最强组组装电脑,游戏配置,组装电脑配置2020年11月更新...
- dell 2r30服务器装系统,DELL服务器操作系统安装汇总.docx
- php 对象方法作为参数,在C++中对象如何作为参数传递和返回?(代码示例)
- python join()函数
- 统计“3_人民日报语料”文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式
- 【业务知识】数字档案馆建设内容
- linux安装mysql、卸载mysql、设置mysql