容器化学习——我们为什么要使用容器
近期工作上开始接触了大量容器化和华为云云容器引擎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服务就介绍了在公有云和私有云场景下无缝迁移的经典案例:
为什么需要拥有独立的系统资源和资源配额
从上文可知, 操作系统层面的虚拟化就是我们熟知的容器化,他的核心是拥有独立的系统资源和资源配额。
那么为什么我们需要独立的系统资源和资源配额呢?
考虑一个真实场景,一个后端开发团队正在为一个快速增长的在线电商平台工作。在一个重要的促销活动期间,支付服务的流量急剧增加,开始消耗大量资源。如果没有容器化,异常的支付服务可能会占用大部分服务器资源(例如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"
- 点赞
- 收藏
- 关注作者
评论(0)