云原生技术基石---容器化技术知识分享(一)

为什么要有容器技术?

任何一个技术都不是凭空出现的,他们出现一定是解决了一些问题。

传统开发面临的实际问题

列举几个常见的情况

  • 开发环境和生产环境不一致:
    例如:
    本地使用windows系统,服务器端使用Linux;
    本地使用某些字体,但服务器端不存在相关字体,造成一些文案的诡异问题;
    应用程序运行依赖不一致导致的奇奇怪怪问题,某sdk在1.0.0具有xxxx api接口,但是在1.0.1做了微调,导致程序在开发环境和生产预期结果不一致

  • 服务器成本问题
    任何一个老板都想压缩服务器成本,节约开支(别问我是怎么知道的,刚被砍了50%机器预算,手动狗头)
    员工在测试的时候,能用一台机器,绝不会让你用两台,不管你有多少不同的迭代任务

  • 应用程序在同一个机器上,发生资源争抢等问题
    A同学测试某计算业务,需要大量使用CPU,B同学在此机器做同样测试,则AB同学无法获取准确的测试结果
    内存问题、硬盘问题,同理

Linux操作系统中如何处理这些资源问题?

  • 多用户
    每人一个账户,不同账户权限不同,账户的资源数据可以收到保护,但是用户一旦过多,资源争抢问题不好控制,需要写很多配置文件,不便利
  • 多进程
    账户情况下不好控制,那么就采用进程方式做补充控制,只要管控好进程之间的资源分配就好了,但是无法实时调整每个进程的资源使用情况,个别进程处于运行状态的话,一旦重启进程,直接数据丢失

那么有没有一种解决方式,可以轻易的划分资源,快速启动应用的方式呢?有,就是容器化

容器化和传统虚拟化的区别

  • 传统虚拟化(VM)是模拟了整个计算机操作系统,包括内核在内,由此可见,模拟的资源多,能做到os完全隔离,但是同样,启动会慢,消耗的资源也会增加一些
  • 容器化是利用Linux的特性,做了资源隔离,并包含打包的应用的独立用户模式进程,通过资源隔离和打包的方式,做到进程和资源的隔离,但是缺点就是,容器内的资源可能会互相产生影响,比如4C的机器,其中某个占用2C的容器把cpu跑满时候,其他的容器会因为CPU只剩下2c,而受到影响

为什么说云原生的基石是容器技术

云原生离不开云计算,通过云计算,应用程序可以充分发挥云端特性,云计算是分布式计算的一种,指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,然后,通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。(核心特点:快速部署、按需伸缩、不停机交付等)
最鲜明的特点就是弹性伸缩,需要快速启动/停止应用程序处理突发流量,VM很显然不适合这种情况,无论是资源占用,还是启动速度,VM都不合适,相反,轻量级的容器就很适合云计算,以容器作为应用程序载体,快速的启动/停止程序,使得应用具备弹性能力

关于容器化,这里涉及到一些关键点,资源隔离是如何实现的

Linunx资源隔离

NameSpace

官方文档地址:https://man7.org/linux/man-pages/man7/namespaces.7.html
简单翻译下就是:
namespace是对系统资源的一种封装: 可以使得进程看起来拥有独立的资源一样.
常见的Linux namespace

名称 查看位置 支持的版本 说明
cgroup /proc/[pid]/ns/cgroup since Linux 4.6 控制进程使用的资源,(如限制内存最大使用量)
IPC /proc/[pid]/ns/ipc since Linux 3.0 隔离进程间通信
Mount /proc/[pid]/ns/mnt since Linux 3.8 使得各进程仿佛有各自的文件系统
Network /proc/[pid]/ns/net since Linux 3.0 进程可以有独立的网络空间
PID /proc/[pid]/ns/pid since Linux 3.8 隔离pid
USER /proc/[pid]/ns/user since Linux 3.8 隔离用户
UTS(UNIX Time-Sharing) /proc/[pid]/ns/uts since Linux 3.0 隔离nodename,hostname

实际上,Linux内核实现NameSpace的主要目的,就是为了实现轻量级虚拟化技术服务。在同一个NameSpace下的进程合一感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,仿佛自己置身一个独立的系统环境中,以达到隔离的目的。

下一篇文章说说 cgroup 和 Docker之间的一些东西

你可能感兴趣的:(云计算,云原生,云原生,服务器,linux)