Kubernetes是一个开源容器编排平台,管理大规模分布式容器化软件应用,是云计算发展演进的一次彻底革命性的突破。Kubernetes是谷歌的第三代容器管理系统,是Borg独特的控制器和Omega灵活的调度器的组合。Kubernetes中的应用被打包成与环境完全分离的容器镜像,并且自动配置应用并维护跟踪资源分配。
敏捷的弹性伸缩能力:不同于虚拟机分钟级的弹性伸缩响应,容器应用可实现秒级甚至毫秒级的弹性伸缩响应;
智能的服务故障自愈能力:容器应用具有极强的自愈能力,可实现应用故障的自动摘除与重构;
大规模的复制分发能力:容器应用标准化的交付制品,可实现跨平台、跨区域,云边一体规模化复制分发部署能力。
一、Kubernetes整体架构
1、集中式管理节点
API Server:承担集群的网关,实现统一认证鉴权对外服务,同时也是管理Node/Pod资源代理通道;
Scheduler:资源调度器,除了Kubernetes默认的调度器,也支持自定义调度器;
ETCD:集群状态统一存储,与Zookeeper类似的key-value存储;
Controller Manger:控制管理器实现自愈、扩容、应用生命周期管理、服务发现、路由、服务绑定等能力;Kubernetes默认提供Replication Controller、Node Controller、Namespace Controller、Service Controller、Endpoints Controller、Persistent Controller、DaemonSet Controller等控制器。
2、分布式的工作节点
Kubelet:与管理节点通信并触发指令执行,管理驱动网络,存储及容器运行时;
Kube Proxy:通过DNS实现服务发现,借助iptables规则引导访问至服务IP,并将重定向至正确的后端应用,实现高可用负载均衡能力;
Container Runtime:容器运行时。为了扩展Kubernetes平台适配能力,同时也标准化整个生态,通过CNI与CSI标准规范网络及存储的扩展;通过CRI与OCI标准规范容器镜像及容器运行时的扩展;目前CRI支持的容器运行时有docker、rkt、cri-o、frankti、kata-containers和clear-containers等。
3、辅助工具
kubectl通过API Server进行交互,实现集群管理的命令行工具;
Dashboard 是Kubernetes的web用户管理监控界面;
Core DNS是可扩展的DNS服务器,实现集群服务发现能力。
二、Kubernetes核心理念
1、POD容器组,Kubernetes小调度单元
Pause Container:又叫Infra Container,Pod通过Pause Container实现Pod多个容器网络共享,Pause Container先启动并绑定PodIP地址与各种网络资源,其他容器通过加入Pause Container的Network namespace来实现网络共享。Pause是C语言实现,镜像非常小只有700KB左右,并且永远处于Pause(暂停)状态;官方镜像是gcr.io/google_containers/pause-amd64:3.0,同时也支持自定义。
Init Container:Pod中可以自定义一个或者多个Init Container,按照顺序依次启动,在应用Container之前启动并执行一些辅助任务,比如执行脚本、拷贝文件到共享目录、日志收集、应用监控等。将辅助功能与主业务容器解耦,实现独立发布和能力重用。除了不支持Readiness Probe,其他与特性与普通容器保持一致。
App Container:Pod真正承接业务的Container,一般情况会独立运行,如果是有微服务治理等需求会搭配Sidecar Container一起运行。在Init Container启动完成之后,App Container会并行启动,但是需要等待所有App Container处于就绪状态,整个Pod才算启动成功。
2、Volume存储卷,Kubernetes复杂的存储架构
ConfigMap:主要是承担配置中心,用于存储应用的配置数据,比如Springboot应用properties配置文件数据,但是空间大小限制在1MB内。
Secret:功能与ConfigMap类似,用于存储应用的敏感数据,比如数据密码、token、证书等,可以与ConfigMap联合使用,同样空间大小限制在1MB内。
HostPath:将Node节点本地文件系统路径映射到pod容器中使用。与emptyDir不同之处就是Pod删除后,HostPath中的数据Kubernetes根据用户的配置,可以不被清除。
In-tree网络存储:网络存储跟随Pod的生命周期,通过存储插件对接不同类型存储;其中FlexVolume虽然允许自定义开发驱动来挂载卷到集群Node节点上供Pod使用,但生命周期与pod同步。
PersistentVolumeClaim网络存储:具有独立的生命周期,可以通过存储的out-tree插件对接不同类型存储。当前支持的存储插件类型有FlexVolume与CSI。
3、Ingress与Service,百花齐放的Kubernetes网络
CNI Plugin:负责配置管理容器网络,包括两个基本的接口:
网络配置: AddNetwork(net NetworkConfig, rt RuntimeConf) (*.Result, error)
清理网络: DelNetwork(net NetworkConfig, rt RuntimeConf) error
IPAM Plugin:负责容器IP地址分配,实现包括host-local和dhcp。
4、Workload工作负载,Kubernetes应用中心理念
Deployment与ReplicaSet:替换原来的 ReplicationController对象,管理部署无状态应用,Deployment管理不同版本的ReplicaSet,ReplicaSet管理相同版本的Pod,通过Deployment调整 ReplicaSet的终态副本数,控制器会维持实际运行的Pod数量与期望的数量一致,Pod 出故障时会自动重启或恢复。
StatefulSet:管理部署有状态应用,创建的Pod拥有根据规范创建的持久型标识符。Pod迁移或销毁重启后,标识符仍会保留。如每个Pod有序号,可以按序号创建更新或删除;Pod有网络标志(hostname)或独享的存储PV,支持灰度发布等。
DaemonSet:管理部署每个节点运行的守护任务,如监控、日志收集等。新加入的节点也运行,移出节点是需要删除。也可以通过标签的指定运行节点。
Job与Cronjob:Job是一次性任务,可创建一个或多个Pod,监控Pod是否成功运行或终止;根据Pod状态设置重复次数、并发度、重启策略。Cronjob是定时调度的Job,可以指定运行时间、等待时间、是否并行运行、运行次数限制。
5、Controller控制器,Kubernetes集控管理中心
Replication Controller:保证集群中一个RC所关联的Pod副本数始终保持预设值。
ResourceQuota Controller:确保Kubernetes中的资源对象在任何时候都不会超量占用系统物理资源。有容器,Pod以及Namespace三个级别。
Namespace Controller:通过API Server定时读取Namespace信息。如果Namespace被API标记为优雅删除(即设置删除期限,DeletionTimestamp),则将该Namespace状态设置为“Terminating”,并保存到etcd中。同时删除该Namespace下的ServiceAccount、RC、Pod等资源对象。
Endpoint Controller:Endpoints是Service对应所有Pod副本的访问地址,Endpoint Controller主要负责监听Service和对应的Pod副本的变化,从而生成和维护Endpoints对象控制器。
Deployment Controller:Deployment通过控制ReplicaSet,ReplicaSet再控制Pod,终由Deployment Controller驱动达到期望状态,Deployment Controller会监听 DeploymentInformer、ReplicaSetInformer、PodInformer 三种资源。
三、总结
作者丨巨子嘉
来源丨公众号:巨子嘉(ID:juzijia-club)