Kubernetes的概述与架构
Kubernetes 的概述Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态体系,其服务、支持和工具的利用范围广泛。
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。K8s 这个缩写是因为 K 和 s 之间有 8 个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年履历的底子上, 联合了社区中最良好的想法和实践。
为什么必要 Kubernetes,它能做什么?
容器是打包和运行应用程序的好方式。在生产情况中, 你必要管理运行着应用程序的容器,并确保服务不会下线。 比方,假如一个容器发生故障,则你必要启动另一个容器。 假如此举动交由给体系处理,是不是会更轻易一些?
这就是 Kubernetes 要来做的事情! Kubernetes 为你提供了一个可弹性运行分布式体系的框架。 Kubernetes 会满足你的扩展要求、故障转移你的应用、提供摆设模式等。 比方,Kubernetes 可以轻松管理体系的 Canary (金丝雀) 摆设。
Kubernetes 为你提供:
[*]服务发现和负载均衡
Kubernetes 可以利用 DNS 名称或自己的 IP 地址来袒露容器。 假如进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使摆设稳定。
[*]存储编排
Kubernetes 允许你自动挂载你选择的存储体系,比方本地存储、公共云提供商等。
[*]自动摆设和回滚
你可以利用 Kubernetes 形貌已摆设容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 比方,你可以自动化 Kubernetes 来为你的摆设创建新容器, 删除现有容器并将它们的全部资源用于新容器。
[*]自动完成装箱盘算
你为 Kubernetes 提供许多节点构成的集群,在这个集群上运行容器化的使命。 你告诉 Kubernetes 每个容器必要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调理到你的节点上,以最佳方式利用你的资源。
[*]自我修复
Kubernetes 将重新启动失败的容器、更换容器、杀死不响应用户定义的运行状况查抄的容器, 并且在准备好服务之前不将其告示给客户端。
[*]密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,比方暗码、OAuth 令牌和 SSH 密钥。 你可以在不重建容器镜像的情况下摆设和更新密钥和应用程序配置,也无需在堆栈配置中袒露密钥。
[*]批处理执行 除了服务外,Kubernetes 还可以管理你的批处理和 CI(持续集成)工作负载,如有必要,可以更换失败的容器。
[*]程度扩缩 利用简单的命令、用户界面或根据 CPU 利用率自动对你的应用进行扩缩。
[*]IPv4/IPv6 双栈 为 Pod(容器组)和 Service(服务)分配 IPv4 和 IPv6 地址。
[*]为可扩展性设计 在不改变上游源代码的情况下为你的 Kubernetes 集群添加功能。
Kubernetes 不是什么
Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)体系。 由于 Kubernetes 是在容器级别运行,而非在硬件级别,它提供了 PaaS 产物共有的一些广泛适用的功能, 比方摆设、扩展、负载均衡,允许用户集成他们的日志记录、监控和警报方案。 但是,Kubernetes 不是单体式(monolithic)体系,那些默认解决方案都是可选、可插拔的。 Kubernetes 为构建开发人员平台提供了底子,但是在告急的地方保留了用户选择权,能有更高的灵活性。
Kubernetes:
[*]不限定支持的应用程序类型。 Kubernetes 旨在支持极其多种多样的工作负载,包括无状态、有状态和数据处理工作负载。 假如应用程序可以在容器中运行,那么它应该可以在 Kubernetes 上很好地运行。
[*]不摆设源代码,也不构建你的应用程序。 持续集成(CI)、交付和摆设(CI/CD)工作流取决于组织的文化和偏好以及技术要求。
[*]不提供应用程序级别的服务作为内置服务,比方中间件(比方消息中间件)、 数据处理框架(比方 Spark)、数据库(比方 MySQL)、缓存、集群存储体系 (比方 Ceph)。这样的组件可以在 Kubernetes 上运行,并且/或者可以由运行在 Kubernetes 上的应用程序通过可移植机制(比方开放服务代理)来访问。
[*]不是日志记录、监督或警报的解决方案。 它集成了一些功能作为概念证明,并提供了收集和导出指标的机制。
[*]不提供也不要求配置用的语言、体系(比方 jsonnet),它提供了声明性 API, 该声明性 API 可以由恣意情势的声明性规范所构成。
[*]不提供也不采用任何全面的机器配置、维护、管理或自我修复体系。
[*]此外,Kubernetes 不但仅是一个编排体系,实际上它消除了编排的必要。 编排的技术定义是执行已定义的工作流程:起首执行 A,然后执行 B,再执行 C。 而 Kubernetes 包罗了一组独立可组合的控制过程,可以持续地将当前状态驱动到所提供的预期状态。 你不必要在乎如何从 A 移动到 C,也不必要会合控制,这使得体系更易于利用且功能更强大、 体系更结实,更为弹性和可扩展。
Kubernetes 的历史配景
让我们回顾一下为何 Kubernetes 能够裨益四方。
https://i-blog.csdnimg.cn/direct/1a0bf55730384befbffdadc39362e4e9.png
传统摆设期间:
早期,各个组织是在物理服务器上运行应用程序。 由于无法限定在物理服务器中运行的应用程序资源利用,因此会导致资源分配标题。 比方,假如在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程序资源利用率不高时,剩余资源无法被分配给其他应用程序, 而且维护许多物理服务器的成本很高。
假造化摆设期间:
因此,假造化技术被引入了。假造化技术允许你在单个物理服务器的 CPU 上运行多台假造机(VM)。 假造化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。
假造化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。 通过假造化,你可以将一组物理资源呈现为可丢弃的假造机集群。
每个 VM 是一台完整的盘算机,在假造化硬件之上运行全部组件,包括其自己的操纵体系。
容器摆设期间:
容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操纵体系(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件体系、CPU、内存、进程空间等。 由于它们与底子架构分离,因此可以跨云和 OS 发行版本进行移植。
容器因具有许多上风而变得盛行起来,比方:
[*]敏捷应用程序的创建和摆设:与利用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
[*]持续开发、集成和摆设:通过快速简单的回滚(由于镜像不可变性), 提供可靠且频繁的容器镜像构建和摆设。
[*]关注开发与运维的分离:在构建、发布时创建应用程序容器镜像,而不是在摆设时, 从而将应用程序与底子架构分离。
[*]可观察性:不但可以表现 OS 级别的信息和指标,还可以表现应用程序的运行状况和其他指标信号。
[*]跨开发、测试和生产的情况一致性:在条记本盘算机上也可以和在云中运行一样的应用程序。
[*]跨云和操纵体系发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
[*]以应用程序为中心的管理:提高抽象级别,从在假造硬件上运行 OS 到利用逻辑资源在 OS 上运行应用程序。
[*]松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态摆设和管理 - 而不是在一台大型单机上团体运行。
[*]资源隔离:可猜测的应用程序性能。
[*]资源利用:高效率和高密度。
Kubernetes 架构
Kubernetes采用主从架构设计。Kubernetes 集群由一个控制平面(相称于管理主机)和一组用于运行容器化应用的工作机器(相称于工作从机)构成, 这些工作机器称作节点(Node)。每个集群至少必要一个工作节点来运行 Pod。
工作节点托管着构成应用负载的 Pod。控制平面管理集群中的工作节点和 Pod。 在生产情况中,控制平面通常跨多台盘算机运行,而一个集群通常运行多个节点,以提供容错和高可用。
一个完整且可运行的 Kubernetes 集群所需的组件如下图。
https://i-blog.csdnimg.cn/direct/e2c8543b55e24c529b576098540b9e62.png
控制平面组件
控制平面组件会为集群做出全局决策,好比资源的调理。 以及检测和响应集群事件,比方当不满足 Deployment 的 replicas 字段时,要启动新的 Pod)。
控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,安装脚本通常会在同一个盘算机上启动全部控制平面组件, 并且不会在此盘算机上运行用户容器。
kube-apiserver
API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API,负责处理担当哀求的工作。 API 服务器是 Kubernetes 控制平面的前端。
Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了程度扩缩,也就是说,它可通过摆设多个实例来进行扩缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间均衡流量。
etcd
一致且高可用的键值存储,用作 Kubernetes 全部集群数据的背景数据库。
假如你的 Kubernetes 集群利用 etcd 作为其背景数据库, 请确保你针对这些数据有一份 备份计划。
kube-scheduler
kube-scheduler 是控制平面的组件, 负责监督新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行。
调理决策考虑的因素包括单个 Pod 及 Pods 聚集的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。
kube-controller-manager
kube-controller-manager 是控制平面的组件, 负责运行控制器进程。
从逻辑上讲, 每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。
控制器有许多不同类型。以下是一些例子:
[*]Node 控制器:负责在节点出现故障时进行通知和响应
[*]Job 控制器:监测代表一次性使命的 Job 对象,然后创建 Pod 来运行这些使命直至完成。
[*]EndpointSlice 控制器:填充 EndpointSlice 对象(以提供 Service 和 Pod 之间的链接)。
[*]ServiceAccount 控制器:为新的命名空间创建默认的 ServiceAccount。
cloud-controller-manager
一个 Kubernetes 控制平面组件, 嵌入了特定于云平台的控制逻辑。 云控制器管理器(Cloud Controller Manager)允许将你的集群毗连到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来。cloud-controller-manager 仅运行特定于云平台的控制器。 因此假如你在自己的情况中运行 Kubernetes,或者在本地盘算机中运行学习情况, 所摆设的集群不包罗云控制器管理器。
与 kube-controller-manager 类似,cloud-controller-manager 将多少逻辑上独立的控制回路组合到同一个可执行文件中,以同一进程的方式供你运行。 你可以对其执行程度扩容(运行不止一个副本)以提升性能或者加强容错能力。
下面的控制器都包罗对云平台驱动的依靠:
[*]Node 控制器:用于在节点终止响应后查抄云平台以确定节点是否已被删除
[*]Route 控制器:用于在底层云底子架构中设置路由
[*]Service 控制器:用于创建、更新和删除云平台上的负载均衡器
节点组件
节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行时情况。
kubelet
kubelet 会在集群中每个节点(node)上运行。 它包管容器(containers)都运行在 Pod 中。
kubelet 吸收一组通过各类机制提供给它的 PodSpec,确保这些 PodSpec 中形貌的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。
kube-proxy(可选)
kube-proxy 是集群中每个节点(node)上所运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。
kube-proxy 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。
假如操纵体系提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发。
假如你利用网络插件为 Service 实现本身的数据包转发, 并提供与 kube-proxy 等效的举动,那么你不必要在集群中的节点上运行 kube-proxy。
容器运行时
这个底子组件使 Kubernetes 能够有用运行容器。 它负责管理 Kubernetes 情况中容器的执行和生命周期。
Kubernetes 支持许多容器运行情况,比方 containerd、 CRI-O 以及 Kubernetes CRI (容器运行情况接口) 的其他任何实现。
插件(Addons)
Addons的翻译是附加组件、插件或扩展程序。
插件利用 Kubernetes 资源(DaemonSet、 Deployment 等)实现集群功能。 因为这些插件提供集群级别的功能,插件中命名空间域的资源属于 kube-system 命名空间。
下面形貌浩繁插件中的几种。有关可用插件的完整列表, 请参见插件(Addons)。
DNS
只管其他插件都并非严酷意义上的必需组件,但几乎全部 Kubernetes 集群都应该有集群 DNS, 因为许多示例都必要 DNS 服务。
集群 DNS 是一个 DNS 服务器,和情况中的其他 DNS 服务器一起工作,它为 Kubernetes 服务提供 DNS 记录。
Kubernetes 启动的容器自动将此 DNS 服务器包罗在其 DNS 搜索列表中。
Web 界面(仪表盘)
Dashboard 是 Kubernetes 集群的通用的、基于 Web 的用户界面。 它利用户可以管理集群中运行的应用程序以及集群本身,并进行故障排除。
容器资源监控
容器资源监控 将关于容器的一些常见的时序度量值生存到一个会合的数据库中,并提供浏览这些数据的界面。
集群层面日志
集群层面日志机制负责将容器的日志数据生存到一个会合的日志存储中, 这种会合日志存储提供搜索和浏览接口。
网络插件
网络插件 是实现容器网络接口(CNI)规范的软件组件。它们负责为 Pod 分配 IP 地址,并使这些 Pod 能在集群内部相互通信。
架构变种
虽然 Kubernetes 的核心组件保持一致,但它们的摆设和管理方式可能有所不同。 了解这些变化对于设计和维护满足特定运营需求的 Kubernetes 集群至关告急。
控制平面摆设选项
控制平面组件可以通过以下几种方式摆设:
传统摆设
控制平面组件直接在专用机器或假造机上运行,通常作为 systemd 服务进行管理。
静态 Pod
控制平面组件作为静态 Pod 摆设,由特定节点上的 kubelet 管理。 这是像 kubeadm 这样的工具常用的方法。
自托管
控制平面在 Kubernetes 集群本身内部作为 Pod 运行, 由 Deployments、StatefulSets 或其他 Kubernetes 原语管理。
托管 Kubernetes 服务
云平台通常将控制平面抽象出来,将其组件作为其服务的一部分进行管理。
工作负载调理说明
含控制平面组件在内的工作负载的调理可能因集群巨细、性能要求和操纵策略而有所不同:
[*]在较小或开发集群中,控制平面组件和用户工作负载可能在同一节点上运行。
[*]较大的生产集群通常将特定节点专用于控制平面组件,将其与用户工作负载隔离。
[*]一些组织在控制平面节点上运行关键组件或监控工具。
集群管理工具
像 kubeadm、kops 和 Kubespray 这样的工具提供了不同的集群摆设和管理方法, 每种方法都有自己的组件布局和管理方式。
Kubernetes 架构的灵活性使各组织能够根据特定需求调整其集群,均衡操纵复杂性、性能和管理开销等因素。
定制和可扩展性
Kubernetes 架构允许大幅度的定制:
[*]你可以摆设自定义的调理器与默认的 Kubernetes 调理器协同工作,也可以完全更换掉默认的调理器。
[*]API 服务器可以通过 CustomResourceDefinition 和 API 聚合进行扩展。
[*]云平台可以利用 cloud-controller-manager 与 Kubernetes 深度集成。
Kubernetes 架构的灵活性使各组织能够根据特定需求调整其集群,均衡操纵复杂性、性能和管理开销等因素。
参考:Kubernetes中文文档
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]