【公开课】理解 Pod 和容器设计模式|学习笔记

简介: 快速学习【公开课】理解 Pod 和容器设计模式

开发者学堂课程【理解 Pod 和容器设计模式公开课】理解 Pod 和容器设计模式】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/826/detail/13946


【公开课】理解 Pod 和容器设计模式


内容介绍:

一、为什么我们需要 Pod


一、为什么我们需要 Pod

Pod 是 Kubernetes 项目中一个重要的概念,是一个非常最要的原子

1.容器的基本概念

容器的本质:

一个视图被隔离、资源受限的进程

容器里 PID =1 的进程就是应用本身

管理虚拟机=管理基础设施;管理容器=直接管理应用本身

是不可变基础设施最佳的体现

那么 Kubernetes 呢?

Kubernetes 就是云时代的操作系统!

以此类推,容器镜像其实就是:这个操作系统的软件安装包

2.真实操作系统案例

举例: helloworld 程序

helloworld 程序实际上是由一组进程(Linux 里的线程)组成

$ pstree -p

...

|helloworld,3062l

|  |-{api},3063

|  |-{main} ,3064l

|  |-{log} ,3065

|  、-{ compute} ,3133

进程等同于 Linux 里的线程

在 Linux 里查看 helloworld 里面的 pstree

有四个线程组成,api、main、log、compute

这4个进程共享 helloworld 程序的资源,相互协作,完成 helloworld 程序的工作

思考

Kubernetes =操作系统(比如:Linux)

容器=进程(Linux 线程)

Pod = ?

进程组(Linux 线程组)

在真实的操作系统中,一个程序往往是由进程组进行管理

将 Kubernetes 类比为操作系统,如 Linux,也可以类比为进程,容器也可以类比为进程,也就是 Linux 线程,而 Pod 即为进程组,也就是 Linux 线程组这样一个类比关系

3.进程组

举例:

helloworld 程序由4个进程组成,这些进程之间共享某些文件

问题: helloworld 程序如何用容器跑起来呢?

解法一:启动一个 Docker 容器中,启动这4个进程

疑问∶容器 PID= 1的进程就是应用本身比如 main 进程,那么“谁"来负责管理剩余的3个进程?

核心问题:容器是“单进程"模型!

由于容器等于应用等于进程,只能管理 PID=1的进程

除非:

应用进程本身具备"进程管理"能力〈这意味着: helloworld 程序需要具备 systemd 的能力)

或者,容器的 PID=1进程改成 systemd,或者在容器运行 systemd

这会导致:管理容器=管理 systemd !=直接管理应用本身

由于容器实际是一个单进程模型,如果在容器里启动多个进程,只有其中一个可以作为 PID=1的进程,如果 PID=1的进程失败退出了,其他三个进程无法管理和回收资源

如果在容器里运行一个 systemd,用 systemd 来管理其他进程,会出现没办法直接管理应用,应用被 systemd 接管,应用状态的生命周期不等于容器的生命周期

4.Pod=“进程组”

$ pstree -p

...

|helloworld,3062l

|  |-{api},3063

|  |-{main} ,3064l

