【K8S系列】Kubernetes基础介绍

news2024/9/20 13:47:15

一、前言

搭建完k8s集群后,正式进入k8s相关知识点的理论了解。并结合官方文档逐步总结涉及k8s各类知识点,希望能对正在学习的或将要学习得到小伙伴有所帮助。

二、系统部署历程回顾

传统部署时代:

早期,各个组织是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程序资源利用率不高时,剩余资源无法被分配给其他应用程序, 而且维护许多物理服务器的成本很高。

虚拟化部署时代:

因此,虚拟化技术被引入了。虚拟化技术允许我们在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。

虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。 通过虚拟化,我们可以将一组物理资源呈现为可丢弃的虚拟机集群。

每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

容器部署时代:

容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。

容器因具有许多优势而变得流行起来,例如:

  • 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
  • 持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性), 提供可靠且频繁的容器镜像构建和部署。
  • 关注开发与运维的分离:在构建、发布时创建应用程序容器镜像,而不是在部署时, 从而将应用程序与基础架构分离。
  • 可观察性:不仅可以显示 OS 级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
  • 跨开发、测试和生产的环境一致性:在笔记本计算机上也可以和在云中运行一样的应用程序。
  • 跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
  • 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
  • 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
  • 资源隔离:可预测的应用程序性能。
  • 资源利用:高效率和高密度。

而在如今,容器技术为应用程序的打包和运行提供了一种高效的方式。在生产环境中,管理这些运行着应用程序的容器并确保服务的持续可用性是至关重要的。例如,当一个容器发生故障时,需要迅速启动另一个容器以维持服务的连续性。如果这些操作能够由自动化系统来处理,无疑会大大简化运维工作。

Kubernetes 正是为此而生。作为一个弹性的分布式系统运行框架,Kubernetes 能够满足各种扩展需求,实现应用的故障转移,并提供多种部署模式。例如,Kubernetes 可以轻松地管理系统的金丝雀部署,这是一种逐步将新版本应用引入生产环境的策略,通过小规模用户测试来降低风险。

通过使用 Kubernetes,开发者可以专注于应用的开发,而无需担心底层基础设施的管理。Kubernetes 的自动化能力确保了应用的高可用性和可扩展性,使得在动态变化的生产环境中保持服务的稳定运行变得更加容易和可靠。

三、Kubernetes概述

Kubernetes是一个完备的分布式系统支撑平台。Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制/多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复功能、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。同时kubernetes提供了完善的管理工具,这些工具覆盖了包括开发、测试部署、运维监控在内的各个环节;因此kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。

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 并非传统意义上的、涵盖所有功能的 PaaS(平台即服务)系统。与传统的 PaaS 系统不同,Kubernetes 在容器层面而非硬件层面运行,这使得它能够提供一系列普遍适用的功能,如应用的部署、扩展、负载均衡,以及支持用户集成自定义的日志记录、监控和警报方案。

Kubernetes 的设计理念是模块化和可插拔的,它避免了单体式系统的局限性,提供了灵活的默认解决方案,这些解决方案都是可选的,用户可以根据需要进行选择和集成。这种架构使得 Kubernetes 成为构建开发人员平台的理想基础,同时保留了用户在关键决策上的选择权,从而实现了高度的灵活性和定制化。

通过这种方式,Kubernetes 不仅满足了基础的 PaaS 功能需求,还为用户提供了构建和定制自己平台的能力,确保了在不同环境和需求下的适应性和扩展性。

