让我们小结一下基于docker引擎的容器网络:
每个docker容器需要连接到网络上,才能对外提供服务,否则其存在没有任何意义。因此,默认在每个宿主机上,有一个docker0网桥,所有的容器默认连接到这个网桥,如下图所示:
如图,172.17.0.2这个容器运行的是ubuntu实例,而172.17.0.3这个容器运行的是nginx实例,二者可以通过docker0互通。
对于访问宿主机以外的网络,需要通过NAT:
当然,对外访问宿主机内部的容器,也需要经过NAT。
对于两台宿主机之间互访的情况,可以利用swarm实现基于VXLAN隧道的互通:
有了这些基础的容器网络机制,我们是可以构建一个基于容器的对外服务系统的。
然而,仅仅有docker引擎,还不够……
-----------------------分割线-----------------------
我们知道,正是中国的几亿劳动者,紧密团结起来,才打败了三座大山、联合国军、血吸虫病和新型冠状病毒。
我们也知道,在linux docker的体系中,创建容器、销毁容器、将容器连入网络、监控容器性能等操作,都需要手工进行。
如果单一容器无法满足性能或功能的需求,也无法通过自动化的手段自动扩容,或将多个不同功能的容器进行耦合关联。
只有让容器团结起来,才能发挥更大的作用!
DOCKERS OF THE WORLD, UNITE!
一个幽灵,云原生的幽灵,在生产力最发达的中美互联网领域悄悄游荡——
工程师们创立了容器编排平台:Kubernetes。
Kubernetes的字面意义是“舵手”。
Kubernetes可以自动化地调度容器资源,进行容器的创建、入网、扩容和销毁,结合Harbor镜像仓库、Istio API网关、Prometheus性能监控、Jenkins构建流水线等组件,能够实现从代码提交到自动部署的CI/CD(持续集成/持续开发),使得容器真正地驶入蓝海——
大海航行靠舵手!
“舵手” kubernetes 的架构如下:
在如此复杂的架构中,目前我们只需要掌握:
- Kubernetes的容器资源分配单位是pod,一个pod中可以有多个容器,但对pod之外呈现为一个整体(一个IP地址);
- Kubernetes的容器运行载体是node,一个node可以运行多个Pod。node有自己的操作系统(一般为Linux)。
我们可以将node类比为虚拟机世界中的宿主机,pod类比为虚拟机世界中的VM。
下面的讨论均以此为依据。
敬请期待下期——