容器化学习——我们为什么要使用容器

举报
breakDawn 发表于 2023/12/24 20:41:41 2023/12/24
【摘要】 近期工作上开始接触了大量容器化和华为云云容器引擎CCE的内容,因此整理学习了一堆有关容器化的知识,特此进行分享。在学习容器化之前,首先要了解一个内容,为什么要使用容器,好处是什么? 兼容性问题我们在工程实践中,经常会遇到一些兼容性的问题,比如:ISA兼容:目标机器指令集的兼容性ABI兼容:目标系统或者依赖库的二进制兼容性环境兼容: 目标环境的兼容性。例如环境变量、配置、注册中心等。以一个多服...

近期工作上开始接触了大量容器化和华为云云容器引擎CCE的内容,因此整理学习了一堆有关容器化的知识,特此进行分享。

在学习容器化之前,首先要了解一个内容,为什么要使用容器,好处是什么?

兼容性问题

我们在工程实践中,经常会遇到一些兼容性的问题,比如:

  • ISA兼容:目标机器指令集的兼容性
  • ABI兼容:目标系统或者依赖库的二进制兼容性
  • 环境兼容: 目标环境的兼容性。例如环境变量、配置、注册中心等。

以一个多服务的Web应用为例,它由多个微服务组成,每个服务都有自己的依赖和环境需求。在传统部署模型中,开发团队可能会面临将这些服务部署到不同操作系统版本的服务器上的挑战。这就引入了一系列兼容性问题。比如,一个服务使用的某个库版本可能与另一个服务器上的库版本冲突(ABI兼容),或者服务期望的某个环境变量在新的部署环境中不存在(环境兼容)。

我们期望自己的程序能够在不同的环境下兼容运行,减少反复适配的工作量。因此产生了虚拟化技术,专用用于关于解决兼容性问题。

虚拟化技术

虚拟化技术有以下5种:

  • 指令集虚拟化。用软件模拟不同ISA架构的处理器过程。 例如QEMU和Bochs,甚至可以做到在web上运行操作系统。但是性能损失大
  • 硬件抽象层虚拟化。 用软件来模拟计算机里的各种硬件设施。例如VMware等虚拟机。
  • 操作系统层虚拟化。 不会提供真实的操作系统,而是采用隔离手段使不同进程拥有独立的系统资源和资源配额。我们熟知的容器化就是指在这个层面的虚拟化,已经成为现代软件开发和部署的重要组成部分,特别是在云计算和微服务架构中。
  • 运行库层虚拟化。 使用软件翻译的方法来模拟系统。例如WINE和WSL。它通过在不同操作系统之间提供一个兼容层来运行非本地应用程序,这种技术在使旧软件适应新系统、跨平台运行应用程序等方面特别有用。
  • 语言层虚拟化。例如经典的java虚拟机JVM技术,它使得Java应用可以“一次编写,到处运行”。

可以看到通过虚拟化,能够极大地提高了软件和硬件的利用率,避免了大量的人力重复工作,增强了系统的安全性和灵活性。

虚拟化类型 工具示例 主要用途
指令集虚拟化 QEMU, Bochs 在web上运行操作系统 ,性能损失大
硬件抽象层虚拟化 VMware 模拟各种硬件设施
操作系统层虚拟化 Docker, Kubernetes 隔离进程,独立资源配额
运行库层虚拟化 WINE, WSL 兼容不同操作系统
语言层虚拟化 JVM 一次编写,到处运行

容器化解决兼容性问题的实例:

假设一家公司使用Spark进行数据分析和机器学习,定期处理大量数据,面临不同任务的资源和时间需求。传统Spark与YARN结合的大数据环境配置复杂,环境或系统不匹配可能导致扩展时出现异常。
但引入Kubernetes和容器化后,应用及其依赖在任何环境(不同的物理机、虚拟机,不同的操作系统)都能一致运行。
这简化了环境兼容性问题,加速了部署和扩容。借助Kubernetes的自动扩展和自愈能力,Spark作业管理变得更简单高效,显著提升大数据业务的稳定性和响应能力。

又例如下图所示,CCE服务就介绍了在公有云和私有云场景下无缝迁移的经典案例:
image.png

为什么需要拥有独立的系统资源和资源配额

从上文可知, 操作系统层面的虚拟化就是我们熟知的容器化,他的核心是拥有独立的系统资源和资源配额。
那么为什么我们需要独立的系统资源和资源配额呢?

考虑一个真实场景,一个后端开发团队正在为一个快速增长的在线电商平台工作。在一个重要的促销活动期间,支付服务的流量急剧增加,开始消耗大量资源。如果没有容器化,异常的支付服务可能会占用大部分服务器资源(例如CPU和内存),导致影响其他服务例如认证服务变慢,订单处理延迟,最终影响用户体验和销售。

但是,如果每个服务都在自己的容器中运行,并且有明确的资源限制,即使支付服务在高峰期间流量激增,其他服务也能继续正常运行,确保平台的稳定性和可靠性。

关于上面这个问题,可以先举一个简单的例子进行
使用k8s部署服务时,往往会设置每个POD(关于什么是pod后面的文章会进行解释)的cpu上限和内存使用上限, 这样即使一个程序发生了故障或者业务负载过高,他也不会影响另一个业务的cpu和内存的使用。
如果写成yaml就是下面这样,里面的memory和cpu的申请值和上限值,成了容器的一个“边界”,实现了各自的互相保护。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: payment-service
spec:
  replicas: 2
  selector:
    matchLabels:
      app: payment
  template:
    metadata:
      labels:
        app: payment
    spec:
      containers:
      - name: payment-container
        image: payment-image:latest
        resources:
          requests:
            memory: "500Mi"
            cpu: "0.5"
          limits:
            memory: "1Gi"
            cpu: "1"
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。