容器,只是一种特殊的进程
一个“容器”,实际上是一个由 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的本质
镜像和容器
- 一组联合挂载在 /var/lib/docker/aufs/mnt 上的 rootfs,这一部分我们称为“容器镜像”(Container Image),是容器的静态视图;
- 一个由 Namespace+Cgroups 构成的隔离环境,这一部分我们称为“容器运行时”(Container Runtime),是容器的动态视图。
Kubernetes解决的问题
- 在一个给定的集群上运行应用。
- 路由网关、水平扩展、监控、备份、灾难恢复等一系列运维能力。
Kubernetes项目架构
控制节点(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:定时任务
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。