因此下列这些功能是需要我们在使用Kubernetes 时注意区分的地方:

  • 不限制支持的应用程序类型。 Kubernetes 旨在支持极其多种多样的工作负载,包括无状态、有状态和数据处理工作负载。 如果应用程序可以在容器中运行,那么它应该可以在 Kubernetes 上很好地运行。
  • 不部署源代码,也不构建你的应用程序。 持续集成(CI)、交付和部署(CI/CD)工作流取决于组织的文化和偏好以及技术要求。
  • 不提供应用程序级别的服务作为内置服务,例如中间件(例如消息中间件)、 数据处理框架(例如 Spark)、数据库(例如 MySQL)、缓存、集群存储系统 (例如 Ceph)。这样的组件可以在 Kubernetes 上运行,并且/或者可以由运行在 Kubernetes 上的应用程序通过可移植机制(例如开放服务代理)来访问。
  • 不是日志记录、监视或警报的解决方案。 它集成了一些功能作为概念证明,并提供了收集和导出指标的机制。
  • 不提供也不要求配置用的语言、系统(例如 jsonnet),它提供了声明性 API, 该声明性 API 可以由任意形式的声明性规范所构成。
  • 不提供也不采用任何全面的机器配置、维护、管理或自我修复系统。
  • 此外,Kubernetes 不仅仅是一个编排系统,实际上它消除了编排的需要。 编排的技术定义是执行已定义的工作流程:首先执行 A,然后执行 B,再执行 C。 而 Kubernetes 包含了一组独立可组合的控制过程,可以持续地将当前状态驱动到所提供的预期状态。 你不需要在乎如何从 A 移动到 C,也不需要集中控制,这使得系统更易于使用且功能更强大、 系统更健壮,更为弹性和可扩展。

下面可以看到一个典型的Kubernetes架构图:

上图可以看到如下组件,使用特别的图标表示Service和Label:

  • PodContainer(容器)
  • Label()(标签)
  • Replication Controller(复制控制器)
  • Service()(服务)
  • Node(节点)
  • Kubernetes Master(Kubernetes主节点)

 四、Kubernetes部署组件的简单介绍

这里仅对前面笔者部署的Master和Node做个简单介绍,并不代表所有必要组件。后面随着学习深入会逐步总结。首先第一个就是部署时的Master。

Master组件

Kubernetes 里的Master组件是集群的控制平台(control plane),每个Kubernetes集群里需要有一个Master节点来负责整个集群的管理和控制,基本上Kubernetes所有的控制命令都发给它,它负责具体的执行过程,我们后面执行的所有命令基本上都是在Master节点上运行的。如果Master宕机或不可用,那么集群内容器的管理都将失效。

在Kubernetes集群中,Master节点扮演着核心角色,负责管理和控制整个集群。以下是Master节点上运行的关键进程及其功能:

  1. Kubernetes API Server (kube-apiserver)

    • 作为Kubernetes集群的中央管理实体,kube-apiserver提供了HTTP Rest接口,是所有资源(如Pod、Service、Deployment等)增、删、改、查操作的唯一入口。
    • 它负责验证和配置API对象的数据,包括Pod、Service、ReplicationController等,确保集群状态的一致性和正确性。
  2. Kubernetes Controller Manager (kube-controller-manager)

    • 这是Kubernetes自动化控制的核心组件,负责管理集群中的各种控制器(如Replication Controller、Endpoints Controller、Namespace Controller等)。
    • 控制器通过监控集群的共享状态,并采取措施使当前状态趋向于期望状态,从而实现资源的自动化管理和调度。
  3. Kubernetes Scheduler (kube-scheduler)

    • 负责根据各种调度策略(如资源需求、硬件/软件/策略约束、亲和性和反亲和性、数据局部性等),将新建的Pod分配到合适的Node节点上运行。
    • 调度决策考虑了多种因素,以确保Pod的高效和均衡分布,从而优化集群资源的利用。

此外,Master节点上还需要运行一个etcd服务:

  • etcd是一个高可用的键值存储系统,用于存储Kubernetes集群的所有配置数据和状态信息。它为Kubernetes提供了一个可靠的数据存储层,确保集群的高可用性和数据一致性。

这些组件协同工作,确保Kubernetes集群的稳定运行和高效管理,为用户提供一个强大且灵活的容器编排平台。

Node组件

除了Master,集群中其他机器被称为Node节点,每个Node都会被Master分配一些工作负载Docker容器,当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上去。 负责维护运行中的 Pod 并提供 Kubernetes 运行时环境。

