【中间件】-容器编排平台Kubernetes简介

news2024/11/16 23:40:36

目录

什么是K8s

为什么需要K8s

什么是容器(Contianer)

K8s能做什么?

K8s的架构原理

 控制平面(Control plane)

        kube-apiserver

        etcd

        kube-scheduler

        kube-controller-manager

        cloud-controller-manager

小结

节点组件(Node)

        container runtime

        Pod

        kubelet

        kube-proxy

集群(Cluster)

 工作负载资源

 Ingress

K8s部署和调用服务

什么是kubectl

部署服务

调用服务


什么是K8s

        Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。

        Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。K8s 这个缩写是因为 K 和 s 之间有 8 个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。

        K8s介于应用服务服务器之间,能够通过策略,协调和管理多个应用服务,只需要一个 yaml 文件配置,定义应用的部署顺序等信息,就能自动部署应用到各个服务器上,还能让它们挂了自动重启,自动扩缩容。


为什么需要K8s

什么是容器(Contianer)

        容器是打包应用及其运行依赖环境的技术每个运行的容器都是可重复的; 包含依赖环境在内的标准,意味着无论你在哪里运行它都会得到相同的行为。容器将应用程序从底层的主机设施中解耦, 这使得在不同的云或 OS 环境中部署更加容易。

        容器在服务器中获得独立的环境和应用程序并运行起来。这样一个独立的环境和应用程序,这个容器是不是很像我们用 vmware 或 kvm 整出来的传统虚拟机?但不同的是,传统虚拟机自带一个完整操作系统,而容器本身不带完整操作系统,容器的基础镜像实际上只包含了操作系统的核心依赖库和配置文件等必要组件。它利用一个叫 Namespace 的能力让它看起来就像是一个独立操作系统一样。再利用一个叫 Cgroup 的能力限制它能使用的计算资源。所以说,容器本质上只是个自带独立运行环境的特殊进程,底层用的其实是宿主机的操作系统内核

        Namespace 是 Linux 内核的一个特性,它允许多个进程组共享同一个系统资源,但每个进程组都认为自己独占这些资源。Namespace 通过为每个进程组提供独立的视图来实现这一点,这样每个进程组都看不到其他组的进程或资源。

        Cgroup(Control Groups)是 Linux 内核的另一个特性,它允许系统管理员对一组进程的资源使用进行细粒度的控制和监控。Cgroup 可以限制、记录和隔离进程组使用的物理资源(如 CPU、内存、磁盘 I/O 等)。

K8s能做什么?

        假如你是一个程序员,你用代码写了一个资源分享服务,并将它部署在了云平台上。
但资源分享服务太过受欢迎,访问量太大,经常会挂。

        后来你又上线了商城应用服务和语音应用服务,随着应用服务变多,需求也千奇百怪。有的应用服务不希望被外网访问到,有的部署的时候要求内存得大于 24GB 才能正常跑。
        你每次都需要登录到各个服务器上,执行手动操作更新。不仅容易出错,还贼浪费时间。 

        那么问题就来了,有没有一个办法,可以解决上面的问题?当然有,这次我们要加的中间层,叫 Kubernetes

        在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。 例如,如果一个容器发生故障,则你需要启动另一个容器。 如果此行为交由给系统处理,是不是会更容易一些?这就是 Kubernetes 要来做的事情! Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等

        Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。 由于 Kubernetes 是在容器级别运行,而非在硬件级别,它提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡,允许用户集成他们的日志记录、监控和警报方案。 但是,Kubernetes 不是单体式(monolithic)系统,那些默认解决方案都是可选、可插拔的。 Kubernetes 为构建开发人员平台提供了基础,但是在重要的地方保留了用户选择权,能有更高的灵活性。


