容器,只是一种特殊的进程

一个“容器”,实际上是一个由 Linux Namespace、Linux Cgroups 和 rootfs 三种技术构建出来的进程的隔离环境。
  • 虚拟机是在宿主机中安装并运行一个新的操作系统;Docker只是在宿主机创建进程时加上了Namespace参数
  • Docker默认启用的Namespace:PID,UTS,network,user,mount,IPC,cgroup
  • 容器是一个单进程模型,在一个容器中不能同时运行两个不同的应用。
  • 单进程的意思不是只能运行一个进程,而是只有一个进程是docker可控的

隔离与限制

  • 在Linux内核中,有很多资源和对象是不能Namespace化的,比如时间。
  • Linux Cgroups(Linux Control Group)是Linux内核中用来为进程设置资源限制的一个重要功能,主要作用是限制一个进程组能够使用的的资源上限,包括CPU、内存、磁盘、网络带宽等。
  • Cgroups还能对进程进行优先级设置、审计,以及进程挂起恢复。
  • Cgroups以文件和路径的方式组织在/sys/fs/cgroup 路径下,下面的子目录如cpu、memory也叫子系统。

深入理解容器镜像

Mount Namespace

  • Mount Namespace修改的,是容器进程对文件系统“挂载点”的认知。
  • Mount Namespace 跟其他 Namespace 的使用略有不同的地方:它对容器进程视图的改变,一定是伴随着挂载操作(mount)才能生效。

rootfs 根文件系统

  • rootfs是挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统,也就是所谓的“容器镜像”。
  • rootfs 只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。
  • 同一台机器上的所有容器,都共享宿主机操作系统的内核。
  • 容器的 rootfs 由只读层可读写层Init 层组成

UnionFS (Union File System) 联合文件系统

  • Docker 在镜像的设计中,引入了层(layer)的概念。也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量 rootfs。
  • Docker 镜像使用的 rootfs,往往由多个“层”组成。
  • 每一层都是 Ubuntu 操作系统文件与目录的一部分;而在使用镜像时,Docker 会把这些增量联合挂载在一个统一的挂载点上(等价于前面例子里的“/C”目录)

Kubernetes的本质

镜像和容器

  1. 一组联合挂载在 /var/lib/docker/aufs/mnt 上的 rootfs,这一部分我们称为“容器镜像”(Container Image),是容器的静态视图;
  2. 一个由 Namespace+Cgroups 构成的隔离环境,这一部分我们称为“容器运行时”(Container Runtime),是容器的动态视图。

Kubernetes解决的问题

  1. 在一个给定的集群上运行应用。
  2. 路由网关、水平扩展、监控、备份、灾难恢复等一系列运维能力。

Kubernetes项目架构

img

控制节点(Master节点)

  • kube-apiserver 负责API服务
  • kube-scheduler 负责调度
  • kube-controller-manager 负责容器编排
整个集群的持久化数据,由kube-apiserver处理后保存在Etcd中

计算节点(Node节点)

  • kubelet 同容器运行时打交道(比如Docker项目)
  • CRI(Container Runtime Interface):定义容器运行时核心参数的远程调用接口。
  • CNI(Container Networking Interface):容器网络插件
  • CSI(Container Storage Interface):容器存储插件
  • Device Plugin:管理宿主物理设备的组件

Kubenetes的设计思想

  • 从更宏观的角度,以统一的方式来定义任务之间的各种关系,并且为将来支持更多种类的关系留有余地。
  • “声明式 API”。这种 API 对应的“编排对象”和“服务对象”,都是 Kubernetes 项目中的 API 对象(API Object)

Pod

  • Pod 是 Kubernetes 项目中最基础的一个对象。
  • 划分规则:需要非常频繁的交互和访问,或直接通过本地文件进行信息交换的应用。
  • Pod 里的容器共享同一个 Network Namespace、同一组数据卷

Service

  • Service 服务的主要作用,就是作为 Pod 的代理入口(Portal),从而代替 Pod 对外暴露一个固定的网络地址。
  • Service 后端真正代理的 Pod 的 IP 地址、端口等信息的自动更新、维护,则是 Kubernetes 项目的职责。

其他

  • Secret:保存在etcd里的键值对数据,Web应用Pod启动时挂载到容器里,通过Secret访问数据库。
  • Job:一次性运行的 Pod(比如,大数据任务)
  • DaemonSet:每个宿主机上必须且只能运行一个副本的守护进程服务
  • CronJob:定时任务

IT小马
1.2k 声望166 粉丝

Php - Go - Vue - 云原生