在Kubernetes集群中,每个Node节点都运行着一组关键进程,这些进程协同工作以确保容器化应用的高效运行和管理。以下是Node节点上运行的核心进程及其功能:

  1. kubelet

    • 作为Node节点的代理,kubelet负责管理Pod的生命周期,包括容器的创建、启动、停止和监控。
    • 它与Master节点的API Server通信,确保Pod的期望状态与实际状态保持一致,实现集群管理的基本功能。
    • kubelet还负责执行容器健康检查,并在检测到故障时采取相应措施,确保应用的高可用性。
  2. kube-proxy

    • kube-proxy是Kubernetes Service机制的核心组件,负责实现Service的网络通信和负载均衡。
    • 它通过维护网络规则,确保Service的IP地址和端口在集群内部可达,并提供基于IP的负载均衡,将流量分发到后端的Pod。
    • kube-proxy支持多种负载均衡模式,如用户空间代理、iptables和IPVS,以适应不同的网络需求和性能要求。
  3. Docker Engine (Docker)

    • Docker引擎是Node节点上负责容器创建和管理的底层技术。
    • 它提供了容器运行时环境,负责镜像管理、容器隔离和资源分配。
    • Docker引擎与kubelet紧密集成,接收kubelet的指令,执行容器的启动、停止和监控操作,确保容器按照Kubernetes的调度策略运行。

在集群管理方面,Kubernets将集群中的机器划分为一个Master节点和一群工作节点(Node),其中,在Master节点上运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性收缩、安全控制、系统监控和纠错等管理功能,并且都是全自动完成的。Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的kubelet、kube-proxy服务进程,这些服务进程负责Pod创建、启动、监控、重启、销毁、以及实现软件模式的负载均衡。

五、后记

当然这些只是一些粗略的介绍,后面随着自己的学习深入,笔者也会将各类较为重要的单组件信息慢慢介绍。本文就到此为止了,希望对有需要了解的小伙伴有所帮助~

参考文档主要来源:

kubernetes中文文档

kubernetes教程 

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

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

相关文章

[python]uiautomation.WindowControl函数用法

Python UIAutomation 窗口控件 介绍 在本文中,我们将探讨Python UIAutomation库以及如何使用它来控制和自动化Windows应用程序。我们将介绍UIAutomation的基础知识及其功能,并提供代码示例来演示其用法。 什么是UI自动化? UIAutomation是一个…

Java中常用的设计模式

一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程…

【机器学习】探索数据矿藏:Python中的AI大模型与数据挖掘创新实践

💖 前言:探索数据矿藏1. 📊数据获取与预处理:AI大模型的燃料1.1 🌐数据获取:多样性与规模并重1.2 🧹数据清洗与处理:提升数据质量1.3 🔍特征工程:挖掘数据的深…

稠密检索的规模艺术:模型、数据与性能的精准匹配

论文:https://arxiv.org/pdf/2403.18684代码:GitHub - jingtaozhan/DRScale机构:清华大学领域:稠密检索、Scaling Laws发表:SIGIR2024最佳论文 Abstract Scaling Laws已经在广泛的任务中被观察到,特别是在…

JavaScript基础——闭包

闭包简介 闭包的作用 闭包可以保留变量的状态 闭包可以让变量私有化 闭包的缺点 闭包简介 在JavaScript中,重复声明同一个变量会导致变量冲突,在这个时候可以使用闭包创建独立的执行环境。 在JavaScript中,闭包是指封闭的执行环境&#xff…

“论软件开发过程RUP及其应用”写作框架,软考高级,系统架构设计师

论文真题 RUP(Rational Unified Process)是IBM公司的一款软件开发过程产品,它提出了一整套以UML为基础的开发准则,用以指导软件开发人员以UML为基础进行软件开发。RUP汲取了各种面向对象分析与设计方法的精华,提供了一…

Wireshark显示过滤器常用关键字及过滤表达式

Wireshark显示过滤器常用关键字及过滤表达式 1. 过滤器类型 Wireshark抓包工具提供了两种类型过滤器:抓包过滤器 和 显示过滤器。 抓包过滤器: 抓取满足过滤条件的数据包,不满足过滤条件的数据包不会被抓取。 显示过滤器: 包已…

C语言基础⑩——构造类型(结构体)

一、数据类型分类 1、基本类型 整数型 短整型:short(2个字节);整型(默认):int(4个字节);长整型:long(8个字节)&#xf…

延迟队列插件