K8s的架构原理

        为了实现上面的功能,Kubernetes 会将我们的服务器划为两部分,一部分叫控制平面(Control plane,以前叫 master),另一部分叫工作节点,也就是 Node。简单来说它们的关系就是老板和打工人, 也可以说就是训练师和帕鲁。控制平面负责控制和管理各个 Node,而 Node 则负责实际运行各个应用服务。

 控制平面(Control plane)

        控制平面组件会为集群做出全局决策,比如资源的调度,以及检测和响应集群事件。例如当不满足 Deployment 的replicas字段时,要启动新的 Pod。

        控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,安装脚本通常会在同一个服务器上启动所有控制平面组件, 并且不会在此服务器上运行用户容器。 

        kube-apiserver

        apiserver负责公开了 Kubernetes API,负责处理接受请求的工作。 是 Kubernetes 控制平面的前端。Kubernetes API 设计上考虑了水平扩缩,也就是说,它可通过部署多个实例来进行扩缩,可以运行 Kubernetes API 的多个实例,并在这些实例之间平衡流量。

        etcd

        一致且高可用的键值存储,用作 Kubernetes 所有集群数据的后台数据库。如果你的 Kubernetes 集群使用 etcd 作为其后台数据库, 请确保你针对这些数据有一份备份计划。

        kube-scheduler

        scheduler负责监视新创建的、未指定运行Nodes的Pods, 并选择节点来让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。

        kube-controller-manager

        controller-manager 负责运行控制器进程。从逻辑上讲, 每个controller都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。

        控制器有许多不同类型。以下是一些例子:

  • Node 控制器:负责在节点出现故障时进行通知和响应
  • Job 控制器:监测代表一次性任务的 Job 对象,然后创建 Pod 来运行这些任务直至完成
  • EndpointSlice 控制器:填充 EndpointSlice 对象(以提供 Service 和 Pod 之间的链接)。
  • ServiceAccount 控制器:为新的命名空间创建默认的 ServiceAccount。

        cloud-controller-manager

        云控制器管理器(Cloud Controller Manager)允许将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来它仅运行特定于云平台的控制器。 因此如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行环境, 所部署的集群不包含云控制器管理器。

        与 kube-controller-manager 类似,cloud-controller-manager 将若干逻辑上独立的控制回路组合到同一个可执行文件中,以同一进程的方式供你运行。 你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。

下面的控制器都包含对云平台驱动的依赖:

  • Node 控制器:用于在节点终止响应后检查云平台以确定节点是否已被删除
  • Route 控制器:用于在底层云基础架构中设置路由
  • Service 控制器:用于创建、更新和删除云平台上的负载均衡器

小结

  • 以前我们需要登录到每台服务器上,手动执行各种命令,现在我们只需要调用 k8s 的提供的 api 接口,就能操作这些服务资源,这些接口都由 API Server 组件提供。
  • 以前我们需要到处看下哪台服务器 cpu 和内存资源充足,然后才能部署应用,现在这部分决策逻辑由 Scheduler(调度器)来完成。
  • 找到服务器后,以前我们会手动创建,关闭服务,现在这部分功能由 Controller Manager(控制器管理器)来负责。
  • 上面的功能都会产生一些数据,这些数据需要被保存起来,方便后续做逻辑,因此 k8s 还会需要一个存储层,用来存放各种数据信息,目前是用的 etcd


节点组件(Node)

        Node 是实际的工作节点,它既可以是裸机服务器,也可以是虚拟机。它会负责实际运行各个应用服务。多个应用服务共享一台 Node 上的内存和 CPU 等计算资源。

        container runtime

        以前我们需要上传代码到服务器,而用了 k8s 之后,我们只需要将服务代码打包成Container Image(容器镜像),就能一行命令将它部署。关于容器镜像可以简单理解为它其实就是将应用代码和依赖的系统环境打了个压缩包,在任意一台机器上解压这个压缩包,就能正常运行服务。为了下载和部署镜像,Node 中会有一个 Container runtime 组件,这个基础组件使 Kubernetes 能够有效运行容器,负责管理 Kubernetes 环境中容器的执行和生命周期。

        Pod

        每个应用服务都可以认为是一个 Container(容器), 并且大多数时候,我们还会为应用服务搭配一个日志收集器 Container 或监控收集器 Container,多个 Container 共同组成一个一个 Pod,它运行在 Node 上。可以说Pod 代表的是集群上处于运行状态的一组容器的集合。

        k8s 可以将 pod 从某个 Node 调度到另一个 Node,还能以 pod 为单位去做重启和动态扩缩容的操作。所以说 Pod 是 k8s 中最小的调度单位

        kubelet

        另外,前面提到控制平面会用 Controller Manager (通过 API Server)控制 Node 创建和关闭服务,那 Node 也得有个组件能接收到这个命令才能去做这些动作,这个组件叫 kubelet,它主要负责管理和监控 Pod。

        kubelet会在集群中每个Node上运行。 它保证Contianer都运行在Pod中。kubelet接收一组通过各类机制提供给它的 PodSpec,确保这些 PodSpec 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。

        kube-proxy

        最后,Node 中还有个 Kube Proxy ,它负责 Node 的网络通信功能,有了它,外部请求就能被转发到 Pod 内。实际上是集群中每个Node上所运行的网络代理, 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。如果操作系统提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发。


