开发者学堂课程【Kubernetes 入门: 理解 Pod 和容器设置模式(一)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/51/detail/1010
理解 Pod 和容器设置模式(一)
内容介绍
一、为什么我们需要 Pod?
二、Pod 的实现机制
三、详解容器设计模式
一、为什么我们需要 Pod?
先回顾一下容器的基本概念
1、容器的本质是?
l 一个视图被隔离、资源受限的进程
l 容器里 PID =1的进程就是应用本身
l 管理虚拟机=管理基础设施;管理容器=直接管理应用本身
2、那么 Kubernetes 呢?
l Kubernetes 就是云时代的操作系统!
l 以此类推,容器镜像其实就是︰这个操作系统的软件安装包
3、再来看一个真实操作系统里的例子
举例: helloworld 程序
l helloworld 程序实际上是由一组进程(Linux 里的线程〉组成
l 这4个进程共享 helloworld 程序的资源,相互协作,完成 helloworld 程序的工作
4、思考
l Kubernetes =操作系统(比如:Linux)
l 容器=进程(Linux 线程)
l Pod = ?
l 进程组(Linux 线程组)
5、“进程组”
举例:
l helloworld 程序由4个进程组成,这些进程之间共享某些文件
l 问题: helloworld 程序如何用容器跑起来呢?
l 解法一:在一个 Docker 容器中,启动这4个进程
l 疑问︰容器 PID= 1的进程就是应用本身比如 main 进程,那么"谁"来负责管理剩余的3个进程?
l 容器是“单进程”模型!
l 除非:
l 应用进程本身具备"进程管理"能力〈这意味着: helloworld 程序需要具备 systemd 的能力)
l 或者,容器的 PID=1进程改成 systemd
l 这会导致︰管理容器=管理 systemd !=直接管理应用本身
6、Pod =“进程组
Pod:一个逻辑单位,多个容器的组合
Kubernetes 的原子调度单位
$spstree -p
…
|-helloworld,3062l
|-{api} ,3063
|-{main} ,3064
|-{ log} ,3065
|-{compute} ,3133
apiversion: v1
kind: Pod
metadata:
name: helloworld
spec:
containers:
- name: api
image: api
ports:
- containerPort: 80
- name: main
image: main
- name: log
image: log
volumeMounts:
- name: log-storage
- name: compute
image: compute
volumeMounts:
- name: data-storage
7、来自 Google Borg 的思考
Google 的工程师们发现,在 Borg 项目部署的应用,往往都存在着类似于“进程和进程组”的关系。更具体地说,就是这些应用之间有着密切的协作关系,使得它们必须部署在同一台机器上并且共享某些信息
Large-scale cluster management at Google with Borg, EuroSys'15
8、为什么 Pod 必须是原子调度单位?
1、举例:两个容器紧密协作
l App:业务容器,写日志文件
l LogCollector:转发日志文件到 ElasticSearch 中
2、内存要求:
l App: 1G
l LogCollector: 0.5G
3、当前可用内存:
l Node_A: 1.25G
l Node_B: 2G
4、如果 App 先被调度到了 Node_A 上,会怎么样?
5、Task co-scheduling 问题
l Mesos:资源囤积(resource hoarding) :
l 所有设置了 Affinity 约束的任务都达到时,才开始统一进行调度
l 调度效率损失和死锁
6、Google Omega︰乐观调度处理冲突︰
l 复杂
7、Kubernetes: Pod
l 再次理解 Pod
l 亲密关系-调度解决
l 两个应用需要运行在同一台宿主机上
l 超亲密关系- Pod 解决
l 会发生直接的文件交换
l 使用 localhost 或者 Socket 文件进行本地通信
l 会发生非常频繁的 RPC 调用
l 会共享某些 Linux Namespace (比如,一个容器要加入另一个容器的 Network Namespace)