【公开课】理解 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依赖的方法
3695 4
|
JavaScript 小程序 前端开发
【手把手教教学物联网项目】01 视频大纲
《手把手教教学物联网项目》是一系列视频教程,旨在引导初学者掌握物联网技术。视频涵盖物联网基础,如物联网概述、架构和技术;STM32微控制器的介绍、编程及外设使用;网关开发,涉及ESP8266和ESP32;物联网通信协议如TCP、MQTT、Modbus等;物联网总线协议如单总线、CAN、IIC和SPI;OLED显示原理与驱动;MQTT服务器搭建;物联网云平台介绍,包括阿里云平台的使用;微信小程序开发入门及前端VUE项目实践。此外,教程还涉及UniAPP和SpringBoot后台开发,最后通过“智能取餐柜”项目将理论知识付诸实践。视频可在B站找到,适合学生、爱好者和开发人员学习物联网技术。
1237 12
【手把手教教学物联网项目】01 视频大纲
|
设计模式 编解码 C++
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用(一)
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用
546 0
|
5月前
|
存储 人工智能 前端开发
以无头 CMS 为核心构建适配全场景的内容中台
内容中台是品牌内容的数字家园,但只有具备灵活性、可扩展性和用户中心性才能发挥价值。无头CMS为搭建这样的内容中台提供了坚实基础,让团队摆脱传统平台的束缚,专注于核心——创作能引发共鸣、驱动成果的内容。
385 113
|
7月前
|
存储 JavaScript 安全
在 Pinia 中如何使用加密插件?
在 Pinia 中如何使用加密插件?
622 158
|
7月前
|
运维 安全 测试技术
Hydra-SSH 漏洞安全防范
Hydra 是由 THC 组织开发的强力网络安全测试工具,主要用于对 SSH、FTP、HTTP 等协议进行认证爆破,适用于授权渗透测试与弱口令检测。其高效性依赖于优化的字典策略,强调质量优先,结合目标信息定制密码列表,提高破解成功率。
590 1
|
7月前
|
JSON 安全 生物认证
WhatWeb-网站安全扫描指纹识别
WhatWeb 是一款网站指纹识别工具,用于快速识别目标网站的 Web 服务器类型、CMS、脚本语言、中间件及可能存在的漏洞信息,常用于渗透测试与安全审计。
409 1
|
数据采集 人工智能 机器人
RPA与爬虫:自动化工具的本质差异与选择指南
本文深入解析RPA与爬虫的本质差异,帮助企业根据业务需求明智选型。RPA侧重内部流程自动化,爬虫专注外部数据采集。内容涵盖技术原理、应用场景、优劣势对比及主流RPA工具介绍,助力把握自动化趋势,提升效率。
2049 0
|
开发框架 Java 程序员
什么是层次式体系结构?
层次式体系结构设计是将系统组成一个层次结构,每一层为上层服务,并作为下层客户。在一些层次系统中,除了一些精心挑选的输出函数外,内部的层接口只对相邻的层可见。
437 1
|
JSON Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求
【5月更文挑战第31天】 在移动开发领域,尤其是针对Android平台,网络请求的管理和性能优化一直是开发者关注的焦点。随着Kotlin语言的普及,其提供的协程特性为异步编程提供了全新的解决方案。本文将深入探讨如何利用Kotlin协程来优化Android应用中的网络请求,从而提升应用的响应速度和用户体验。我们将通过具体实例分析协程与传统异步处理方式的差异,并展示如何在现有项目中集成协程进行网络请求优化。