集群(Cluster)

        控制平面和 Node 共同构成了一个 Cluster,也就是集群。在实际生产环境中,我们一般会构建多个集群, 比如测试环境用一个集群,生产环境用另外一个集群。同时,为了将集群内部的服务暴露给外部用户使用,我们一般还会部署一个入口控制器,比如 Ingress 控制器(比如 Nginx),它可以提供一个入口让外部用户访问集群内部服务。

        至此,我们可以得到K8s的整体架构:


 工作负载资源

        工作负载是在 Kubernetes 上运行的应用程序。在 Kubernetes 中,无论你的负载是由单个组件还是由多个一同工作的组件构成, 你都可以在一组Pod中运行它。 Kubernetes Pod 遵循预定义的生命周期。

        例如,当在你的集群中运行了某个 Pod,但是 Pod 所在的Node出现致命错误时, 所有该节点上的 Pod 的状态都会变成失败。Kubernetes 将这类失败视为最终状态,即使该节点后来恢复正常运行,你也需要创建新的 Pod 以恢复应用。

        不过,为了减轻用户的使用负担,通常不需要用户直接管理每个Pod。 而是使用负载资源来替用户管理一组 Pod。 这些负载资源通过配置 控制器 来确保正确类型的、处于运行状态的 Pod 个数是正确的,与用户所指定的状态相一致。

Kubernetes 提供若干种内置的工作负载资源:

  • Deployment 和 ReplicaSet (替换原来的资源 ReplicationController)。 Deployment 很适合用来管理你的集群上的无状态应用,Deployment 中的所有 Pod 都是相互等价的,并且在需要的时候被替换。
  • StatefulSet 让你能够运行一个或者多个以某种方式跟踪应用状态的 Pod。 例如,如果你的负载会将数据作持久存储,你可以运行一个 StatefulSet,将每个 Pod 与某个 PersistentVolume 对应起来。你在 StatefulSet 中各个 Pod 内运行的代码可以将数据复制到同一 StatefulSet 中的其它 Pod 中以提高整体的服务可靠性。
  • DaemonSet 定义提供节点本地支撑设施的 Pod。这些 Pod 可能对于你的集群的运维是 非常重要的,例如作为网络链接的辅助工具或者作为网络 插件 的一部分等等。每次你向集群中添加一个新节点时,如果该节点与某 DaemonSet 的规约匹配,则控制平面会为该 DaemonSet 调度一个 Pod 到该新节点上运行。
  • Job 和 CronJob。 定义一些一直运行到结束并停止的任务。 你可以使用 Job 来定义只需要执行一次并且执行后即视为完成的任务。你可以使用 CronJob 来根据某个排期表来多次运行同一个 Job。

 Ingress

        Ingress 是 Kubernetes 集群中的一种 API 对象,它管理外部访问到集群内服务的 HTTP 和 HTTPS 路由。Ingress 可以提供 URL 路由、负载均衡、SSL 终端、名称基的虚拟托管和路径基的虚拟托管等特性。流量路由由 Ingress 资源所定义的规则来控制。

        下面是 Ingress 的一个简单示例,可将所有流量都发送到同一 Service

        通过配置,Ingress 可为 Service 提供外部可访问的 URL、对其流量作负载均衡、 终止 SSL/TLS,以及基于名称的虚拟托管等能力。 Ingress 通常与 Ingress 控制器一起使用,Ingress 控制器负责完成 Ingress 的工作,具体实现上通常会使用某个负载均衡器, 不过也可以配置边缘路由器或其他前端来帮助处理流量。

        Kubernetes 本身不提供 Ingress 控制器,但有许多第三方 Ingress 控制器可供选择,如 Nginx Ingress Controller、Traefik、HAProxy Ingress Controller 等。


K8s部署和调用服务

