k8s容器平台架构浅析

行业背景

Docker自2013年发行以来,得到了飞速的发展,直至今日已经成为了基础架构中必不可缺的一份子,也是构建企业云平台的有效手段。而作为容器编排及管理的利器的kubernetes,已经与docker紧紧绑在一起,K8S对docker提供了更加原生的支持,同时提供了资源调度、容器生命周期管理、负载均衡、弹性伸缩、高可用等底层功能。

Docker基本概念

Docker简单理解其实就是运行在linux上的虚拟机,但是又和传统的虚拟机有所不同,docker相比虚拟机更加轻量,对资源的利用更高,最大的一个特点就是docker不需要在宿主机上虚拟出一个虚拟机操作系统,多个docker共享宿主机的linux内核,相比虚拟机性能更好。还有一点,docker可以将应用程序和依赖的库文件一起打包入镜像,这个镜像就是应用的完整的运行时环境,这样大大简化了应用发布及迁移的流程。

K8S核心技术

对于初学者来说可能觉得k8s的技术复杂,但其实k8s并没有什么核心技术,k8s只是一个工具实现了我们资源可控、网络隔离、弹性伸缩、快速部署等功能。它其实就是将操作系统的一些命令或者功能封装进k8s里帮助我们实现上面的功能。比如通过操作系统cgroup实现容器的资源隔离和限制,通过iptables,lvs实现端口映射和流量转发,数据库使用成熟的分布式存储etcd,flannel网络其实也只是在真实物理网络上虚拟出来的overlay网络,持久化卷也是基于外部的ceph或者nfs、gluserfs或者本地盘等物理存储构建。所以我们看,k8s就是将需要的技术做了整合,实现的集群的管理。

K8S架构

好了,废话不多说,下面简单介绍一下docker及k8s的架构及组网理念。
Docker的话其实没什么好说的,有镜像、仓库、容器等基本概念。对于docker我们掌握一些基本命令就行,主要参考下面这个图:
k8s容器平台架构浅析_第1张图片
我们可以简单看看docker的网络,当创建一个docker时会在操作系统上创建一个网桥,网桥也就是虚拟软交换机,这个虚拟交换机将宿主机物理网口和容器的网口互联起来,构成局域网。

k8s容器平台架构浅析_第2张图片

下面我们再看看k8s架构,k8s集群由master和node节点组成,master由如下组件组成:APIserver+scheduler+controller manager+etcd,node节点由kubelet+kube-proxy+pod组成

k8s容器平台架构浅析_第3张图片

APIserver:所有资源增删改查的唯一入口,k8s集群的命令行和api接口都是通过调用apiserver实现的,主要处理rest操作以及更新etcd中的内容。
Scheduler:集群的调度器,将pod绑定到node上,同时实现pod在node上的调度。
Controller manager:所有其他集群级别的功能,是资源对象的自动化控制中心。
Etcd:集群的数据库,所有需要持久化的信息存储于etcd中。
Kubelet:实现对pod以及容器、镜像、卷等的管理。
Kube-proxy:实现pod间的负载均衡,实现对service ip的访问。

K8S网络与负载均衡

网络是k8s集群中的一个难点,理解k8s网络构成有利于我们理解集群的架构。我们先来看看三类ip:
Node ip:主机的物理ip
Service ip:k8s虚拟ip,由k8s管理和分配,单独的ip没有通信功能,要配合service port才能使用,每个node上的service ip是相同的。
Pod ip:pod的ip地址,内部docker的ip,也就是上面讨论的通过docker网桥与物理网卡互联的ip地址,可以在node上通过ssh访问。

下面我们先看看一个请求的转发流程,我们知道一个请求要想访问某个pod,请求先经过node的物理网卡,通过iptables的转发规则,将访问地址和端口进行转换,转为svc的地址,service同样使用iptables规则通过kube-proxy定义的转发百分比将流量转发到不同pod上。

k8s容器平台架构浅析_第4张图片

这里有个问题我们可以延伸下。Svc转发到的多个pod可能不在一个机器上,这样就涉及到跨机器访问,就是说可能a机器的svc需要转发流量到b机器的pod中,那么这种情况下k8s是如何做的呢?这里其实就涉及到overlay网络。
k8s容器平台架构浅析_第5张图片

我们知道overlay网络是承载在物理网络上的虚拟网络,这个网络本质上还是走的物理机的物理网卡,但是这个网络其实对物理网络是透明的,用户可以不关心物理网络。那么它是怎么工作的呢?K8s是通过flannel网络实现的。Flannel网络是通过ip隧道协议将数据包前面再封装一层,将源地址和目的地址的外部网络ip(node ip)与内部网络ip(pod ip)封装到数据包里,这样数据包从a机器的svc转发到b机器的物理网卡上时先进行解包,然后得到内部ip,转发到pod上。但是整体上看对于用户就是几个pod间的overlay网络互连的,用户无需关心其他细节。Flannel网络虽然简单,但是这种方式需要解包,所以在集群十分大的情况下可能存在性能问题,所以我们有了flannel网络的替代品:calico,calico网络是完全通过ip路由实现的转发,这种方式也有缺点,就是在集群很大的情况下,路由表可能十分庞大。

当然k8s的内容还有很多,比如说如何构建一个应用,包括namespace、service、deployment、pod等的构建,还有k8s的用户角色与权限认证体系等,这里不再一一讨论。本文旨在帮助初学者构建k8s的一个总体架构,理解k8s的工作机制,至于具体的命令还需要自己去实践。

欢迎关注我的公众号

你可能感兴趣的:(docker,数据库架构之美)