DEVOPS: 容器与虚拟化与云原生

概述

  • 传统虚拟机,利用 hypervisor,模拟出独立的硬件和系统,在此之上创建应用
  • 虚拟机是一个主机模拟出多个主机
  • 虚拟机需要先拥有独立的系统
  • docker 是把应用及配套环境独立打包成一个单位
  • docker 是在主机系统中建立多个应用及配套环境
  • docker 是进程级的隔离
  • 如下图所示:

Devops

  • DevOps 是一个必然趋势,是一种方法,也是一种观念
  • 原始的互联网公司工作模式是瀑布流,但用户越多,需求越大,公司的管理,人力成本都是问题
  • 而如果更新间隔太慢,一定会导致用户的满意程度下滑,DevOps 的观念应运而生
  • DevOps 实际上是两个单词:Development 和 Operations
  • 开发人员:根据需求情况,把需求拆分成多个小需求,小步快跑大幅增加需求完成的频率
  • 运维人员:运用自动化和 CI/CD 的概念,运用工具,实现稳定、快速的版本更新上线
  • 打破开发人员和运维人员的壁垒
  • 对运维人员的技术要求和经验大大提升。
    • 开发人员根据需求情况,把需求拆分成多个小需求,小步快跑大幅增加完成需求频率
    • 运维人员是运用自动化 CI/CD 的概念,运用工具,实现稳定,快速的版本更新上线
    • 运维和开发往底层说,实际就是岗位要的东西不一样
    • 运维要的是保持业务的稳定持续运行,开发是为了快速开发,开发完就快速上线
    • 一个要稳定,一个要赶紧上线,开发上线的越多,更新的就越多,运维就更不稳定
  • 可能产生的问题
    • 问题 1:资源利用率
      • 服务器的治理,环境的迁移容灾上会产生问题,一个虚拟机要管多个配置的话
      • 治理起来一定是难度更大的,端口容易冲突,一个虚拟机跑多个项目
      • 治理、迁移、容灾?
    • 问题 2:扩容不及时
      • 脚本化启动 50 台虚拟机要多久?
      • 脚本化启动 50 台容器要多久?
      • 环境部署要多久?
      • 风险大不大?

容器

1 ) 容器是什么

  • 一艘船的载重比如是 10000 吨,卡车本身体积很大
  • 所有卡车上船加上货物也就 2000 吨,大部分载重都浪费了
  • 但船不能少,油费人工等成本也不能少
  • 这怎么办?是不是可以造小一点的船,载重也不用那么大,多造几艘,这样是不是解决了?
  • 后来仔细一想,卡车完全没必要上船,只要货物上去就可以了!到了码头再卸下来
  • 有人专门做过实验:如果运啤酒,用原始的卡车方法全程陆运,每吨成本是 27 美金
  • 且非常慢, 如果用卡车运送到码头------卸载到船上------船到另一个码头------再装再到终端卸载
  • 成本是 25美分!节省了 99%左右的运输成本。且因为船的负载和卡车负载根本没法比
  • 效率还大大提高了,之后 Container(集装箱,容器)改变了整个世界物流行业的面貌
  • 极大地推动了物流生产力的发展。到现在,集装箱都是外贸、零售、电商等交易的必不可少的环节
  • 我个人不太喜欢把 container 翻译成容器,我更想把他叫做"集装箱"
  • 现在是谁把"容器"命名成为 container 我暂时没办法考证,但我真心佩服这位命名者
  • 它起这个名字,首先是非常形象,甚至解决的问题和解决的方案都能看到集装箱的影子
  • 更重要的是,我能感受到他想要改变 IT 生态的一个理想和决心,而且他做到了!如他的命名
  • 容器是什么?简单说,他就是一个集装箱,这个集装箱可以在各个系统之间来回搬运
  • 集装箱里面,放着的是一个或多个应用,以及运行环境
  • 作用简而言之,就是把环境和应用封装成一个标准的单元,用于开发、部署、交付等环节
  • 他解决了几个重要的问题:
    • 一个应用,因为环境不同,可能会出现各种各样本可以避免的问题
    • 一个系统中,多个应用之间可能引发的各种冲突故障
    • 相比传统虚拟化,不吃资源、节省成本

2 )注意

  • 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样
  • 镜像是静态的定义,容器是镜像运行时的实体
  • 容器可以被创建、启动、停止、删除、暂停等
  • 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名 空间
  • 前面讲过镜像使用的是分层存储,容器也是如此
  • 容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡
  • 因此,任何保存于容器存储层的信息都会随容器删除而丢失

