Kurbernetes是Google旗下的容器跨主机编排工具。
Kurbernetes可以自动化应用容器的部署、扩展和操作,提供以容器为中心的基础架构。
从生态圈的角度来看
从云应用角度来看
在生产环境中使用 Kubernetes 的主要优势在于它提供了在物理机或虚拟机集群上调度和运行容器的平台。
更宽泛地说,它能帮你在生产环境中实现可以依赖的基于容器的基础设施。
而且,由于 Kubernetes 本质上就是运维任务的自动化平台,你可以执行一些其它应用程序平台或管理系统支持的操作,只不过操作对象变成了容器。
1)强大的容器编排能力
作为容器编排管理平台,拥有强大的容器编排能力。
Kubernetes 与 Docker 共同发展并且深度集成了 Docker,因此适应容器的特点,比如容器组合、标签选择和服务发现等,可以满足企业级的需求,具体表现如下:
2)轻量级
轻量级,对微服务架构有很好的支撑。
微服务架构的核心是将一个巨大的单体应用分解为很多小的互相连接的微服务,一个微服务可能由多个实例副本支撑,副本的数量可以随着系统的负荷变化进行调整。
整个系统划分出各个功能独立的组件,组件之间边界清晰、部署简单,以及很多功能实现了插件化,可以非常方便地进行扩展和替换:
3)便携性
无论公有云、私有云、混合云还是多云架构都全面支持,可以随时随地地将系统整体进行“搬迁”。
Kubernetes 架构方案中屏蔽了底层网络的细节,基于服务的虚拟 IP 地址的设计方式让架构和底层硬件无关,无需改变配置文件就可以将系统从物理机迁移到公有云上,并且谷歌云(GCE)、华为云(CCE)、阿里云(ACK)和腾讯云(TKE)都支持 Kubernetes 集群。
Kubernetes 采用主从分布式架构,节点在角色上分为 Maste 和 Node。
Kubernetes Master
是控制节点,负责k8s集群的调度、管理等运维工作,组件有apiserver、controller-manager、scheduler、etcd。
Kubernetes Node
是运行节点,负责运行工作负载,即容器应用,组件有kubelet、kuber-proxy、容器引擎/容器运行时(docker、containerd)等。
所有服务请求的统一访问入口
提供认证、授权、访问控制、API 注册和发现等机制,其中封装了核心对象的增删改查操作。
外部的客户端和内部的组件可以通过调用 REST API 接口的方式获取数据信息,这些数据信息都存储到了 Etcd 中。
负责执行各种控制器。
功能
1)作为控制管理器,负责管理K8s各种资源对象的控制器;
2)通过apiserver监控整个K8s集群资源的状态,并确保集群始终处于预期的工作状态。
常用控制器
控制器 | 名称 | 作用 | 补充说明 |
---|---|---|---|
Node Controller | 节点控制器 | 负责在节点出现故障时发现和响应 | 定期检查 Node 的健康状态,标识出失效的 Node |
Replication Controller | 副本控制器 | 保证Replication Controller 定义的副本数量与实际运行 Pod 的数量一致 | 可以理解成确保集群中有且仅有N个Pod实例,N是RC中定义的Pod副本数量 |
Endpoints Controller | 端点控制器 | 填充端点对象(即连接Services和Pods),负责监听Service和对应的Pod副本的变化 | 端点是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道它的endpoint |
Service Account & Token Controllers | 服务账户和令牌控制器 | 为新的命名空间创建默认账户和API访问令 | |
ResourceQuota Controller | 资源配额控制器 | 确保指定的资源对象在任何时候都不会超量占用系统物理资源 | |
Namespace Controller | 命名空间控制器 | 管理namespace的声明周期 | 定期清理无效的 Namespace,以及 Namespace 下的 API 对象,比如:Pod、Service、Secrte 等 |
Service Controller | 服务控制器 | 属于K8S集群与外部的云平台之间的一个接口控制器 |
功能
可视为资源调度器,负责集群中的Pod资源调度,通过调度算法(预选策略和优选策略)为要部署的Pod选择最适合的Node节点。
调度过程
预选策略(predicate)和 优选策略(priorities)
首先是过滤掉不满足条件的节点,这个过程称为预选(predicate) ;
然后对通过的节点按照优先级排序,这个是优选(priority) ;
最后从中选择优先级最高的节点。
如果中间任何一步骤有错误,就直接返回错误。
可以看作K8s集群的数据库,是一种键值对存储结构的分布式数据库,负责存储K8s集群的所有重要信息,只有apiserver有读写权限。
Etcd 是高可用的键值存储系统,通过 Raft 一致性算法处理日志复制来保证强一致性。
Kubernetes 中的重要数据都持久化到 Etcd 中,所有架构中的各个组件都是无状态的。
1)接收master的apiserver发来的请求,创建和管理Pod与容器,和容器引擎交换来实现容器的生命周期的管理 ;
2)收集node节点的资源信息和Pod的运行状态发送给apiserver。
作为service资源的载体,实现对Pod的网络代理,负责维护Pod集群的网络规则和四层负载均衡工作。
用于运行容器。
Kubernetes Container Runtime
,容器运行时,Node 是使用容器运行的节点,可以使用多种容器。
CoreDNS
:为整个集群提供 DNS 服务。Ingress Controller
:为服务提供外网入口。Dashboard
:提供 GUI(图形用户界面)。Federation
:提供跨可用区的集群。Fluentd
:日志收集。1)用户通过客户端发送创建Pod的请求给apiserver
;
2)Apiserver接收到请求后,会先把请求信息写入到etcd
中保存,再找controller-manager
根据请求信息中的资源预设模板创建Pod资源;
3)Controller-manager会通过apiserver找到scheduler
,来调度新创建的Pod资源;
4)Scheduler通过调度算法的预选策略及优选策略,筛选出最适合的Node节点进行调度;
5) 再通过apiserver找到对应的node节点上的Kubelet
去创建和管理Pod;
6)Kubelet会跟容器引擎交互来管理Pod和容器的生命周期;
7)用户还可以通过apiserver在kube-proxy
上写入iptables/ipvs网络规则,创建service资源,实现对Pod集群的网络代理。
Pod是K8s能够创建和管理的最小单位,一个Pod里可以包含一个或者多个容器应用,Pod里的容器之间共享网络、存储等资源。
一个 Pod 里可以运行多个容器,又叫边车模式(SideCar)。
而在生产环境中一般都是单个容器或者具有强关联互补的多个容器组成一个 Pod。
同一个 Pod 之间的容器可以通过 localhost 互相访问,并且可以挂载 Pod 内所有的数据卷;
但是不同的 Pod 之间的容器不能用 localhost 访问,也不能挂载其他 Pod 的数据卷。
Pod 控制器是 Pod 启动的一种模版,用来保证在K8S里启动的 Pod 应始终按照用户的预期运行(副本数、生命周期、健康状态检查等)。
Pod控制器 | 功能 |
---|---|
Deployment | 部署无状态应用,同时也负责管理replicaset(维持Pod副本数量符合预期数量)和Pod(容器化的应用进程) |
Statefulset | 部署有状态服务/应用 |
Daemonset | 在所有的node节点上部署同一类型的Pod |
Job | 一次性的部署短期任务的Pod(执行完任务后会自动退出的Pod) |
Cronjob | 周期性的部署短期任务的Pod(执行完任务后会自动退出的Pod) |
有状态和无状态服务的区别
从是否需要数据的实时存储和数据同步来区分。
有状态服务
1)有实时的数据需要存储;
2)集群服务中,把某一台服务器抽离出去,过一段时间再加入到集群中,如果服务集群无法正常工作(相互之间需要数据同步)。
无状态服务
1)没有实时的数据需要存储;
2)集群服务中,把某一台服务器抽离出去,过一段时间再加入到集群中,如果服务集群还是正常工作(相互之间不用数据同步)。
因为 Deployment 的 Pod 可能有多个,并且这些 Pod 所在的 Node 并不固定,因此无法使用固定的 IP 和端口去访问。
Kubernetes 使用 Service 来解决此问题,一个 Service 对应一个应用,代表该应用提供的服务。
在K8S集群内部,为通过标签选择器相关联的一组Pod提供一个统一的访问入口(clusterIP),只支持四层代理转发。
虚拟IP只在集群内部有效。
客户端通过cluster IP 来请求应用服务时,kube-proxy 会将请求转发给 Deployment 中的某个 Pod。
当 Pod 位置发生变化时,kube-proxy 能够及时感知到。
通过 kube-proxy 就解决了单个 Pod 服务的注册和发现问题,同时也实现了负载均衡。
作为K8S集群外部接入层,可自定义ingress规则根据用户请求的域名或URL请求路径转发给指定的service,支持七层代理转发。
#举个例子
客户端请求 http://www.xxx.com:port ---> Ingress ---> Service ---> Pod
apiVersion: group/version ## api资源属于的组和版本,同一个组可以有多个版本
kind: ## 标记创建的资源类型,
## k8s主要支持以下资源类别:Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob
metadata: ## 元数据
name: ## 对像名称
namespace: ## 对象所属命名空间
labels: ##指定资源标签,标签是一种键值数据
spec: ## 定义目标资源的期望状态
status ## 显示资源的当前状态,应该与spec 一致
资源对象在K8S中使用的api接口版本
资源对象的类型
资源对象的元数据信息,比如 name资源名称、annotation注释、namespace命名空间、label标签
标签,将一个键值对关联到某个资源对象,用于资源对象的分组查询和筛选。
有效的标签值必须为63个字符或更少,并且必须为空或以字母数字字符([a-z0-9A-Z])开头和结尾,中间可以包含横杠(-)、下划线(_)、点(.)和字母或数字。
标签选择器,用于查询和筛选拥有某个标签的资源对象。
标签选择器目前有两种:基于等值关系(等于、不等于)和基于集合关系(属于、不属于、存在)。
注释,用于作资源对象的注释信息或在一些特殊的资源对象里用于作额外的功能特性配置。
注释值没有字符长度限制。
资源名称,通常定义在 “资源” 的 “元数据” 信息里。
命名空间,在同一个命名空间中,同类型的资源对象的名称是唯一的
资源对象的资源配置清单(配置属性),比如 副本数、镜像、数据卷、标签选择器
资源对象的当前运行状态信息
cornflowerblue’>注释,用于作资源对象的注释信息或在一些特殊的资源对象里用于作额外的功能特性配置。
注释值没有字符长度限制。
资源名称,通常定义在 “资源” 的 “元数据” 信息里。
命名空间,在同一个命名空间中,同类型的资源对象的名称是唯一的
资源对象的资源配置清单(配置属性),比如 副本数、镜像、数据卷、标签选择器
资源对象的当前运行状态信息