什么是kubectl

        上面提到说我们可以使用 k8s 提供的 API 去创建服务,但问题就来了,这是需要我们自己写代码去调用这些 API 吗?
        答案是不需要,k8s 为我们准备了一个命令行工具 kubectl,我们只需要执行命令,它内部就会调用 k8s 的 API。

部署服务

        1.首先我们需要编写 YAML 文件,在里面定义 Pod 里用到了哪些镜像,占用多少内存和 CPU 等信息。
        2.然后使用 kubectl 命令行工具执行 kubectl apply -f xx.yaml ,此时 kubectl 会读取和解析 YAML 文件,将解析后的对象通过 API 请求发送给 Kubernetes 控制平面内 的 API Server

        3.API Server 会根据要求,驱使 Scheduler 通过 etcd 提供的数据寻找合适的 Node

        4.Controller Manager 会通过 API Server 控制 Node 创建服务。

        5.Node 内部的 kubelet 在收到命令后会开始基于 Container runtime 组件去拉取镜像创建容器,最终完成 Pod 的创建。

        整个过程下来,我们只需要写一遍 yaml 文件,和执行一次 kubectl 命令,比传统方式省心太多了。部署完服务后,我们来看下服务是怎么被调用的。

调用服务

        以前外部用户小明,直接在浏览器上发送 http 请求,就能送到我们服务器上的Nginx,然后转发到部署的服务内。
        用了 k8s 之后,外部请求会先到达 k8s 集群的 Ingress 控制器,然后请求会被转发到 k8s 内部的某个 Node 的 Kube Proxy 上,再找到对应的 pod,然后才是转发到内部容器服务中,处理结果原路返回,到这就完成了一次服务调用。

        到这里我们就大概了解了 k8s 的工作原理了,它本质上就是应用服务和服务器之间的中间层,通过暴露一系列 API 能力让我们简化服务的部署运维流程。

        并且,不少中大厂基于这些 API 能力搭了自己的服务管理平台,程序员不再需要敲 kubectl 命令,直接在界面上点点几下,就能完成服务的部署和扩容等操作,非常便捷好用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频加密软件哪个最好用?怎么对视频文件设置加密?公司视频文件加密的最佳选择!

视频文件是企业信息传递与存储的重要载体,这些视频文件不仅涵盖了员工培训资料、产品演示视频、客户沟通记录等关键业务内容,还可能包含商业秘密、技术专利等敏感信息。 因此,确保视频文件的安全性,防止未经授权的访问、篡改或泄…

7.1图像平移

目录 实验原理 示例代码1 运行结果1 示例代码2 运行结果2 实验原理 OpenCV中,图像平移是一种基本的几何变换,指的是将图像中的每一个像素点沿着水平方向或垂直方向移动一定的距离。图像平移不改变图像…

C++位图的实现与详解

1.位图概念 在讲解位图之前我们先来看一道很经典的面试题。 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 我们有以下两种种解决方法: 1. 遍历,时间复杂度O(N)。&#xff0…

如何在红米手机中恢复已删除的照片?(6 种方式可供选择)

凭借出色的相机和实惠的价格,小米红米系列已成为全球知名品牌。但是,最近有些人抱怨他们在 红米设备上丢失了许多珍贵的图片或视频,并希望弄清楚如何从小米手机恢复已删除的照片。好吧,在小米设备上恢复已删除的视频/照片并不难。…

RK3576芯片在智能家居里中型智慧屏产品的应用方案分析

智能家居在近年来得到了快速发展,AI技术不断发展,人机交互十分成熟,各种家电也都迎来了智能化浪潮,智能家居为人们提供了优秀的产品体验,受到主流消费者的青睐,智能家居里的中型智慧屏产品也随之兴起。 瑞芯…

HTTrack

--不破不立 HTTrack 是一个免费开源的网站离线浏览器。通过它可以将整个网站下载到本地的某个目录,包括 html、图片和脚本以及样式文件,并对其中的链接进行重构以便于在本地进行浏览。 1.官网下载地址:https://www.httrack.com/page/2/en/in…

通信工程学习:什么是FMC固定移动融合

FMC:固定移动融合 FMC固定移动融合,即Fixed Mobile Convergence(固定移动网络融合),是指通过固定网络与移动网络之间的融通、合作,实现全业务及融合业务的经营。这一技术旨在打破传统固定网络和移动网络之间…

