简述Kubernetes中什么是静态Pod?

《Kubernetes技术分享PPT课件》由会员分享,可在线阅读,更多相关《Kubernetes技术分享PPT课件(49页珍藏版)》请在人人文库网上搜索。

1、Kubernetes技术分享,架构简介 集群搭建 常用命令 应用实例,Kubernetes简介,Kubernetes是谷歌严格保密十几年的秘密武器Borg的一个开源版本,是一个全新的基于容器技术的分布式架构领先方案。 Borg是谷歌内部使用的大规模集群管理系统,基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率的最大化; K8s是第一个将”一切以服务为中心,一切围绕服务运转”作为指导思想的创新型产品 K8s是Go语言开发,是Docker的上层架构,就好像Java与J2EE的关系一样 K8s是一个开放的开发平台,不局限于任何语言,Kubernetes主要功能,k8s能方便地

2、管理跨机器运行容器化的应用 提供应用部署、维护、扩展机制 集群管理、安全防护、准入机制、多应用支撑、服务注册、服务发现、智能负载均衡、故障发现、自我修复、服务滚动升级、在线扩容、资源配额管理 使用Docker对应用程序包装、实例化、运行 以集群的方式运行、管理跨机器的容器 解决Docker跨机器容器之间的通讯问题 k8s的自我修复机制使得容器集群总是运行在用户期望的状态,为什么使用Kubernetes?,K8s不仅仅支持Docker,还支持Rocket,这是另一种容器技术。 全面拥抱微服务架构 使用k8s我们系统可以随时的整体迁移 k8s系统具备了超强的横向扩容能力 k8s提供完善的管理工具,

3、涵盖了包括开发、部署测试、运维监控在内的各个环节,K8s集群,K8s架构,K8s体系结构,Master,集群控制管理节点,所有的命令都经由master处理 负责整个集群的管理和控制,基本上Kubernetes所有的控制命令都是发给它,它来负责具体的执行过程,我们后面所有执行的命令基本都是在Master节点上运行的 Kubernetes API

5、er 和 Doozer,提供了与ZooKeeper相似的功能,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。Raft是一个新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性。Google的容器集群管理系统Kubernetes、开源PaaS平台Cloud Foundry和CoreOS的Fleet都广泛使用了etcd。在分布式系统中,如何管理节点间的状态一直是一个难题,etcd像是专门为集群环境的服务发现和注册而设计,它提供了数据TTL失效、数据改变监视、多值、目录监听、分布式锁原子操作等功能,可以方便的跟踪并管理集群节点的状态,etcd,简单

6、: 支持curl方式的用户API(HTTP+JSON) 安全: 可选的SSL客户端证书认证 快速: 单实例每秒 1000 次读写能力 可靠: 使用Raft保证强一致性 Etcd的应用场景包括服务发现(Service Discovery)、消息发布与订阅、负载均衡、分布式通知与协调、分布式锁、分布式队列。如果你熟悉ZooKeeper,你会发现etcd实现了ZooKeeper的功能,Node,除了Master,Kubernetes集群中的其他机器被称为Node节点, 早期版本也称为Minion节点 Node节点才是Kubernetes集群中的工作负载节点,每个Node都会被Master分配一些工作

