当前位置: 首页 > 科技观察

运维必看:Kubernetes平台架构解读_0

时间:2023-03-22 00:03:39 科技观察

Kubernetes是一个开源的容器编排平台,管理大规模分布式容器化软件应用,是云计算发展演进的一次彻底革命性突破。Kubernetes是Google的第三代容器管理系统,它结合了Borg独特的控制器和Omega的灵活调度器。Kubernetes中的应用程序被打包成与环境完全分离的容器镜像,自动配置应用程序并维护跟踪资源分配。Kubernetes是一种以应用为中心的技术架构和思想,向下屏蔽基础设施差异,实现底层基础资源的统一调度和编排;通过容器镜像向上标准化应用,实现应用负载的自动化部署;中间通过Kubernetes的通用编排能力、OpenAPI和自定义CRD扩展能力,打造云原生操作系统能力,形成云计算的新接口;帮助研发团队快速构建标准化、高弹性、高可靠、松耦合、易管理维护的应用系统,提高交付效率,降低运维复杂度。Kubernetes在技术架构上具备三大能力:敏捷的弹性伸缩能力:不同于虚拟机的分钟级弹性伸缩响应,容器应用可以实现秒级甚至毫秒级的弹性伸缩响应;智能服务故障自愈能力:容器应用具有强大的自愈能力,可以实现应用故障的自动清除和重建;大规模复制分发能力:容器应用标准化交付产品,可实现跨平台、跨地域、云端一体化的大规模复制分发部署能力。1.Kubernetes整体架构Kubernetes是典型的主从分布式架构,由集中管理节点(MasterNode)、分布式工作节点(WorkerNode)和辅助工具组成。1.集中管理节点集中管理节点用于对集群进行调度和管理。它有四个核心组件:APIServer:承担集群的网关,实现统一认证和认证对外服务,同时管理Node/Pod资源代理通道;Scheduler:资源调度器,除了Kubernetes默认调度器外,还支持自定义调度器;ETCD:集群状态统一存储,类似Zookeeper的key-value存储;ControllerManger:控制管理器,实现自愈、扩容、应用生命周期管理、服务发现、路由、服务绑定等能力;Kubernetes默认提供了ReplicationController、NodeController、NamespaceController、ServiceController、EndpointsController、PersistentController、DaemonSetController等控制器。2.分布式工作节点分布式工作节点,工作节点运行业务应用容器;默认情况下,它们会运行三个核心组件:Kubelet:与管理节点通信并触发命令执行,管理和驱动网络、存储和容器运行时;KubeletProxy:通过DNS实现服务发现,使用iptables规则引导访问服务IP,重定向到正确的后端应用,实现高可用的负载均衡能力;ContainerRuntime:容器运行时。为了扩展Kubernetes平台的适应性,规范整个生态系统,使用CNI和CSI标准来规范网络和存储扩展;CRI和OCI标准用于规范容器镜像和容器运行时扩展;目前CRI支持的容器运行时包括docker、rkt、cri-o、frankti、kata-containers和clear-containers等。3.辅助工具辅助工具主要辅助集群管理和网络扩展:kubectl通过APIServer交互实现集群管理的命令行工具;Dashboard是Kubernetes的web用户管理监控界面;CoreDNS是一个可扩展的DNS服务器,实现集群服务发现能力。二、Kubernetes核心概念1、POD容器组,Kubernetes的最小调度单位Pod是Kubernetes的最小调度和资源分配单位。Pod彼此隔离。通常,一个Pod只推荐运行一个容器。当一些容器之间的关系非常紧耦合时,可以在同一个Pod中运行多个容器,方便一起调度和管理。Pod是应用程序的运行实例。通过同时运行多个Pod,可以实现应用的横向扩展。Pod本身没有自恢复能力。当调度或运行失败时,需要触发管理节点的Controller,实现Pod重启、重构或免配置迁移等操作。从Pod启动流程来看,Pod容器主要由PauseContainer、InitContainer和AppContainer三类容器组成:PauseContainer:也叫InfraContainer,Pod通过Pod实现多个Pod容器的网络共享PauseContainer,PauseContainer首先启动并将Pod的唯一IP地址与各种网络资源绑定,其他容器可以通过加入PauseContainer的Ne??twork命名空间实现网络共享。暂停是用C语言实现的。图片很小,只有700KB左右,而且一直处于Pause(暂停)状态;官方镜像是gcr.io/google_containers/pause-amd64:3.0,也支持自定义。InitContainer:一个Pod中可以自定义一个或多个InitContainer,它们依次启动。在应用容器之前,启动并执行一些辅助任务,例如执行脚本、复制文件到共享目录、收集日志和监控应用程序。辅助功能与主业务容器解耦,实现独立发布和能力复用。除了不支持ReadinessProbe外,其他特性与普通容器一致。AppContainer:Pod实际承接业务的容器。一般来说,它会独立运行。如果有微服务治理等需求,会和SidecarContainer一起运行。InitContainer启动后,AppContainer会并行启动,但需要等待所有AppContainer都处于就绪状态,才认为整个Pod成功。从POD资源隔离的角度来看,Pod容器主要是通过Linux提供的Namespace和Cgroup能力来实现的。Namespace实现进程隔离,Cgroup实现进程资源控制;其中Namespace由ipc、uts、net、mnt、pid等各种资源空间联合组成。CRI由Kubernetesv1.5引入,将Kubelet与容器运行时解耦;CRI定义了容器和镜像的服务接口,因为容器运行时和镜像的生命周期是相互隔离的,所以定义了RuntimeService和ImageService两个服务,其中RuntimeService主要包括Sandbox的管理gRPC接口和容器。Sandbox就是上面Pod启动过程中提到的Pause容器。目前支持CRI的后端有cri-o、cri-containerd、rkt、frakti、docker等。cri-o是由redhat发起的开源社区驱动的container-runtime。它是轻量级的,专为kubernetes而设计。它是取代docker作为kubernetes集群的容器运行时。2、Volume存储卷,Kubernetes复杂的存储架构非常重要和关键,也是一个生态和技术相对复杂的领域。linux和window两大生态支持的文件系统多达20+。Kubernetes存储架构设计一直在不断演进和完善。为了尽可能兼容各种存储平台,Kubernetes默认使用in-treeplugin连接多种不同类型的存储系统;它还支持树外插件来实现自定义存储服务。对于Kubernetes存储,主要有三个应用场景:基础应用配置文件读取、密码密钥管理;应用程序存储状态、数据访问以及不同应用程序之间的数据共享。Kubernetes目前支持的VolumePlugins如下:EmptyDir:生命周期与Pod一致。当Pod被删除时,emptyDir中的数据会自动清空。目前emptyDir支持的类型包括内存、大页内存、Node节点上Pod所在的文件系统。ConfigMap:主要负责配置中心,用于存放应用的配置数据,如Springboot应用属性配置文件数据,但空间大小限制为1MB。Secret:作用类似于ConfigMap。用于存储应用程序的敏感数据,如数据密码、token、证书等,可与ConfigMap配合使用,空间大小也限制在1MB以内。HostPath:将Node节点本地文件系统路径映射到pod容器。与emptyDir不同的是,删除Pod后,根据用户的配置,Kubernetes的HostPath中的数据可能不会被清除。In-tree网络存储:网络存储跟随pod的生命周期,通过存储插件连接不同类型的存储。尽管FlexVolume允许自定义开发驱动程序将卷挂载到集群Node节点以供Pod使用,但生命周期与Pod同步。PersistentVolumeClaim网络存储:具有独立的生命周期,可以通过storageout-tree插件连接不同类型的存储。目前支持的存储插件类型有FlexVolume和CSI。引入PV、PVC、StorageClass后,资源管控更加灵活,团队职责更加明确。研发人员只需考虑存储需求(IO、容量、访问方式等),无需关注底层存储细节;复杂的底层细节由专业的集群管理由存储管理员处理。CSI在Kubernetes1.9版本引入,建立了一套标准的存储管理接口,为容器提供存储服务。这样,Kubernetes平台就和存储服务驱动完全解耦了。CSI主要包括两部分:CSIControllerServer和CSINodeServer。ControllerServer主要实现创建、删除、挂载、卸载等控制功能;NodeServer主要实现对Node节点的挂载和卸载操作。CSIControllerServer和ExternalCSISideCar通过UnixSocket进行通信,CSINodeServer和Kubelet也通过UnixSocket进行通信。CSI实现类也越来越完善。例如ExpandCSIVolumes可以实现文件系统的扩展;VolumeSnapshotDataSource可以实现数据卷的快照;VolumePVCDataSource实现自定义PVC数据源;CSIInlineVolume在Volume中定义了一些CSI驱动程序。阿里云也开源了阿里云盘、NAS、CPFS、OSS、LVM等CSI存储插件。3、Ingress和Service,百花齐放的Kubernetes网络Kubernetes容器网络非常复杂,涉及到很多概念,比如Pod网络、Service网络、ClusterIP、NodePort、LoadBalancer和Ingress等。为此,Kubernetesnetwork是指TCP/IP协议栈抽象为四层:第0层:Node节点网络比较简单,是保证Kubernetes节点(物理机或虚拟机)之间正常的IP寻址和互通,一般由底层(公共云或数据中心)网络基础设施支持。Layer1:Pod是Kubernetes的最小调度单元。Pod网络是为了保证Kubernetes集群中的所有Pod(包括同一节点和不同节点上的Pod)在逻辑上处于同一平面网络中,并且可以通过IP寻址网络相互通信。它是容器网络中最复杂的部分。通过各种容器网络插件,通过CNI标准化和开放的网络定制能力,满足不同的网络需求。Layer3:虽然单个Pod有IP,但是与Pod的生命周期是一致的。为了解决一组相同Pod的统一稳定的访问地址,均衡的将请求分发给后端的Pod应用服务。Kubernetes引入了Servicenetwork来实现ServiceDiscovery和LoadBalancing能力。底层通过Kube-Proxy+iptables转发实现,不侵入应用,不穿透代理,没有额外的性能损失。第4层:KubernetesService网络是集群的内部网络,无法从集群外部访问。它需要将内部服务暴露给外部访问。Kubernetes通过NodePort、LoadBalancer、Ingress构建外网访问能力。CNI最初是由CoreOS发起的容器网络规范,是Kubernetes网络插件的基础。ContainerRuntime在创建容器时,首先创建一个网络命名空间,然后调用CNI插件为网络命名空间配置网络,最后启动容器中的进程。CNI插件包括CNIPlugin和IPAMPlugin两部分:CNIPlugin:负责配置和管理容器网络,包括两个基本接口:Networkconfiguration:AddNetwork(netNetworkConfig,rtRuntimeConf)(types.Result,error)Cleaningupthenetwork:DelNetwork(netNetworkConfig,rtRuntimeConf)errorIPAMPlugin:负责容器IP地址分配,包括host-local和dhcp。容器网络技术也在不断演进。社区中有很多开源的网络组件,如Flannel、Calico、Cilium、OVN等,每个组件都有自己的优势和适应场景,很难形成统一的组件和解决方案。4、Workload,Kubernetes以应用为中心的理念Kubernetes通过工作负载Workload来实现应用的管理、部署和发布,贯彻了Kubernetes以应用为中心的理念。Kubernetes支持多种类型的工作负载,包括Deployment、StatefulSet、ReplicaSet、Job、CronJob和DaemonSet,以满足不同场景的需求。Deployment和ReplicaSet:替换原来的ReplicationController对象,管理和部署无状态应用,Deployment管理不同版本的ReplicaSet,ReplicaSet管理同版本的Pod,通过Deployment调整ReplicaSet的最终副本数。controller会保持Pod的实际运行数量和预期数量一致,Pod出现故障时会自动重启或恢复。StatefulSet:管理有状态应用的部署,创建的Pod有一个按照规范创建的持久化标识符。pod迁移或销毁重启后,identifier仍会保留。例如,每个Pod都有一个序号,可以根据序号创建、更新或删除;Pod有唯一的网络标识(主机名)或独享存储PV,支持灰度发布等。DaemonSet:管理部署运行在各个节点上的守护任务,如监控,日志收集等。新加入的节点也在运行,并且需要删除删除的节点。也可以通过指定标签来运行节点。Job和Cronjob:Job是一次性任务,可以创建一个或多个pod,并监控pod是否成功运行或终止;根据pod的状态设置重复次数、并发、重启策略。Cronjob是一个定时调度的作业,可以指定运行时间、等待时间、是否并行运行、运行次数限制。在Kubernetes生态系统中,有一些第三方工作负载提供额外的操作。同时也可以使用CRD自定义工作负载,有DevicePlugin驱动的硬件工作负载。5.Controller控制器,Kubernetes集控管理中心ControllerManager,作为Kubernetes集控管理中心,负责集群的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账户(ServiceAccount)、资源配额(ResourceQuota)),并通过APIServer接口实时监控集群中各个资源对象的状态。一旦故障导致系统状态发生变化,它会立即尝试将其恢复到“期望的状态”。ReplicationController:保证集群中某个RC关联的Pod副本数始终保持预设值。ResourceQuotaController:保证Kubernetes中的资源对象在任何时候都不会过度占用系统物理资源。容器、Pod和Namespace分为三个层次。NamespaceController:定时通过APIServer读取Namespace信息。如果Namespace被API标记为优雅删除(即设置了删除周期,DeletionTimestamp),则Namespace状态设置为“Terminating”并保存在etcd中。同时删除Namespace下的ServiceAccount、RC、Pod等资源对象。EndpointController:Endpoints是Service所有Pod副本的访问地址。EndpointController主要负责监听Service和对应的Pod副本的变化,从而生成和维护Endpoints对象控制器。DeploymentController:Deployment控制ReplicaSet,ReplicaSet控制Pod,最终由DeploymentController驱动达到想要的状态。DeploymentController会监控DeploymentInformer、ReplicaSetInformer、PodInformer这三个资源。此外,在Kubernetesv1.6中引入了CloudControllerManager(CCM),提供对接阿里巴巴公有云基础产品的支持。3.总结综上所述,Kubernetes不仅本身是一个强大的容器编排系统,而且还推动了一个庞大的工具和服务生态系统。云原生时代的操作系统为云计算形成了新的界面。在设计理念上,Kubernetes基于以应用为中心的建设理念,向下屏蔽基础设施差异,实现底层基础资源的统一调度和编排;通过容器镜像向上标准化应用,实现应用负载的自动化部署;中间通过Kubernetes通用编排能力,开放API,自定义CRD扩展能力;在技??术架构上,Kubernetes是典型的分布式主从架构,由Master控制节点和可水平扩展的Worker节点组成。Master实现集中控制和管理,Workers实现分布式,这与Openstack的架构和基于SpringCloud开发的微服务业务应用没有太大区别。在设计模式上,Kubernetes定义了大量模型(原语、资源对象、配置、常用CRD),通过配置管理模型实现集群资源控制;虽然模型复杂复杂,但可以分层(核心层、隔离和Service接入层、调度层、资源层)逐层理解。在平台扩展方面,Kubernetes是一个开放的、可扩展的平台。它不仅有开发的API、开放标准(CNI、CSI、CRI等)和CRD,它不仅是一个纯运行时平台,更是一个运维的开发平台。