一.什么是kubernetes

Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg),目前已经成为容器编排一个标准。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩、高可用等一系列完整功能,提高了大规模容器集群管理的便捷性。

Kubernetes优势:

- 容器编排

- 轻量级

- 开源

- 弹性伸缩

- 负载均衡

二,Kubernetes的核心概念

1.master

整个集群的大脑,接受和控制所有组件。主要模块有APIServer、scheduler、controller manager,下方master对各个组件略微详细说明。

2.Node

Node是Kubernetes集群架构中运行Pod的服务节点(亦叫agent或minion)。Node是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。

3.Pod

运行于Node节点上,若干相关容器的组合。Pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间、IP地址和端口,能够通过localhost进行通。Pod是Kurbernetes进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。一个Pod可以包含一个容器或者多个相关容器。

4.Replication Controller

Replication Controller用来管理Pod的副本,保证集群中存在指定数量的Pod副本。集群中副本的数量大于指定数量,则会停止指定数量之外的多余容器数量,反之,则会启动少于指定数量个数的容器,保证数量不变。Replication Controller是实现弹性伸缩、动态扩容和滚动升级的核心。

5.Service

Service定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象。Service提供了一个统一的服务访问入口以及服务代理和发现机制,用户不需要了解后台Pod是如何运行。SVC 在整个集群中负责网络服务(并不是底层容器网络实现),因为pod实际上是不可靠的,可能会被停止或者重启,一旦重启就会导致IP地址发生变化,SVC的功能就是使用kube-proxy进行网络的控制,pod的IP发生变化上层业务并不会中断,kube-proxy采用负载均衡等策略实现网络服务。

6.Label

Kubernetes中的任意API对象都是通过Label进行标识,后续dockerfile会经常用到。Label的实质是一系列的K/V键值对。Label是Replication Controller和Service运行的基础,二者通过Label来进行关联Node上运行的Pod。

三,Kubernetes架构和组件

架构:

主从分布式架构,Master/Node

- 服务分组,小集群,多集群

- 服务分组,大集群,单集群

组件:

1,Kubernetes Master控制组件,调度管理整个系统(集群),包含如下组件:

(1)Kubernetes API Server

作为Kubernetes系统的入口,其封装了核心对象的增删改查操作,以RESTful API接口方式提供给外部客户和内部组件调用。它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给APIServer处理后再提交给etcd。kubectl是直接和APIServer交互的。

a,提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,只有API Server与存储通信,其他模块通过API Server访问集群状态。实现集群故障检测和恢复的自动化工作,负责执行各种控制器,主要有:

第一,是为了保证集群状态访问的安全。

第二,是为了隔离集群状态访问的方式和后端存储实现的方式:API Server是状态访问的方式,不会因为后端存储技术etcd的改变而改变。

b,作为kubernetes系统的入口,封装了核心对象的增删改查操作,以RESTFul接口方式提供给外部客户和内部组件调用。对相关的资源数据“全量查询”+“变化监听”,实时完成相关的业务功能

(2).Kubernetes Scheduler

为新建立的Pod进行节点(node)选择(即分配机器),负责集群的资源调度。组件抽离,可以方便替换成其他调度器。

a,Scheduler收集和分析当前Kubernetes集群中所有Minion/Node节点的资源(内存、CPU)负载情况,然后依此分发新建的Pod到Kubernetes集群中可用的节点。

b,实时监测Kubernetes集群中未分发和已分发的所有运行的Pod。

c,Scheduler也监测Minion/Node节点信息,由于会频繁查找Minion/Node节点,Scheduler会缓存一份最新的信息在本地。

d,Scheduler在分发Pod到指定的Minion/Node节点后,会把Pod相关的信息Binding写回API Server。

(3).Kubernetes Controller

负责执行各种控制器,目前已经提供了很多控制器来保证Kubernetes的正常运行。

- Replication Controller

管理维护Replication Controller,关联Replication Controller和Pod,保证Replication Controller定义的副本数量与实际运行Pod数量一致。

- Node Controller

管理维护Node,定期检查Node的健康状态,标识出(失效|未失效)的Node节点。

- Namespace Controller

管理维护Namespace,定期清理无效的Namespace,包括Namesapce下的API对象,比如Pod、Service等。

- Service Controller

管理维护Service,提供负载以及服务代理。

- EndPoints Controller

管理维护Endpoints,关联Service和Pod,创建Endpoints为Service的后端,当Pod发生变化时,实时更新Endpoints。

- Service Account Controller

管理维护Service Account,为每个Namespace创建默认的Service Account,同时为Service Account创建Service Account Secret。

- Persistent Volume Controller

管理维护Persistent Volume和Persistent Volume Claim,为新的Persistent Volume Claim分配Persistent Volume进行绑定,为释放的Persistent Volume执行清理回收。

- Daemon Set Controller

管理维护Daemon Set,负责创建Daemon Pod,保证指定的Node上正常的运行Daemon Pod。

- Deployment Controller

管理维护Deployment,关联Deployment和Replication Controller,保证运行指定数量的Pod。当Deployment更新时,控制实现Replication Controller和 Pod的更新。

- Job Controller

管理维护Job,为Jod创建一次性任务Pod,保证完成Job指定完成的任务数目

- Pod Autoscaler Controller

实现Pod的自动伸缩,定时获取监控数据,进行策略匹配,当满足条件时执行Pod的伸缩动作。

2,Kubernetes Node运行节点,运行管理业务容器,包含如下组件:

(1).Kubelet

负责管控容器,Kubelet会从Kubernetes API Server接收Pod的创建请求,启动和停止容器,监控容器运行状态并汇报给Kubernetes API Server。

(2).Kubernetes Proxy

负责为Pod创建代理服务,Kubernetes Proxy会从Kubernetes API Server获取所有的Service信息,并根据Service的信息创建代理服务,实现Service到Pod的请求路由和转发,从而实现Kubernetes层级的虚拟转发网络。该模块实现了Kubernetes中的服务发现和反向代理功能。

反向代理方面:kube-proxy支持TCP和UDP连接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端pod。           服务发现方面:  kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响。另外kube-proxy还支持session affinity。

(3).Docker

Node上需要运行容器服务。

3,master和node之外的组件:    (1) etcd。一个高可用的K/V键值对存储和服务发现系统,etcd的功能是给flannel 提供数据存储,可以单机部署或者集群部署。

(2)flannel。 这里并不一定非要是flannel,也可以是其他。本博客的所有node上都是以flannel为主流来进行部署。所有node节点上的docker启动的时候需要flannel分发IP地址,而flannel 就会去请求etcd中的配置,各个node分配不同的IP网段,类似于咱路由器DHCP 的功能,这样就有效的避免了IP地址的冲突,同时flannel 对docker容器的数据包进行转发到另一个node节点上,flannel服务这样就实现了整个K8S集群中docker容器网络互通问题。

参考文章:

k8s入门系列之介绍篇:http://www.cnblogs.com/xkops/p/6165565.html

kubernetes 概念:https://www.cnyunwei.cc/archives/1494

Kubernetes学习-基础架构 : https://www.cnblogs.com/guyeshanrenshiwoshifu/p/9041300.html

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