|  |-{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

image.png

Kubernetes 里面,Pod 实际上是 Kubernetes 项目抽象出来一个可以类比为进程组的概念。四个进程共同组织的一个应用 helloworld,在 Kubernetes 里面实际上会被定义为一个拥有四个容器的 Pod。有四个进程,有四个职责不同相互协作的进程要需要放在容器里运行。

在 Kubernetes 里,并不会他们一起放入一个容器里,在 Kubernetes 中,把四个独立的进程分别用四个独立的容器启动起来,然后定义在一个 Pod 中。当Kubernetes helloworle 运行起来时,实际上会看到四个容器。他们共享某些资源,这些资源都属于 PodPod Kubernetes 中只是一个逻辑单位,没有一个真实的东西对应这个P od。物理上存在的是四个容器,这四个容器的组合成为 Pod,Pod 是 Kubernetes 分配资源的一个单位。因为这些容器它要共享资源,所以 Pod是多个容器的组合 Kubernetes 的原子调度单位

Pod:一个逻辑单位,多个容器的组合 Kubernetes 的原子调度单位

5.来自 Google Borg 的思考

Google 的工程师们发现,在 Borg 项目部署的应用,往往都存在着类似于“进程和进程组”的关系。更具体地说,就是这些应用之间有着密切的协作关系,使得它们必须部署在同一台机器上并且共享某些信息

是进程组的概念,也是 Pod 的用法

- Large-scale cluster management at Google with Borg, EuroSys'15

6.为什么 Pod 必须是原子调度单位

举例:两个容器紧密协作

App:业务容器,写日志文件

LogCollector:转发日志文件到 ElasticSearch 中

内存要求:

App: 1G

LogCollector: 0.5G

当前可用内存:

Node_A: 1.25G

Node_B: 2G

如果 App 先被调度到了 Node_A 上,会怎么样?

LogCollector 无法调度到了 Node_A 上,因为资源不够

整个应用本身出现问题

Task co-scheduling 问题

Mesos:资源囤积(resource hoarding) :

所有设置了 Affinity 约束的任务都达到时,才开始统一进行调度

调度效率损失和死锁

Google Omega:乐观调度处理冲突:

先不管这些冲突,而是通过精心设计回轨机制在出现了冲突之后解决问题

复杂

Kubernetes: Pod

7.再次理解Pod

亲密关系-调度解决

两个应用需要运行在同一台宿主机上

image.png

超亲密关系-Pod 解决

会发生直接的文件交换

使用 localhost 或者 Socket 文件进行本地通信

会发生非常频繁的 RPC 调用

会共享某些 Linux Namespace (比如,一个容器要加入另一个容器的Network Namespace)

image.png


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
2438 4
|
安全 编译器 C语言
动态内存管理(malloc、calloc、realloc)详解
动态内存管理(malloc、calloc、realloc)详解
518 0
|
29天前
|
存储 人工智能 前端开发
以无头 CMS 为核心构建适配全场景的内容中台
内容中台是品牌内容的数字家园,但只有具备灵活性、可扩展性和用户中心性才能发挥价值。无头CMS为搭建这样的内容中台提供了坚实基础,让团队摆脱传统平台的束缚,专注于核心——创作能引发共鸣、驱动成果的内容。
199 113
|
弹性计算 数据可视化 机器人
基于ECS搭建ROS Kinetic机器人操作系统
将ROS机器人操作系统搭建至云端,实现远程的机器人控制
1051 1
|
数据采集 人工智能 机器人
RPA与爬虫:自动化工具的本质差异与选择指南
本文深入解析RPA与爬虫的本质差异,帮助企业根据业务需求明智选型。RPA侧重内部流程自动化,爬虫专注外部数据采集。内容涵盖技术原理、应用场景、优劣势对比及主流RPA工具介绍,助力把握自动化趋势,提升效率。
1121 0
|
11月前
|
自然语言处理 搜索推荐 BI
体育直播比分网搭建需要注意哪些问题
搭建体育直播比分网需关注版权合法性、实时数据获取、直播功能、SEO优化、支付广告及多语言支持。确保版权授权合法,选择可靠数据源,保障数据更新频率和直播稳定性。通过SEO优化和社交媒体推广吸引更多流量,集成广告平台和支付网关实现盈利。提供多语言界面和本地化内容以服务全球用户。
253 11
|
自然语言处理 监控 关系型数据库
mysql造数据占用临时表空间
【5月更文挑战第20天】MySQL在处理复杂查询时可能使用临时表,可能导致性能下降。临时表用于排序、分组和连接操作。常见问题包括内存限制、未优化的查询、数据类型不当和临时表清理。避免过度占用的策略包括优化查询、调整系统参数、优化数据类型和事务管理。使用并行查询、分区表和监控工具也能帮助管理临时表空间。通过智能问答工具如通义灵码,可实时续写SQL和获取优化建议。注意监控`Created_tmp_tables`和`Created_tmp_disk_tables`以了解临时表使用状况。
807 5
|
数据采集 安全 API
数据治理:实现原始数据不出域,确保数据可用不可见的创新策略
在数字化时代,数据成为企业宝贵资产,驱动业务决策与创新。然而,数据量激增和流通频繁带来了安全和管理挑战。“原始数据不出域,数据可用不可见”的治理理念应运而生,通过数据脱敏、沙箱技术和安全多方计算等手段,确保数据安全共享与高效利用。这一理念已广泛应用于金融、医疗等行业,提升了数据价值和企业竞争力。
2322 0
|
安全 小程序 数据库
网站和APP用户注销功能的讨论
网站和APP用户注销功能的讨论
804 0
|
开发工具 git Docker
git:github的tag标签基本使用和自动发布软件包
git:github的tag标签基本使用和自动发布软件包
632 0
git:github的tag标签基本使用和自动发布软件包