Bootstrap

【架构-25】K8S

什么是K8S?

K8S 是 Kubernetes 的缩写,是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。
Kubernetes 具有以下主要特点和优势:
一、容器编排
自动化部署:可以自动将容器化的应用程序部署到集群中的各个节点上,无需手动操作。例如,开发人员只需定义应用程序的部署配置,Kubernetes 就能自动将应用部署到合适的节点上,并确保应用的可用性。
自动扩缩容:根据应用的负载情况自动调整容器的数量。如果应用的负载增加,Kubernetes 可以自动增加容器的数量以提高处理能力;当负载下降时,又可以自动减少容器数量以节省资源。
滚动更新:在不中断服务的情况下,逐步更新应用程序的版本。Kubernetes 可以先启动新版本的容器,然后逐步将流量切换到新版本,同时确保旧版本的容器在没有流量后安全退出。

二、高可用和容错
副本管理:确保应用程序的多个副本在集群中运行,当某个副本出现故障时,自动启动新的副本进行替换。例如,对于一个关键的应用,可以设置多个副本,即使某个节点出现故障,其他节点上的副本仍然可以保证应用的正常运行。
节点故障处理:当集群中的节点出现故障时,Kubernetes 会自动将该节点上的容器重新调度到其他健康的节点上,保证应用的连续性。
自我修复:能够自动检测和修复应用程序中的问题,例如容器崩溃、网络故障等。它会尝试重新启动失败的容器或采取其他措施来恢复应用的正常运行。

三、服务发现和负载均衡
服务发现:Kubernetes 为应用程序提供了一种简单的方式来发现和访问其他服务。通过服务名和标签,容器可以轻松地找到所需的服务,而无需关心服务的具体位置。
负载均衡:自动将请求分发到多个容器实例上,实现负载均衡。这可以提高应用的性能和可用性,确保每个容器都能分担一部分负载。

四、资源管理
资源配额:可以为每个命名空间或应用程序设置资源配额,限制其使用的 CPU、内存、存储等资源。这有助于防止某个应用程序过度占用资源,影响其他应用的正常运行。
资源调度:根据节点的资源使用情况和应用程序的资源需求,智能地调度容器到合适的节点上。这样可以充分利用集群的资源,提高资源利用率。

比喻

K8S(Kubernetes)可以简单理解为一个强大的 “大管家”,专门管理容器化的应用程序。
一、部署应用超方便
想象一下,你有很多小盒子(容器),每个盒子里装着不同的应用程序。以前你要把这些盒子一个个放到合适的地方很麻烦。但有了 K8S,你只需要告诉它你要放哪些盒子,它就会自动把这些盒子放到合适的服务器上,不用你再费力去一个个摆放。

二、灵活调整规模
如果你的应用突然有很多人使用,变得很忙碌,K8S 就像一个神奇的魔法师,它能马上变出更多一样的盒子(增加容器数量)来帮忙处理任务。如果人少了,它又会把多余的盒子收起来(减少容器数量),这样就不会浪费资源。

三、不怕出问题
假如有一个盒子坏了(容器故障),K8S 会立刻发现并迅速换一个新的盒子上去,保证你的应用一直能正常运行。而且如果服务器出问题了,它会把盒子搬到其他好的服务器上,就像搬家一样,让你的应用不受影响。

四、轻松找到其他服务
K8S 还像一个导航员,让你的应用很容易找到其他它需要的服务。你只需要告诉它要找什么,它就能带你找到,不用你自己费力去到处找。

五、合理分配资源
它还会看着所有的盒子和服务器,确保每个盒子不会抢其他盒子的资源,也不会让某个服务器负担太重。如果某个应用需要更多资源,它会想办法调整,让资源分配更合理。

K8S为什么能做到这些?

K8S(Kubernetes)能够做到这些主要基于以下几个关键原理:
一、声明式 API 和控制器模式
声明式 API:用户通过编写 YAML 或 JSON 格式的配置文件,向 K8S 声明所需的资源状态,而不是具体的操作步骤。例如,用户可以定义一个 Deployment(部署)资源,指定应用程序的副本数量、容器镜像等信息,而不是告诉 K8S 如何一步步去创建这些副本。
控制器模式:K8S 中有各种控制器,它们不断监测系统的实际状态与用户声明的期望状态之间的差异,并采取相应的行动来使实际状态趋近于期望状态。例如,Deployment 控制器会监测部署的副本数量,如果实际副本数少于期望数量,它会启动新的容器来满足要求。
二、容器编排
Pod 概念:Pod 是 K8S 中最小的可部署和管理的单元,一个 Pod 可以包含一个或多个紧密相关的容器。这些容器共享存储、网络等资源,并且被一起调度到同一个节点上。例如,一个 Web 应用可能由一个运行 Web 服务器的容器和一个运行数据库的容器组成,它们可以放在一个 Pod 中,方便管理和通信。
调度算法:K8S 的调度器根据节点的资源可用性、Pod 的资源需求以及其他约束条件,将 Pod 分配到合适的节点上。例如,调度器会优先将 Pod 调度到资源利用率较低的节点上,以实现资源的均衡分配。
三、自动扩缩容
基于指标的自动扩缩容:K8S 可以根据各种指标(如 CPU 使用率、内存使用率、应用程序的 QPS 等)自动调整 Pod 的副本数量。例如,如果一个应用的 CPU 使用率超过了一定阈值,Horizontal Pod Autoscaler(HPA)会自动增加副本数量,以分担负载。
扩缩容算法:通常采用一些算法来确定合适的副本数量调整幅度。例如,可以根据当前负载与期望负载的比例来逐步增加或减少副本数量,避免过度调整导致系统不稳定。
四、高可用和容错
副本集和控制器:通过创建副本集(ReplicaSet),可以确保应用程序始终有指定数量的副本在运行。即使某个副本出现故障,控制器会自动创建新的副本进行替换。例如,一个 Deployment 会创建一个副本集来管理应用的副本,保证应用的高可用性。
节点故障检测和恢复:K8S 会定期检测节点的健康状态,如果发现节点故障,会将该节点上的 Pod 重新调度到其他健康的节点上。同时,K8S 还会使用存储在分布式存储系统中的数据来恢复故障节点上的 Pod,确保数据的一致性。
五、服务发现和负载均衡
Service 资源:K8S 中的 Service 定义了一组逻辑上的 Pod 和访问它们的方式。Service 为这些 Pod 提供了一个稳定的 IP 地址和端口,并且可以实现负载均衡。例如,当多个 Pod 提供相同的服务时,客户端可以通过 Service 的 IP 地址和端口访问这些 Pod,而无需关心具体的 Pod 地址。
负载均衡算法:K8S 可以使用多种负载均衡算法,如轮询、随机、最少连接等,将请求分发到不同的 Pod 上。这样可以确保每个 Pod 都能分担一部分负载,提高系统的性能和可用性。
六、资源管理
资源配额和限制:K8S 可以为每个命名空间或应用程序设置资源配额和限制,确保它们不会过度占用资源。例如,可以限制一个应用程序使用的 CPU 和内存资源,防止它影响其他应用的正常运行。
资源调度策略:K8S 的调度器会考虑节点的资源可用性、Pod 的资源需求以及其他因素,选择最合适的节点来调度 Pod。例如,调度器会优先将资源需求较小的 Pod 调度到资源利用率较低的节点上,以实现资源的最大化利用。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;