7、负载(Docker容器),当某个Node宕机,其上的工作负载会被Master自动转移到其他节点上去 kubelet,负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。一旦Node被纳入集群管理范围,kubelet进程就会向Master汇报自身的情报,这样Master可以获知每个Node的资源使用情况,并实现高效均衡的资源调度策略。而某个Node超过指定时间不上报信息,会被Master判定为“失联”,Node状态被标记为不可用(Not

8、Service的通信与负载均衡机制的重要组件; Docker Engine(docker),Docker引擎,负责本机的容器创建和管理工作;,Node,Pod是最小部署单元,一个Pod由一个或多个容器组成,Pod中容器共享存储和网络,在同一台Docker主机上运行。 同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信 每个Pod都有一个特殊的被称为“根容器”的Pause容器,还包含一个或多个紧密相关的用户业务容器; 一个Pod里的容器与另外主机上的Pod容器能够直接通信; 如果Pod所在的Node宕机,会将这个Node上的所有Pod重新调度到其他节点上; 普通Pod

9、及静态Pod,前者存放在etcd中,后者存放在具体Node上的一个具体文件中,并且只能在此Node上启动运行; Docker Volume对应Kubernetes中的Pod Volume; 每个Pod可以设置限额的计算机资源有CPU和Memory; Requests,资源的最小申请量; Limits,资源最大允许使用的量;,Pod,Pod,Pod、容器与Node关系,Endpoint(IP+Port)标识服务进程的访问点 Event是一个事件记录,记录了事件最早产生的时间、最后重复时间、重复次数、发起者、类型,以及导致此事件的原因等信息。Event通常关联到具体资源对象上,式排查故障的重要参考

10、信息;,Endpoint、Event,Service,Service一个应用服务抽象,定义了Pod逻辑集合和访问这个Pod集合的策略。 Service代理Pod集合对外表现是为一个访问入口,分配一个集群IP地址,来自这个IP的请求将负载均衡转发后端Pod中的容器。 Service通过LableSelector选择一组Pod提供服务。 在K8s集群中微服务的负载均衡是由Kube-proxy实现的,在K8s的每个节点上都有一个 Service其实就是我们经常提起的微服务架构中的一个“微服务”,kubernetes中的核心。通过分析、识别并建模系统中的所有服务为微服务Kubernetes Servi

11、ce,最终我们的系统由多个提供不同业务能力而又彼此独立的微服务单元所组成,服务之间通过TCP/IP进行通信,从而形成了我们强大而又灵活的弹性网络,拥有了强大的分布式能力、弹性扩展能力、容错能力,Service,Service,Service,如上图示,每个Pod都提供了一个独立的Endpoint(Pod IP+ContainerPort)以被客户端访问,多个Pod副本组成了一个集群来提供服务,一般的做法是部署一个负载均衡器来访问它们,为这组Pod开启一个对外的服务端口如8000,并且将这些Pod的Endpoint列表加入8000端口的转发列表中,客户端可以通过负载均衡器的对外IP地址+服务端口

12、来访问此服务。运行在Node上的kube-proxy其实就是一个智能的软件负载均衡器,它负责把对Service的请求转发到后端的某个Pod实例上,并且在内部实现服务的负载均衡与会话保持机制。Service不是共用一个负载均衡器的IP地址,而是每个Servcie分配一个全局唯一的虚拟IP地址,这个虚拟IP被称为Cluster IP。,Service,Node IP Node节点的IP地址,是Kubernetes集群中每个节点的物理网卡的IP地址,是真是存在的物理网络,所有属于这个网络的服务器之间都能通过这个网络直接通信; Pod IP Pod的IP地址,是Docker Engine根据docke

13、r0网桥的IP地址段进行分配的,通常是一个虚拟的二层网络,位于不同Node上的Pod能够彼此通信,需要通过Pod IP所在的虚拟二层网络进行通信,而真实的TCP流量则是通过Node IP所在的物理网卡流出的; Cluster IP Service的IP地址。特性如下: 仅仅作用于Kubernetes Servcie这个对象,并由Kubernetes管理和分配IP地址; 无法被Ping,因为没有一个“实体网络对象”来响应;只能结合Service Port组成一个具体的通信端口; Node IP网、Pod IP网域Cluster IP网之间的通信,采用的是Kubernetes自己设计的一种编程方式

14、的特殊的路由规则,与IP路由有很大的不同;,Label,Label可以附加到各种资源对象上,一个资源对象可以定义任意数量的Label。给某个资源定义一个Label,相当于给他打一个标签,随后可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象。我们可以通过给指定的资源对象捆绑一个或多个Label来实现多维度的资源分组管理功能,以便于灵活、方便的进行资源分配、调度、配置、部署等管理工作; Label Selector示例:select * from pod where pods name=XXX,env=YYY,支持操作符有=、!=、in、not in;,部署

Set和Deployment来代替RC,两者相似度90%,相对于RC一个最大升级是我们随时指导当前Pod“部署”的进度。Deployment使用了Replica Set,除非需要自定义升级功能或根本不需要升级Pod,一般情况下,我们推荐使用Deployment而不直接使用Replica Set; 典型使用场景: 创建一个Deploymen

17、t对象来生成对应的Replica Set并完成Pod副本的创建过程; 检查更新Deployment的状态来查看部署动作是否完成(Pod副本的数量是否达到预期的值); 更新Deployment以创建新的Pod;(比如镜像升级) 如果当前Deployment不稳定,则回滚到一个早先的Deployment版本; 挂起或者恢复一个Deployment;,Deployment,意思是Pod横向自动扩容,目标是实现自动化、智能化扩容或缩容。 Pod负载度量指标: CPUUtilizationPercentage 通常使用一分钟内的平均值,可以通过Heapster扩展组件获取这个值。一个Pod自身的CPU利

应用程序自定义的度量指标,比如服务在每秒内的相应的请求书(TPS或QPS),Horizontal Pod Autoscaler(HPA),数据卷,是Pod中能够被多个容器访问的共享目录。定义在Pod之上,被一个Pod里的多个容器挂载到具体的文件目录之下;与Pod生命周期相同。 可以让一个Pod里的多个容

19、器共享文件、让容器的数据写到宿主机的磁盘上或者写文件到 共享存储中,Volume,命名空间将对象逻辑上分配到不同Namespace,可以是不同的项目、用户等区分管理,并设定控制策略,从而实现多租户。 命名空间也称为虚拟集群。,Namespace,Node、Pod、Replication

you!,Kubernetes简介,Kubernetes是谷歌严格保密十几年的秘密武器Borg的一个开源版本,是一个全新的基于容器技术的分布式架构领先方案。 Borg是谷歌内部使用的大规模集群管理系统,基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利

27、用率的最大化; K8s是第一个将”一切以服务为中心,一切围绕服务运转”作为指导思想的创新型产品 K8s是Go语言开发,是Docker的上层架构,就好像Java与J2EE的关系一样 K8s是一个开放的开发平台,不局限于任何语言,K8s架构,K8s架构,Endpoint(IP+Port)标识服务进程的访问点 Event是一个事件记录,记录了事件最早产生的时间、最后重复时间、重复次数、发起者、类型,以及导致此事件的原因等信息。Event通常关联到具体资源对象上,式排查故障的重要参考信息;,Endpoint、Event,Service,Service,Node IP Node节点的IP地址,是Kube

28、rnetes集群中每个节点的物理网卡的IP地址,是真是存在的物理网络,所有属于这个网络的服务器之间都能通过这个网络直接通信; Pod IP Pod的IP地址,是Docker Engine根据docker0网桥的IP地址段进行分配的,通常是一个虚拟的二层网络,位于不同Node上的Pod能够彼此通信,需要通过Pod IP所在的虚拟二层网络进行通信,而真实的TCP流量则是通过Node

29、“实体网络对象”来响应;只能结合Service Port组成一个具体的通信端口; Node IP网、Pod IP网域Cluster IP网之间的通信,采用的是Kubernetes自己设计的一种编程方式的特殊的路由规则,与IP路由有很大的不同;,意思是Pod横向自动扩容,目标是实现自动化、智能化扩容或缩容。 Pod负载度量指标: CPUUtilizationPercentage 通常使用一分钟内的平均值,可以通过Heapster扩展组件获取这个值。一个Pod自身的CPU利用率是该Pod当前CPU的使用量除以它的Pod Request的值。例如Pod Request定义值为0.4,当前Pod使用量为0.2,则它的CPU使用率为50%。但如果没有定义Pod Request值,则无法使用CPUUtilizationPercentage来实现Pod横向自动扩容的能力;

本发明涉及系统框架构造技术领域,具体为一种在kubernetes中pod设置静态ip的方法。

kubernetes是一个容器集群管理系统,它可以简化应用程序的工作流,加快开发速度,通过kubernetes技术,能够实现基于容器的应用部署、维护和滚动升级;负载均衡和服务发现;跨机器和跨地区的集群调度;自动伸缩;无状态服务和有状态服务;多种类型的volume支持;支持以声明式的配置文件,管理容器整个生命周期等功能,由于kubernetes管理容器的灵活性,需要对迁移到kubernetes集群上的服务进行改造,以便满足kubernetes集群中应用部署的规范,需要改造的内容包括:微服务化改造、服务发现、数据持久化、应用拆分为单体应用等。

由于kubernetes作为容器编排的底层服务,在其上需要部署种类繁多的服务,当大量的应用需要迁移到kubernetes集群之上时,如果按照原生的迁移规范进行改造,会导致改造成本大、改造影响范围广、维护平台要求高等问题,因此,基于原生的kubernetes使用方式存在缺陷,需要改进。

针对现有技术的不足,本发明提供了一种在kubernetes中pod设置静态ip的方法,解决了大量的应用需要迁移到kubernetes集群之上时,如果按照原生的迁移规范进行改造,会导致改造成本大、改造影响范围广、维护平台要求高的问题。

为实现以上目的,本发明通过以下技术方案予以实现:一种在kubernetes中pod设置静态ip的方法,具体包括以下步骤:

s1、首先基于kubernetes集群平台实现pod网络管理功能,需要实现创建容器网络、容器ip分配以及容器ip回收等工作流程时,如需通过网络管理平台创建容器网络时,首先通过客户端程序6向服务端1发起创建网络请求,服务端1通过接收到的请求信息,向kubernetes节点a3与节点b4上的docker服务发送创建网络资源指令,节点a3与节点b4接收到指令后,执行网络资源创建操作,并返回相关结果信息至服务端1,服务端1对接收到的结果进行判断,当创建网络成功时,将对应的网络配置数据存入到mysql集群5中,并将格式化后的结果呈现于应用服务器7界面上;

s2、如需要为部署应用创建的pod指定ip时,首先,用户通过应用服务器7部署应用,在部署应用时,通过服务端1获取到已经创建成功的容器网络列表,选择指定的容器网络名称,并为应用容器指定该网络中可用的ip地址,点击创建应用后,应用服务器7将分配给应用的网络映射配置写入到mysql集群5中,并向kubernetes的master节点2发起创建容器的请求,当master节点2接收到容器创建请求后,通过调度算法将pod调度到节点a3或节点b4之上,当节点a3或节点a4接收到master节点2下发的启动容器的指令后,调用网络插件,由网络插件向服务端1发起获取pod网络配置的请求,当服务端1接收到请求时,通过查询mysql集群5,获取到指定容器网络配置,并更新mysql中对应的ip记录,以标识该podip记录已被使用,同时将查询结果回传给网络插件,当网络插件接收到容器的网络配置后,通过linux的networknamespace技术,切换到容器的networknamespace中,为容器配置指定的网络配置,以实现固定podip的效果;

s3、如需要回收已分配给容器的ip记录时,通过应用服务器7调用master节点2的接口发送删除应用的请求,当master节点2接收到删除pod的请求后,向节点a3或节点b4下发删除指令,节点a3或节点b4调用网络插件用于回收容器ip地址,网络插件向服务端1发送清除网络配置的请求,当服务端1接收到清除网络的请求后,删除mysql集群5中的网络分配记录条目,并返回删除结果给网络插件,由此完成pod网络资源配置回收的操作。

优选的,所述步骤s1中,在kubernetes集群中为pod配置静态ip的系统由独立的服务端程序服务端1与cni插件程序组成,程序与服务端1使用restful接口进行通信。

优选的,所述步骤s2中,当在kubernetes中创建容器时,先为创建的应用分配指定的ip地址池,并且由服务端1将应用与ip地址的对应关系存入到数据库中。

优选的,所述步骤s2中,当kubelet服务启动该应用的容器时,执行插件为容器设置网络配置,会向服务端1发起请求,用于获取指定容器的网络配置。

优选的,所述步骤s2中,当获取到容器的网络配置后,通过linux系统的networknamespace机制,切换到容器的networknamespace中为容器配置指定的网络配置,并向kubelet返回配置容器网络的结果。

本发明提供了一种在kubernetes中pod设置静态ip的方法。与现有技术相比具备以下有益效果:

(1)、该在kubernetes中pod设置静态ip的方法,通过查询mysql集群5,获取到指定容器网络配置,并更新mysql中对应的ip记录,以标识该podip记录已被使用,同时将查询结果回传给网络插件,当网络插件接收到容器的网络配置后,通过linux的networknamespace技术,切换到容器的networknamespace中,为容器配置指定的网络配置,固定podip的使用方式,可以提高应用迁移到kubernetes集群的效率并降低维护成本,最大程度的兼容用户部署应用、运维应用的方式。

(2)、该在kubernetes中pod设置静态ip的方法,通过在kubernetes集群中为pod配置静态ip的系统由独立的服务端程序服务端1与cni插件程序组成,程序与服务端1使用restful接口进行通信,当在kubernetes中创建容器时,先为创建的应用分配指定的ip地址池,并且由服务端1将应用与ip地址的对应关系存入到数据库中,当kubelet服务启动该应用的容器时,执行插件为容器设置网络配置,会向服务端1发起请求,用于获取指定容器的网络配置,当获取到容器的网络配置后,通过linux系统的networknamespace机制,切换到容器的networknamespace中为容器配置指定的网络配置,并向kubelet返回配置容器网络的结果,当数据库中应用与ip地址池的配置没有变更时,对应应用启动的容器都可以获取到为其设置的网络配置,实现固定podip的效果。

(3)、该在kubernetes中pod设置静态ip的方法,通过应用服务器7调用master节点2的接口发送删除应用的请求,当master节点2接收到删除pod的请求后,向节点a3或节点b4下发删除指令,节点a3或节点b4调用网络插件用于回收容器ip地址,网络插件向服务端1发送清除网络配置的请求,当服务端1接收到清除网络的请求后,删除mysql集群5中的网络分配记录条目,并返回删除结果给网络插件,由此完成pod网络资源配置回收的操作,在实现固定pod的效果时,新增了对pod网络配置管理的功能,包括:网络创建、网络删除、ip地址分配、ip地址回收等。

图1为本发明系统框架结构的示意图。

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

请参阅图1,本发明实施例提供一种技术方案:一种在kubernetes中pod设置静态ip的方法,具体包括以下步骤:

s1、首先基于kubernetes集群平台实现pod网络管理功能,需要实现创建容器网络、容器ip分配以及容器ip回收等工作流程时,如需通过网络管理平台创建容器网络时,首先通过客户端程序6向服务端1发起创建网络请求,服务端1通过接收到的请求信息,向kubernetes节点a3与节点b4上的docker服务发送创建网络资源指令,节点a3与节点b4接收到指令后,执行网络资源创建操作,并返回相关结果信息至服务端1,服务端1对接收到的结果进行判断,当创建网络成功时,将对应的网络配置数据存入到mysql集群5中,并将格式化后的结果呈现于应用服务器7界面上;

s2、如需要为部署应用创建的pod指定ip时,首先,用户通过应用服务器7部署应用,在部署应用时,通过服务端1获取到已经创建成功的容器网络列表,选择指定的容器网络名称,并为应用容器指定该网络中可用的ip地址,点击创建应用后,应用服务器7将分配给应用的网络映射配置写入到mysql集群5中,并向kubernetes的master节点2发起创建容器的请求,当master节点2接收到容器创建请求后,通过调度算法将pod调度到节点a3或节点b4之上,当节点a3或节点a4接收到master节点2下发的启动容器的指令后,调用网络插件,由网络插件向服务端1发起获取pod网络配置的请求,当服务端1接收到请求时,通过查询mysql集群5,获取到指定容器网络配置,并更新mysql中对应的ip记录,以标识该podip记录已被使用,同时将查询结果回传给网络插件,当网络插件接收到容器的网络配置后,通过linux的networknamespace技术,切换到容器的networknamespace中,为容器配置指定的网络配置,以实现固定podip的效果;

s3、如需要回收已分配给容器的ip记录时,通过应用服务器7调用master节点2的接口发送删除应用的请求,当master节点2接收到删除pod的请求后,向节点a3或节点b4下发删除指令,节点a3或节点b4调用网络插件用于回收容器ip地址,网络插件向服务端1发送清除网络配置的请求,当服务端1接收到清除网络的请求后,删除mysql集群5中的网络分配记录条目,并返回删除结果给网络插件,由此完成pod网络资源配置回收的操作。

本发明中,步骤s1中,在kubernetes集群中为pod配置静态ip的系统由独立的服务端程序服务端1与cni插件程序组成,程序与服务端1使用restful接口进行通信。

本发明中,步骤s2中,当在kubernetes中创建容器时,先为创建的应用分配指定的ip地址池,并且由服务端1将应用与ip地址的对应关系存入到数据库中。

本发明中,步骤s2中,当kubelet服务启动该应用的容器时,执行插件为容器设置网络配置,会向服务端1发起请求,用于获取指定容器的网络配置。

本发明中,步骤s2中,当获取到容器的网络配置后,通过linux系统的networknamespace机制,切换到容器的networknamespace中为容器配置指定的网络配置,并向kubelet返回配置容器网络的结果。

同时本说明书中未作详细描述的内容均属于本领域技术人员公知的现有技术。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。

尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。

每个Pod都有一个特殊的被称为根容器的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器 。

为什么Kubernetes会设计出一个全新的Pod概念,并且有这样特殊的结构?

  • Pause容器作为Pod根容器,以它的状态代表整个容器组的状态
  • Kubernetes为每个Pod分配唯一的IP的地址,称之为Pod IP,一个Pod里的多个容器共享Pod IP。Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP的直接通讯,采用虚拟二层网络技术来实现,一个Pod里的容器与另外主机上的Pod容器能够直接通信。

    普通Pode一旦被创建,就会被放入到etcd中存储,随后会被Kubernetes Master调度到某个具体的Node上并进行绑定(Binding),随后该Pod 被对应的Node上的kubelet进程实例化成一组相关的docker容器运行起来。 当Pod里的某个容器停止时,Kubernetes会自动检测到这个问题并且重新启动这个Pod (重启Pod里的所有容器),如果Pod所在的Node宕机,则会将这个Node上所有的Pod从新调度到其他节点上。

    Pod的IP加上这里的容器端口(container Port),就组成了一个全新的概念---Endpoint它代表着此Pod里的一个服务进程的对外通讯地址。一个Pod也存在着多个Endpoint的情况,比如我们把Tomcat定义为一个Pod时,可以对外暴露端口与服务端口这两个Endpoint。

    Event是一个事件的记录,记录事件的最早生成时间、最后重现时间、重复次数、发起者、类型,以及导致此事件的原因等众多信息。Event通常会关联到某个具体的资源上,是排查故障的重要参考,Node描述信息包含了Event,而Pod同样有Event记录。
    当我们发现某个Pod迟迟无法创建时,我们就可以用kubectl describe pod [Pod名称]来查看,定位问题。


 

我要回帖

更多关于 简述设置静态工作点的必要性 的文章

 

随机推荐