设计模式-面试题(工厂方法模式、策略模式和责任链模式)

开闭原则:扩展开放、修改关闭 工厂设计模式:解耦 简单工厂模式 CoffeeStore和SimpleCoffeeFactory的耦合、SimpleCoffeeFactory和Coffee的耦合 后续如果再加新品种的咖啡,需要修改SimpleCoffeeFactory,这样就违反了开闭原则 简单…

探探我对测试开发的看法?

测试开发岗位主要负责确保软件的可用性和稳定性。 ● 可用性不仅包括功能的正常使用,还涵盖了软件在不同环境下的兼容性,如各种网络环境、不同 CPU 核心环境以及多样化的移动端设备等。 ● 稳定性方面我的理解是,测试人员不仅要从用户角度评判…

Mac无法安装软件怎么解决?mac安装软件提示无法验证开发者怎么办

在使用 macOS 系统时,你可能会遇到一个常见的问题:当你尝试安装或打开某些应用程序时,系统会弹出一个警告,提示“无法验证开发者”。出现这个提示导致自己无法去进行程序安装,接下来我们就来看看如何解决此问题的方法吧…

windows下载nvm并使用合集

下载nvm之前是要把node卸载的,不然会安装不成功 下面我先把nvm地址放上NVM下载 - NVM中文网 按照步骤按照完了一会可以使用一下命令来检查是否安装成功 nvm 安装成功后会出来版本号 下面开始安装node版本,很多朋友一上来直接下载node会报错 问题分析 …

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录 ✨说在前面 🍋知识点一:什么是list&…

【EST】:Pt/ZrO2单原子催化剂

摘要:制备稳定的单原子催化剂一直是环境催化领域去除各种污染物的研究热点,但在提高反应性和稳定性方面仍存在挑战。在此,通过在锆氧化物负载的铂催化剂(Pt–Na/ZrO2)中简单掺杂碱金属,成功制备了与碱金属通…

【C++初阶】:C++入门,引用概念及其性质

文章目录 一、引用的概念二、引用的语法规则1、引用特性2、常引用 二、引用的使用场景1. 引用做参数2. 引用做返回值 三、引用和指针的区别 一、引用的概念 首先明确一下,引用不是定义一个新的变量,而是给已经存在的变量起一个别名,变量和他…

相机内存卡格式化了照片怎么恢复?格式化恢复详解

摄影爱好者们都知道,相机内存卡是记录我们美好瞬间的重要媒介。然而,在使用过程中,有时我们会因操作不当或设备故障,不小心格式化了内存卡,从而导致珍贵的照片丢失。面对这种情况,我们该如何恢复这些被格式…

贪吃蛇项目实现(C语言)——附源码

前言 贪吃蛇是一款十分经典的游戏,其通过控制贪吃蛇的上下左右移动来吃食物,延长自己的身体,也会因为撞到墙体和自身而死亡。下面我们通过C语言来实现贪吃蛇。 1.技术要点 C语言枚举,结构体,链表,动态内…

内网中的RDP利用

学习参考 https://www.freebuf.com/articles/network/276242.html能跟着实操的都实操一下。熟悉一些命令,过程。 实验环境:win2008,192.168.72.139 两个用户: administrator,shizuru RDP服务 确定/开启 RDP服务确…

力扣第79题 单词搜索

前言 记录一下刷题历程 力扣第79题 单词搜索 单词搜索 原题目:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻…

解决ubuntu安装modelsim20.1 32位库依赖失败问题(附简易安装方法)

先说方法:不用管,直接继续安装软件就行。 注意,选中 libgtk-3-0t64:i386 而非 libgtk-3-0:i386 注意,选中 libcanberra0t64:i386 而非 libcanberra0:i386 注意,选中 libpng16-16t64:i386 而非 libpng16-16:i386 注意&…

白盒测试_学习总结

目录 一、白盒测试的概念理解 二、白盒测试的分类 1、静态分析 2、动态分析 (1)逻辑覆盖测试 a、语句覆盖 b、判定覆盖 c、条件覆盖 d、判定条件覆盖 e、条件组合覆盖 f、路径覆盖 (2)基本路径测试法 3、总结 一、白盒…