容器和虚拟化比较

1 )特性

  • 再次提高服务器资源利用率
  • 重量更轻,体积更小
  • 匹配微服务的需求
  • 保持多环境运行的一致性
  • 快速部署迁移,容错高
  • 安全性较差
  • 多容器管理存在难度。
  • 稳定性较差
  • 排错难度较大

2 )与虚拟机的比较

容器 虚拟机
启动速度 秒级 分钟级
性能 接近原生 较弱
内存代价 很少 较多
硬盘使用 一般为 MB 虚拟机 一般为 GB
运行密度 单机支持千个容器 一般几十个
隔离性 安全隔离 完全隔离
迁移性 优秀 一般

3 ) 优缺点

  • 容器的优点
    • 再次提高服务器资源利用率
    • 重量更轻,体积更小
    • 匹配微服务的需求
    • 保持多环境运行的一致性
    • 快速部署迁移,容错高
  • 虚拟机的缺点
    • 安全性较差
    • 多容器管理存在难度
    • 稳定性较差
    • 排错难度较大

4 ) 容器与镜像

  • 镜像可以看做是一个压缩包,里面包含所需要的应用和应用要的配置文件及底层的库、参数、环境变量等
  • 容器是运行这个压缩包,实现具体功能的存在

docker 与容器

1 )docker

  • docker13 年初开源,公司本来叫 dotcloud,后改名叫 docker
  • 被 Mitantis 收购。基于Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术
  • 对进程进行封装隔离,属于操作系统层面的虚拟化技术
  • 由于隔离的进程独立于宿主和其他的隔离的进程,因此也称其为容器
  • docker 镜像是简化的 linux
    • 镜像里面只包含两种东西,它的依赖环境和它实际要做的一个应用
    • 镜像是把它两个融合在一起的
    • 就是应用和它底层的一些依赖环境变量,或者一些参数也好等等
    • 它把它们融合到一起了

2 ) 区别

  • docker 就是容器,容器就是 docker,并不是这样的,容器就是一个技术类型
  • 而 docker 是当下最主流的,容器的一种实现容器的方案
  • docker 只是容器其中一种实现方案,其他方案包括:LXC,Mesos,RKT 等等
  • 最大区别当容器和服务器的数量达到一定规模的时候,就会碰到管理的问题
  • 即如何有效管理大量的服务器和容器,保证应用的稳定运行、方便升级和故障的快速解决
  • 容器编排工具提供图形化界面或者命令行来管理容器和服务器集群
  • 提供容器配置、任务发布、服务发现、负载均衡、系统监控和故障恢复、声明式系统配置
  • 以及有关容器部署和性能的规则和约束定义机制等

3 )进程级封装

  • docker 或者容器和传统虚拟化最大的一点区别
  • 就是虚拟化的封装是系统级的封装,docker或者其他容器是进程级的封装
  • 和传统虚拟化最大的一点区别,就是虚拟化是系统级的封装,进程级封装
  • 用户量越来越大,功能越来越多。代码越来越重。耦合越来越高
  • 一旦某个哪怕小的逻辑出错,甚至会影响整个站点
  • bug 频率大增,bug 频率增加耦合越来越高,简直对于互联网公司来说就是灾难
  • 代码重复率高,维护难度大
  • 代码越来越吃性能,服务器成本大增

4 )docker 底层技术

4.1 Namespaces

作用:访问隔离

  • Docker 主要就是借助 Linux 内核技术 Namespace 来做到隔离的,Linux Namespaces 机制提供一种资源隔离方案
  • PID,IPC,Network 等系统资源不再是全局性的,而是属于某个特定的 Namespace
  • 每个 namespace 下的资源对于其他 namespace 下的资源都是透明,不可见的
  • 因此在操作系统层面上看,就会出现多个相同 pid 的进程
  • 系统中可以同时存在两个进程号为 0, 1,2 的进程,由于属于不同的 namespace,所以它们之间并不冲突
  • 而在用户层面上只能看到属于用户自己 namespace 下的资源
  • 例如使用 ps 命令只能列出自己 namespace 下的进程
  • 这样每个 namespace 看上去就像一个单独的 Linux 系统

4.2 Control groups

