为什么需要Kubernetes

在了解Kubernetes之前,我们需要先了解部署方式的时代变迁

传统部署时代

早期的部署方式通常在物理机上以最简单粗暴的方式进行部署,所有应用都部署在同一台物理机上。

这种部署方式存在什么弊端呢?

如果在一台物理机上部署三个应用,其中一个应用由于各种原因会耗费大量cpu或内存资源,试问:这是否会影响到其他两个应用的正常运行?若其中一个应用存在安全漏洞,是否会威胁到其他两个程序?

答案是肯定的。一台物理机无法解决**资源分配问题**,而解决方案只能通过增加物理机数量,将每个应用单独部署在各自的物理机上才能够实现环境隔离。同时,没有任何环境隔离措施会提高其他程序被入侵的可能性,安全性极低。

虚拟化部署时代

为了解决上述只能通过增加物理机的方式来解决资源分配问题和环境隔离问题,虚拟化技术应运而生,这种部署方式能够实现在单个物理服务器的 CPU 上运行多个虚拟机 (VM),每个虚拟机都是一台完整的机器,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。然而,这种隔离方式简单粗暴,将大量的资源都分配到了各自的虚拟操作系统上,导致真正的隔离使用空间占比缩小,而资源从来都是希望被压榨的。

容器化部署时代

容器部署从来部署虚拟化部署的替代者,二者在不同场景有着各自的优缺点,但从历史角度来看,容器的诞生确实给本属于虚拟化的部署方案提供了新的思路。容器与虚拟机类似,但具有宽松的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。与虚拟机类似,容器有自己的文件系统、CPU 共享、内存、进程空间等。

容器之所以变得流行,是因为它们提供了额外的好处,例如:

  1. 敏捷的应用程序创建和部署:与使用虚拟机映像相比,容器映像创建的简便性和效率更高。
  2. 持续开发、集成和部署:提供可靠且频繁的容器映像构建和部署,并具有快速高效的回滚。
  3. 开发和运维关注点分离:在构建/发布时而不是部署时创建应用程序容器映像,从而将应用程序与基础设施解耦。
  4. 可观察性:不仅显示操作系统级别的信息和指标,还显示应用程序运行状况和其他信号。
  5. 开发、测试和生产的环境一致性:在笔记本电脑上运行与在云中运行相同。
  6. 云和操作系统分发可移植性:在 Ubuntu、RHEL、CoreOS、本地、主要公共云和其他任何地方运行。
  7. 以应用程序为中心的管理:将抽象级别从在虚拟硬件上运行操作系统提高到使用逻辑资源在操作系统上运行应用程序。
  8. 松散耦合、分布式、弹性、自由的微服务:应用程序被分解为更小的、独立的部分,并且可以动态部署和管理------而不是在一台大型单一用途机器上运行的整体堆栈。
  9. 资源隔离:可预测的应用程序性能。
  10. 资源利用:高效率、高密度。

Kubernetes充当什么角色

上述的部署只字未提Kubernetes,这和Kubernetes有什么关系呢?

讲到容器,就不得不讲到docker,我们可以很简单的从docker仓库中通过docker pull <image>来拉取我们想要的镜像资源到本地并快速部署,已微服务为例,我们可能需要拉取的镜像有:MySQL、Redis、RabbitMQ、ES、Nacos等等公共组件,同时还会本地编译自己开发的程序作为镜像,甚至还包括各种大数据组件等。

如此多的镜像,仅仅作为单体就已经达到了十几个容器,更何况还需要做集群部署,请根据以下信息求此时运维的心理阴影面积。

  1. 领导怕服务宕机,要求每个服务起码做三个集群:搭建不起来,扣钱。
  2. 领导怕服务宕机,要求运维时刻关注服务运行状态:出了问题未及时反馈,扣钱。
  3. 领导改了一个需求,需要重新发布版本:影响线上服务,扣钱。
  4. 领导需求有问题,需要回滚重新发布:领导微微一笑说了句:"抱歉,辛苦了",回滚不了,扣钱。

什么,你们公司没有运维?领导的眼睛慢慢转向了开发......

你应该感谢Google公司给你带来的Kubernetes,你可以把它理解为一个容器管理服务,他可以:

  1. 服务发现和负载均衡:Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
  2. 存储编排:Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
  3. 自动部署和回滚:你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
  4. 自动完成装箱计算:你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
  5. 自我修复:Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
  6. 密钥与配置管理:Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
  7. 批处理执行:除了服务外,Kubernetes 还可以管理你的批处理和 CI(持续集成)工作负载,如有需要,可以替换失败的容器。
  8. 水平扩缩:使用简单的命令、用户界面或根据 CPU 使用率自动对你的应用进行扩缩。
  9. IPv4/IPv6 双栈:为 Pod(容器组)和 Service(服务)分配 IPv4 和 IPv6 地址。
  10. 为可扩展性设计:在不改变上游源代码的情况下为你的 Kubernetes 集群添加功能。

学习Kubernetes是一个复杂的过程,里面包含了各种组件概念,但我们可以先对Kubernetes做一个简单的概括:

Kubernetes的核心理念就是达到期望值

如何理解期望值

在Kubernetes中有一种重要的文件格式:yaml。在yaml中通过对某个服务进行期望配置,例如:

  1. 我希望将此服务生成三个集群,只需要在yaml中将相关配置设置为3,这样,Kubernetes就会生成三个相同的服务,并且他们对外的代理端口都是一致的,相反的,如果后续需要关闭两个服务,只需要将值设置为1即可,Kubernetes会将两个服务关闭。
  2. 我需要做版本更新,只需要在yaml中将相关配置的V1设置为V2,这样,Kubernetes就会重新拉取最新镜像进行部署,且在部署过程中不会停止老应用,而是非常简单地就实现了金丝雀发布。
  3. 若在使用过程中,某个服务因过载或者意外情况宕机了,Kubernetes会立即重新启动一个服务以尽快达到期望值。
相关推荐
YCyjs8 小时前
K8S群集调度二
云原生·容器·kubernetes
Hoxy.R8 小时前
K8s小白入门
云原生·容器·kubernetes
景天科技苑19 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge19 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇19 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
昌sit!1 天前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
A ?Charis1 天前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
北漂IT民工_程序员_ZG1 天前
k8s集群安装(minikube)
云原生·容器·kubernetes
2301_806131362 天前
Kubernetes的基本构建块和最小可调度单元pod-0
云原生·容器·kubernetes
SilentCodeY2 天前
containerd配置私有仓库registry
容器·kubernetes·containerd·镜像·crictl