3.10 1.在opt文件夹里建一个rabbitmq文件夹,把插件放进去 2.拷贝到容器内plugins目录下(rabbitmq是容器的name,也可以使用容器id) docker cp /opt/rabbitmq/rabbitmq_delayed_message_exchange-3.10.0.ez rabbitmq:/plugins 进入 Docker 容器…

Java面试八股之什么是JMS

什么是JMS JMS(Java Message Service)是Java平台中关于面向消息中间件(MOM)的API,用于在分布式环境中发送和接收消息。JMS API提供了一种标准的、与供应商无关的方式,使得Java应用程序能够创建、发送、接收…

分布式数据库在传统车联网厂商的应用实践 | OceanBase案例

本文作者:慧视通科技,梁君 传统车联网厂商运维百亿级数据的痛点与难点 深圳慧视通科技(简称慧视通)作为专业的位置数据综合运营服务提供商,一直深耕智能交通领域,依托车联网、云计算、大数据处理、无线通信…

【STM32+HAL】杆球控制系统

一、前言 2017年电赛出了道板球控制系统题目,现写一个简化版本——杆球控制系统,以此记录电赛集训生活。 二、题目分析 最终采取的方案是:OpenMV读取小球的当前位置,并将坐标值传给STM32端,再由32通过电机改变杆的位置…

Proxmox 8.1.3 系统安装堡塔云 waf 防火墙

堡塔云 waf 工作原理: 堡塔云 waf 是一款Web应用防火墙,区别于传统防火墙,WAF 工作在应用层,对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果,使其免于受到黑客的攻击。 堡塔云 waf 采用半容器化部署&#xff0…

消息中间件相关笔记整理

目录 1. 简述消息队列 2. 常见的的消息队列中间件 2.1 Kafka概念及结构 基本概念名词解释 为什么要设置多个副本? 2.2 Kafka的工作流程 消息生产流程 消息存储流程 消息消费流程 2.3 面试必问题 如何保证消息不丢失? 消费者如何保证消息不重…

JVM垃圾回收算法有哪些

JVM垃圾回收算法有哪些 标记清除算法(mark and sweep) 将垃圾回收分为两个阶段:标记和清除 根据可达性分析算法得出的垃圾进行标记 对标记的内容进行垃圾回收 优点: 标记和清除速度较快 缺点: 碎片化较为严重,内存不连贯 标记整理算法 记录存活的对象,清除需要回收的对…

oracle创建账户

1、查看表空间 SELECT tablespace_name FROM user_tablespaces;2、创建用户 CREATE USER FLINKCDC2 IDENTIFIED BY "123456";也可以使用指定表空间的方式 CREATE USER FLINKCDC2 IDENTIFIED BY "123456" DEFAULT TABLESPACE LOGMINER_TBS QUOTA UNLIMIT…

企业为什么要管理好员工的工作微信?

为什么要管理员工工作微信,可以从以下几个方面进行优化和丰富: 一、优化人力资源配置: 提高工作效率:通过监控和管理员工的工作微信,企业可以确保每位员工的时间被合理分配,专注于与工作相关的沟通和任务…

【区块链+食品安全】基于 FISCO BCOS 联盟链的供应链溯源管理系统 | FISCO BCOS应用案例

冷冻食品企业通常会面临以下痛点: 1. 食品安全问题:无法迅速确定受污染或有质量问题的产品来源,导致召回时效延迟,增加企业的风险和损失。 2. 信息不透明:传统的供应链系统存在记账信息孤岛,数据无法溯源…

opencascade Bnd_Range源码学习区间表示

opencascade Bnd_Range 前言 这个类描述了由两个实数值限定的 1D 空间中的区间。 一个区间可以是无效的,这表示区间中不包含任何点。 方法 1 //! 默认构造函数。创建一个无效区间。 Bnd_Range() : myFirst(0.0), myLast(-1.0) {} 2 //! 构造函数。不会创建无效…

Java后端面试题(redis相关1)(day7)

目录 为什么要用Redis?Redis到底是多线程还是单线程?Redis数据持久化机制RDB方式AOF方式 Redis是单线程,但为什么快?Redis 过期删除策略Redis 内存淘汰策略 为什么要用Redis? 基于内存操作,内存读写速度快k…