作用:做资源控制,CPU\MEM\宽带等

  • 提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘 IO 等等)
    的机制,被 LXC、docker 等很多项目用于实现进程资源控制
  • cgroup 将任意进程进行分组化管理的 Linux 内核功能
  • cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构
  • I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的

4.3 Rootfs

作用:文件系统隔离

k8s-容器编排管理工具

1 ) K8s 功能

  • 微服务需要跑多个容器,容器多又会涉及到通信、架构、伸缩、更新、监控等等问题
  • 自愈:重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器
  • 弹性伸缩:通过监控容器的 cpu 的负载值,如果这个平均高于 80%,增加容器的数量,如果这
    个平均低于 10%,减少容器的数量
  • 服务的自动发现和负载均衡:不需要修改应用程序来使用不熟悉的服务发现机制

2 )K8s 作用

  • Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡
  • 滚动升级和一键回滚
    • Kubernetes 逐渐部署对应用程序或其配置的更改
    • 同时监视应用程序运行状况,以确保它不会同时终止所有实例
  • 如果出现问题,Kubernetes 会恢复更改,利用日益增长的部署解决方案的生态系统
  • 要使用 Kubernetes,你需要用 Kubernetes API 对象 来描述集群的 预期状态(desired state)
  • 包括你需要运行的应用或者负载,它们使用的镜像、副本数,以及所需网络和磁盘资源等等
  • 你可以使用命令行工具 kubectl 来调用 Kubernetes API 创建对象,通过所创建的这些对象来配置预期状态
  • 你也可以直接调用 Kubernetes API 和集群进行交互,设置或者修改预期状态
  • 一旦你设置了你所需的目标状态,Kubernetes 控制面(control plane)
    • 会通过 Pod 生命周期事件生成器( PLEG ),促成集群的当前状态符合其预期状态
    • 为此,Kubernet es 会自动执行各类任务
    • 比如运行或者重启容器、调整给定应用的副本数等等
  • Kubernetes 控制面由一组运行在集群上的进程组成

云原生

  • 云原生是一个生态概念、是一线互联网公司发展到某个极端的必然选择
  • 包含三大要素:容器及编排管理、DevOps、微服务

1 )技术模块

  • 应用定义及部署(App Definition and Development)
  • 编排与管理(Orchestration & Management)
  • 运行环境(Runtime)
  • 配置(Provisioning)
  • 平台(Platform)
  • 可观测性和分析(Observability and Analysis)
  • 无服务(Serverless)

2 )云原生时代

  • 技术升级,概念先行。云原生、容器、devops 等一定是未来若干年的发展方向
  • 为什么说容器划时代?
    • 一方面容器解决了大型架构的发展瓶颈
    • 另一方面,从运维岗位讲,传统运维已经跟不上脚步了
    • 会新技术的运维一定会取代传统运维,更别说其他运维岗位
  • docker 是云原生时代的基石也是应用基础
  • 而这个基础也需要有一定的经验积累才能学通
  • 所以,对运维的要求越来越高

云原生的技术栈

  • 云原生的技术栈实际上三个方面,devops,微服务,还有一块是容器 K8s,从系统层次来看,从上到下分别是:
    • 应用层:应用定义及部署(App Definition and Development)、配置(Provisioning)、可
      观测性和分析(Observability and Analysis)、无服务(Serverless)
    • 集群:编排与管理(Orchestration & Management)
    • 底层运行环境:运行环境(Runtime)
相关推荐
kaiyuanheshang7 小时前
docker 中的entrypoint和cmd指令
运维·docker·容器·cmd·entrypoint
Python私教8 小时前
除了 Docker,还有哪些类似的容器技术?
运维·docker·容器
杨浦老苏10 小时前
开源无代码网络数据提取平台Maxun
低代码·docker·群晖
petaexpress12 小时前
5种常见的k8s云原生数据管理方案详解
云原生·kubernetes·k8s云原生
颜淡慕潇14 小时前
【K8S系列】深入解析 Kubernetes 中的 Deployment
后端·云原生·容器·kubernetes
zwm_yy15 小时前
docker-mysql
mysql·docker·容器
Linux运维老纪18 小时前
linux系统运维面试题(二)(Linux System Operations Interview Questions II)
linux·服务器·面试·云计算·运维开发·devops
FinelyYang18 小时前
docker+容器+redis+minio+java jar,实现开机自启动
运维·docker·容器
hong16168821 小时前
Docker 启动和停止的精准掌舵:操控指南
docker·容器·eureka