Kubernetes容器编排技术浅析
kubernetes是一个容器编排开源软件,它可以轻松高效管理由千上万的主机组成的集群,并提供容器部署运行的环境。
kubernetes最初由Google开发和设计,前身是Borg系统,Google有成千上万的容器运行在上面,主要帮忙Google实现简化开发和管理,并且提供基础设施的资源利用率。再内部稳定运行Borg数十年之久后,随着容器化的大流行,2014年Google开源了kubernetes,一个基于Borg和其它内部系统的开源系统。2015年,Google将kubernetes项目捐赠给了CNCF(云原生计算基金会)。
优势和劣势
优势
1,kubernetes基于Google内部的Borg系统实现,有着长达数十年之久的稳定大规模运行实践经验。
2,Kubernetes提供的是一个平台,不是解决方案,实现容器化应用程序的一次编写并在各类型云基础设施上运行,它将公有云与私有云之间存在的复杂的基础设施差异抽象化掉了。
3,社区活跃多极高,在所有竞争对手中遥遥领先
1,安装部署比较麻烦
2,只能用于容器的编排管理
适用场景
帮助开发聚焦核心应用功能
kubernetes可以被认为是一个集群的操作系统,它提供了注入服务发现,扩容,负载均衡,自恢复,选举等功能,使开发者不用关心基础设施相关的服务而可以把心思都集中再应用实现本身。
帮助运维提升资源利用率
kubernetes可以将容器化的应用运行在集群的任何主机上,并保证应用组之间的通信和运行,并且能够自动实现根据主机资源使用情况的自动调度,最大化资源利用率。
架构
Master节点
作为管理集群状态的Master节点,它主要负责接收客户端的请求,安排容器的执行并且运行控制循环,将集群的状态向目标状态进行迁移,Master 节点内部由三个组件构成:API Server,Controller控制器,Scheduler 调度器。
Node节点
主要由kubelet和kube-proxy两部分组成,它主要负责Node节点的所有管理操作。
核心技术点
Pod
Pod是Kubernetes中最基本的概念,它也是Kubernetes对象模型中我们可以创建或者部署的最小并且最简单的单元。
它将应用的容器、存储资源以及独立的网络IP地址等资源打包到了一起,表示一个最小的部署单元,但是每一个pod中的运行的容器可能不止一个,这是因为pod最开始设计时就能够在多个进程之间进行协调,构建一个高内聚的服务单元,这些容器能够共享存储和网络,非常方便地进行通信。
API Server
API Server负责处理来自用户的请求,其主要作用就是对外提供 RESTful的接口,包括用于查看集群状态的读请求以及改变集群状态的写请求。它是Kubernetes的中心组建,其它组件都会与其交互,她使用etcd做存储。
客户端通过创建到API Server的HTTP连接来监听变更,通过此连接,客户端会接收到监听对象的一系列变更通知。每当更新对象,服务器把新版本对象发送至所有监听该对象的客户端。
Service服务
kubernetes Service服务是一种为一组功能相同的pod提供单一不变的接入点的资源。当服务存在时,它的IP地址和端口不会改变。 客户端通过IP地址和端口号建立连接,这些连接会被路由到提供该服务的任意一个pod上。通过这种方式,客户端不需要知道每个单独的提供服务的pod的地址,这样这些pod就可以在集群中随时被创建或移除。
configMap
用于存放pod中应用的配置,本质是一个键值对映射,值可以是短字符,也可以是完整的配置文件。
kubelet
kubelet是一个节点上的主要服务,它监听API Server 接受新的或者修改的pod规范并且保证节点上的pod和其中容器的正常运行,还会保证节点会向目标状态迁移,该节点仍然会向Master 节点发送宿主机的健康状况。其实,就是负责所有运行在工作节点上内容的组件。
kube-proxy
运行在各个节点上的代理服务kube-proxy负责宿主机的子网管理,同时也能将服务暴露给外部,其原理就是在多个隔离的网络中把请求转发给正确的pod或者容器。
Scheduler调度器
运行在kubernetes主节点,利用API Server的监听机制等待新创建的pod,如果监听到有新创建pod,则根据策略配置和节点资源使用情况等等为pod分配节点。
Controller控制器
运行在kubernetes主节点,用于创建和管理pod 的实例,能够在集群的层级提供复制、发布以及健康检查的功能。每个控制器都连接到API Server进行监听更新,每个控制器之间不相互通信。主要的控制器有如下:
Replication控制器
ReplicationController确保在任何时候都有配置的数量的pod副本处于运行状态,现在已经处于废弃状态,被ReplicaSet控制器所取代。
ReplicaSet控制器
ReplicaSet是下一代的Replication控制器,ReplicaSet和Replication的唯一区别是选择器的支持。ReplicaSet支持新的基于集合的选择器需求,功能更强大,而Replication控制器仅支持基于相等选择器的需求。主要管理无状态的应用。
DaemonSet控制器
DaemonSet确保全部(或者某些)节点上只运行一个Pod的副本。当有节点加入集群时,也会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有 Pod。主要管理无状态的应用。
Job控制器
类似于crontab,它允许你运行一种pod,该pod在内部进程成功结束时,不重启容器。一旦任务完成,pod就被认为处于完成状态。
Deployment控制器
用于部署应用程序并以声明的方式升级应用,为pod和ReplicaSet控制器提供描述性的更新方式,当创建一个Deployment时, ReplicaSet资源也会随之创建。使用Deployment可以更容易地更新 应用程序,因为可以直接定义单个Deployment资源所需达到的状态,并让Kubenetes处理中间的状态。
statefulset控制器
用于管理运行有状态的应用,例如分布式应用每个实例需要单独固定的存储,固定的ip等。
Ingress控制器
每个LoadBalancer服务都需要自己的负载均衡器,以及独有的公有IP地址,而Ingress只需要一个公网IP就能为许多服务提供访问。当客户端向Ingress发送HTTP请求时,Ingress会根据请求的主机名和路径决定请求转发到的服务。类似于7层代理。
而为了使用Igress功能,就需要运行一个Ingress控制器。
Node控制器
用于管理node资源,使节点对象列表于集群中实际运行的机器列表保持同步,同事监控每个节点的监控状态,删除不可达pod。
Service控制器
用于再LoadBalancer类型的服务被创建或者删除时,从基础设施请求或者释放负载均衡器。
Endpoint控制器
主要用于维护Service管理的pod的ip和端口。Endpoint控制器定期根据匹配标签选择器的pod的ip,端口更新端点列表。
Namespace控制器
用于根据用户请求,来创建或者删除命名空间中的资源。
PersistentVolume控制器
用于根据持久卷声明来找到合适的持久卷进行绑定或者解绑。
CNCF
Cloud Native Computing Foundation(云原生计算基金会)主要有Docker,Google,CoreOS等重要的容器技术厂商发起成立,主要作用是推广云原生技术,形成社区,开源项目管理与推进生态系统健康发展。云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。
其它编排软件
Docker Compose
Docker Compose是一个基于Docker Engine进行安装的Python工具。 该工具使得用户可以在一个声明式的配置文件中定义一个多容器的应 用,并通过一个简单的命令完成部署。Compose文件可以是YAML或JSON格式,其中定义了所有的容器、网络、卷以及应用所需的密码。docker-compose命令行工具会解析该文件,并调用Docker来执行部署。
Docker-Compose只能管理当前主机上的Docker,解决主机本地Docker容器编排问题。
Docker Swarm
Docker Swarm是一个基于Docker引擎之上的容器编排软件。类似于kubernetes,它也可以轻松高效管理大规模主机组成的集群,并提供容器部署运行的环境。目前,和kubernetes的PK中处于下风。
Mesos
Mesos是一个遵循Apache协议的开源项目,是一个集群管理工具,可以将整个数据中心的资源(包括CPU、内存、存储、网络等)进行抽象和调度,使得多个应用同时运行在集群中分享资源,并无需关心资源的物理分布情况。
Mesos是以与Linux内核同样的原则而创建的,不同点仅仅是在于抽象的层面。Mesos内核运行在每一个机器上,同时通过 API 为各种应用提供跨数据中心和云的资源管理调度能力。这些应用包括Hadoop、Spark、Kafka、Elastic Search,Cassandra等。还可配合框架Marathon来管理大规模的Docker等容器化应用。目前,主要用于大数据相关场景。
参考
https://www.redhat.com/zh/topics/containers/what-is-kubernetes
https://draveness.me/understanding-kubernetes/