当前位置: 首页 > Linux

K8s的认知与学习

时间:2023-04-06 03:20:06 Linux

K8s的基本概念将围绕以下七点展开:Docker的管理痛点什么是K8s?CloudArchitecture&CloudNativeK8sArchitecturePrinciplesK8sCoreComponentsK8sServiceRegistrationandDiscoveryKeyIssuesDockerManagementPainPoints如果要将Docker应用到庞大的业务实现中,存在编排、管理、调度困难的问题。因此,我们迫切需要一个管理系统来对Docker和容器进行更高级、更灵活的管理。Kubernetes应运而生!Kubernetes,源自希腊语的名词,意为“舵手”或“领航员”。谷歌在2014年开源了Kubernetes项目,该项目建立在谷歌数十年大规模运行生产工作负载的经验之上,并结合了社区的最佳想法和实践。K8s是Kubernetes的缩写,用8代替“ubernete”,下面我们就用这个缩写。什么是K8s?K8s是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,促进声明式配置和自动化。K8s拥有庞大且快速发展的生态系统。K8s的服务、支持和工具广泛可用。通过K8s,我们可以:快速部署应用,快速扩展应用,无缝对接新的应用功能,节省资源,优化硬件资源的使用。K8s具有以下特点:便携:支持公有云、私有云、混合云、多云多云。可扩展:模块化、插件式、可安装和可组合。自动化:自动部署、自动重启、自动复制、自动缩放/缩放。CloudArchitecture&CloudNative①cloud和K8s有什么关系?云是一组使用容器构建的服务集群网络。云是由许多容器组成的。K8s用于管理云端的容器。②常见的云架构类型几种常见的云架构类型如上图所示:On-Premises(本地部署)。IaaS(InfrastructureasaService):用户:租用(购买|分配权限)云主机,用户无需考虑网络、DNS、硬件环境问题;运营商:提供网络、存储、DNS,这类服务称为基础设施服务。PaaS(平台即服务-中间件):MySQL/ES/MQ/...SaaS(软件即服务-浏览器页面):钉钉、财务管理。Serverless:没有服务,不需要服务器。从用户的角度考虑问题,用户只需要使用云服务器即可。在云服务器所在的基础环境中,软件环境不需要用户关心。如果觉得难以理解,推荐阅读这篇文章:如何通俗地解释IaaS、PaaS、SaaS的区别:https://www.zhihu.com/question/21641778/answer/62523535是的可以预见,未来的服务发展将是Serverless,企业纷纷搭建自己的私有云环境,或者使用公有云环境。③CloudNative是一种让应用程序(项目、服务软件)运行在云端的解决方案。这样的解决方案被称为云原生。云原生具有以下特点:容器化,所有服务都必须部署在容器微服务中,Web服务架构服务架构CI/CDDevOpsK8s架构原理①K8s架构k8s架构解释:一般来说,K8s架构是一个Master对应一组节点节点。下面一一介绍K8s架构图中的Master和Node。Master节点结构如下:apiserver是K8s的网关,所有命令请求都要经过apiserver。Scheduler调度器使用调度算法将请求的资源调度到某个Node节点。Controller控制器,维护K8s资源对象。etcd:存储资源对象。Node节点结构如下:Kubelet存在于每个Node节点中,Node节点上的资源操作指令由Kubelet执行。kube-proxy代理服务,处理服务间的负载均衡。Pod是K8s管理的基本单元(最小单元)。Pod内部是一个容器。K8s不直接管理容器,而是管理Pod。Docker是运行容器的基础环境,即容器引擎。Fluentd日志收集服务。介绍完K8s架构之后,我们介绍了很多专业术语。别着急,先有整体概念,再逐一分解。请耐心阅读以下内容,相信你会有不一样的收获。K8s核心组件①K8s组件K8s用于管理容器,但不直接操作容器。最小的运行单元是Pod(间接管理容器):一个Master有一组Node节点与之对应。Master节点不存储容器,只负责调度、网络管理、控制器和资源对象存储。容器存储在Node节点上,容器存储在Pod内部)。Pod内可以有一个容器,也可以有多个容器。Kubelet负责维护本地Pod。Kube-proxy负责多个Pod之间的负载均衡和负载均衡。②什么是Pod?解释如下:Pod也是一个容器,它包含了Docker创建的容器。Pod用于封装容器的容器。Pod是一个虚拟化的组。Pod相当于一台独立的主机,可以封装一个或多个容器。Pod有自己的IP地址和主机名,相当于一个独立的沙盒环境。**③Pod是做什么用的?通常,当部署一个服务时,一个Pod用于管理一组相关的服务。Pod部署单个服务或一组相关服务。一组相关服务是指链式调用的调用环节上的服务。**④如何实现Web服务集群?**实现服务集群:只需要复制多个Pod的副本,这也是K8s管理的进阶点。如果K8s继续扩容,只需要控制Pod的数量即可。收缩的原理类似。**⑤Pod底层网络,数据存储是如何进行的?具体如下:在创建Pod的内部容器之前,必须先创建Pause容器。服务容器之间访问localhost相当于访问本地服务,性能非常高。⑥ReplicaSet副本控制器控制Pod副本“服务集群”的数量,它总是可以与设置的预期数量保持一致。当一个Pod服务宕机时,replicacontroller会立即重新创建一个新的Pod,始终保证设置的replicas数量。ReplicationController:LabelSelector-选择维护一组相关的服务(它自己的服务)ReplicationControllerReplicationController:Singleselect。ReplicaSet复制控制器:单选、复合选择。selector:app=webRelease=stable在新版本的K8s中,推荐使用ReplicaSet作为replicacontroller,不再使用ReplicationController。⑦Deployment部署对象Deployment部署对象如下:服务部署结构模型滚动更新ReplicaSet副本控制器控制Pod副本数。但项目的需求不断迭代更新,项目版本会不断发布。版本变了,如何更新服务?Deployment模型:ReplicaSet不支持滚动更新,Deployment对象支持滚动更新,通常与ReplicaSet配合使用。Deployment管理ReplicaSet,RS重建一个新的RS,创建一个新的Pod。⑧MySQL采用容器化部署,存在什么样的问题?问题如下:容器是有生命周期的。一旦宕机,数据就会丢失。Pod部署,Pod有生命周期,数据会丢失。Deployment和StatefulSet(有状态和无状态部署策略)对于K8s来说,Deployment不能用来部署有状态的服务。通常,Deployment用于部署无状态服务,所以对于有状态服务的部署,使用StatefulSet来部署有状态服务。什么是有状态服务?有实时数据需要存储。在有状态的服务集群中,如果集群网络不可用,将某个服务拉出来,过一段时间再加入到机器网络中。什么是无状态服务?不需要存储实时数据。在无状态服务集群中,如果某个服务在一段时间后被拉出并添加到机器网络中,不会对集群服务产生任何影响。⑨StatefulSet是为了解决一个有状态服务容器化部署的问题:部署模型有状态服务StatefulSet保证Pod重建后Hostname不会改变,Pod可以通过Hostname关联数据。K8s服务注册与发现①Pod的结构是怎样的?结构如下:Pod相当于一个容器。Pod有独立的IP地址和自己的主机名。它使用Namespace进行资源隔离和独立的沙箱环境。一个Pod封装了一个容器,容器可以封装一个或多个容器(通常是一组相关的容器)。②Pod网络如下:Pod有自己独立的IP地址。Pod内部容器之间的访问使用Localhost访问。Pod内部容器访问是Localhost,Pod之间的通信是远程访问(集群内服务可见)。**③Pod如何对外提供服务访问?Pod是一个虚拟的资源对象(进程),没有对应的实体(物理机、物理网卡)与之对应,因此无法直接对外提供服务访问。那么如何解决这个问题呢?如果一个Pod要对外提供服务,就必须绑定物理机端口。也就是在物理机上打开端口,把这个端口映射到Pod的端口,这样数据包就可以通过物理机转发了。一言以蔽之:先通过物理机IP+Port访问,再转发数据包。--[NodePort]④一组相关的Pod副本,如何实现访问负载均衡?我们先明确一个概念。Pod是一个有生命周期的进程。停机和版本更新将创建新的Pod。这时候IP地址会变,Hostname也会变。不适合用Nginx做负载均衡。所以我们需要依赖Service的能力。⑤Service是如何实现负载均衡的?简单来说,Service资源对象包括以下三部分:PodIP:Pod的IP地址。节点IP:物理机IP地址。ClusterIP:VirtualIP是K8s抽象出来的Service对象。此服务对象是VIP资源对象。⑥ServiceVIP原理深入探讨如下:Service和Pod都是一个进程,Service不能对外网提供服务。Service和Pod可以直接通信,他们的通信属于局域网通信。将请求交给Service后,Service使用iptable和ipvs分发数据包。⑦Service对象如何关联Pod?具体如下:不同的商家有不同的服务。服务和Pod通过标签选择器关联。selector:app=x选择一个订单的一组servicepod,并创建一个service;通过端点存储一组podips;Service通过标签选择器选择一组相关的副本,然后创建一个Service。⑧当Pod宕机,发布新版本时,Service如何发现Pod发生变化?每个Pod中都有Kube-Proxy,监听所有的Pod。如果发现Pod发生变化,会动态更新对应的IP映射关系(存储在etcd中)。重点问题①企业使用K8s的主要目的是什么?有以下三个方面:自动化运维平台,创业公司,中小企业,使用K8s搭建自动化运维平台,自动维护服务数量,保持服务与预期数据始终一致,使服务可以永远提供服务。这样做最直接的好处就是降低成本,提高效率。充分利用服务器资源。互联网公司有很多服务器资源“物理机”。为了充分利用服务器资源,使用K8s搭建私有云环境,项目运行在云端。这在大型互联网公司尤为重要。服务的无缝迁移,项目开发过程中产品需求和产品更新的不断迭代。这意味着项目不断发布新版本,K8s可以实现项目从开发到生产的无缝迁移。②K8s服务的负载均衡是如何实现的?Pod中的容器可能会因各种原因而失败和消亡。Deployment等控制器会动态创建和销毁Pod,以确保应用程序的整体健壮性。换句话说,Pod是脆弱的,但应用程序是健壮的。每个Pod都有自己的IP地址。当Controller用新的Pod替换失败的Pod时,新的Pod会被分配一个新的IP地址。这就产生了一个问题:如果一组Pod对外提供服务(比如HTTP),它们的IP很可能会发生变化,那么客户端如何找到并访问这个服务呢?K8s给出的解决方案是Service。KubernetesService在逻辑上代表了一组Pod,通过Label选择哪些Pod。Service有自己的IP,这个IP是不变的。客户端只需要访问Service的IP,K8s负责建立和维护Service和Pod的映射关系。无论后端Pod如何变化,对客户端都不会有任何影响,因为Service没有变化。③一般部署无状态服务的方式是什么?Deployment为Pod和ReplicaSet提供了声明式的定义方式,通常用于部署无状态服务。Deployment的主要作用:定义Deployment创建Pod和ReplicaSet滚动升级回滚应用扩容和cable容量暂停和继续。Deployment不仅可以滚动更新,还可以回滚。如果升级到V2后发现服务不可用,可以快速回滚到V1。