学习笔记十四:K8S最小调度单元POD概述
K8S最小调度单元POD概述
- k8s核心资源Pod介绍
- Pod是什么
- Pod如何管理多个容器
- Pod网络
- Pod存储
- 代码自动发版更新
- 收集业务日志
- Pod工作方式
- 自主式Pod
- 控制器管理的Pod(防误删除)
- 如何基于Pod运行应用
k8s核心资源Pod介绍
K8s官方文档:https://kubernetes.io/
K8s中文官方文档: https://kubernetes.io/zh/
K8s Github地址:https://github.com/kubernetes/kubernetes
Pod资源对应的官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/
Pod是什么
Pod是Kubernetes中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。
Pod是需要调度到k8s集群的工作节点来运行的,具体调度到哪个节点,是根据scheduler调度器实现的。
pod相当于一个逻辑主机–比方说我们想要部署一个tomcat应用,如果不用容器,我们可能会部署到物理机、虚拟机或者云主机上,那么出现k8s之后,我们就可以定义一个pod资源,在pod里定义一个tomcat容器,所以pod充当的是一个逻辑主机的角色。
Pod如何管理多个容器
Pod中可以同时运行多个容器。同一个Pod中的容器会自动的分配到同一个 node 上。同一个Pod中的容器共享资源、网络环境,它们总是被同时调度,在一个Pod中同时运行多个容器是一种比较高级的用法,只有当你的容器需要紧密配合协作的时候才考虑用这种模式。例如,你有一个容器作为web服务器运行,需要用到共享的volume,有另一个“sidecar”容器来从远端获取资源更新这些文件。
一些Pod有init容器和应用容器。 在应用程序容器启动之前,运行初始化容器。
Pod网络
Pod是有IP地址的,假如pod不是共享物理机ip,由网络插件(calico、flannel、weave)划分的ip,每个pod都被分配唯一的IP地址
- Kubernetes中容器共享的方式
在k8s中,启动Pod时,会先启动⼀个pause 的容器,然后将后续的所有容器都 "link 到这个pause 的容器,以实现⽹络共享。
Pod存储
创建Pod的时候可以指定挂载的存储卷。 POD中的所有容器都可以访问共享卷,允许这些容器共享数据。 Pod只要挂载持久化数据卷,Pod重启之后数据还是会存在的。
代码自动发版更新
假如生产环境部署了一个go的应用,而且部署了几百个节点,希望这个应用可以定时的同步最新的代码,以便自动升级线上环境。这时,我们不希望改动原来的go应用,可以开发一个Git代码仓库的自动同步服务,然后通过Pod的方式进行编排,并共享代码目录,就可以达到更新java应用代码的效果。
收集业务日志
某服务模块已经实现了一些核心的业务逻辑,并且稳定运行了一段时间,日志记录在了某个目录下,按照不同级别分别为 error.log、access.log、warning.log、info.log,现在希望收集这些日志并发送到统一的日志处理服务器上。
这时我们可以修改原来的服务模块,在其中添加日志收集、发送的服务,但这样可能会影响原来服务的配置、部署方式,从而带来不必要的问题和成本,也会增加业务逻辑和基础服务的藕合度。
如果使用Pod的方式,通过简单的编排,既可以保持原有服务逻辑、部署方式不变,又可以增加新的日志收集服务。
而且如果我们对所有服务的日志生成有一个统一的标准,或者仅对日志收集服务稍加修改,就可以将日志收集服务和其他服务进行Pod编排,提供统一、标准的日志收集方式。
这里的“核心业务服务”、“日志收集服务”分别是一个镜像,运行在隔离的容器环境中。
Pod工作方式
在K8s中,所有的资源都可以使用一个yaml文件来创建,创建Pod也可以使用yaml配置文件。或者使用kubectl run在命令行创建Pod(不常用)。
自主式Pod
所谓的自主式Pod,就是直接定义一个Pod资源,如下:
vim pod-tomcat.yaml
apiVersion: v1
kind: Pod
metadata:name: tomcat-testnamespace: defaultlabels:app: tomcat
spec:containers:- name: tomcat-javaports:- containerPort: 8080image: tomcat/tomcat-8.5-jre8:v1imagePullPolicy: IfNotPresent
导入镜像 把tomcat.tar.gz上传到k8snode1和k8snode2节点,手动解压:
链接:https://pan.baidu.com/s/1BGUFkkwFnZ-OF80weq0pQQ?pwd=r6ri
提取码:r6ri
ctr -n=k8s.io images import tomcat.tar.gz
更新资源清单文件
kubectl apply -f pod-tomcat.yaml
查看pod是否创建成功
kubectl get pods -o wide -l app=tomcat
但是自主式Pod是存在一个问题的,假如我们不小心删除了pod:
kubectl delete pods tomcat-test
查看pod是否还在
kubectl get pods -l app=tomcat
结果是空,说明pod已经被删除了
通过上面可以看到,如果直接定义一个Pod资源,那Pod被删除,就彻底被删除了,不会再创建一个新的Pod,这在生产环境还是具有非常大风险的,所以今后我们接触的Pod,都是控制器管理的。
控制器管理的Pod(防误删除)
常见的管理Pod的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。
控制器管理的Pod可以确保Pod始终维持在指定的副本数运行。
如,通过Deployment管理Pod
解压镜像:把nginx.tar.gz上传到k8snode1和k8snode2节点
链接:https://pan.baidu.com/s/1EDLQ8Zt9goRFEo9K83Ufwg?pwd=qv3q
提取码:qv3q
ctr -n=k8s.io images import nginx.tar.gz
vim nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-testlabels:app: nginx-deploy
spec:selector:matchLabels:app: nginxreplicas: 2template:metadata:labels:app: nginxspec:containers:- name: my-nginximage: nginx/nginx:v1imagePullPolicy: IfNotPresentports:- containerPort: 80
更新资源清单文件
kubectl apply -f nginx-deploy.yaml
查看Deployment
kubectl get deploy -l app=nginx-deploy
查看Replicaset
kubectl get rs -l app=nginx
查看pod
kubectl get pods -o wide -l app=nginxNAME READY STATUS IP
nginx-test-75c685fdb7-6d4lx 1/1 Running 10.244.102.69
nginx-test-75c685fdb7-9s95h 1/1 Running 10.244.102.68
删除nginx-test-75c685fdb7-9s95h这个pod
kubectl delete pods nginx-test-75c685fdb7-9s95h
kubectl get pods -o wide -l app=nginx
NAME READY STATUS IP
nginx-test-75c685fdb7-6d4lx 1/1 Running 10.244.102.69
nginx-test-75c685fdb7-pr8gh 1/1 Running 10.244.102.70
发现重新创建一个新的pod是nginx-test-75c685fdb7-pr8gh
通过上面可以发现通过deployment管理的pod,可以确保pod始终维持在指定副本数量
可以通过指定配置文件删除对应pod
kubectl delete -f nginx-deploy.yaml
如何基于Pod运行应用
创建pod流程:
kubectl apply -f nginx-deploy.yaml->找到config文件,基于config文件指定的用户访问指定的集群,这样就找到了apiserver
- 通过 kubectl 命令向 apiserver 提交创建pod的请求,apiserver接收到pod创建请求后,会将pod的属性信息(metadata)写入etcd。
- apiserver触发watch机制准备创建pod,信息转发给调度器scheduler,调度器使用调度算法选择node,调度器将node信息给apiserver,apiserver将绑定的node信息写入etcd
- apiserver又通过watch机制,调用kubelet,指定pod信息,调用容器运行时创建并启动pod内的容器。
- 创建完成之后反馈给kubelet, kubelet又将pod的状态信息给apiserver,apiserver又将pod的状态信息写入etcd。
相关文章:

学习笔记十四:K8S最小调度单元POD概述
K8S最小调度单元POD概述 k8s核心资源Pod介绍Pod是什么Pod如何管理多个容器Pod网络Pod存储代码自动发版更新收集业务日志 Pod工作方式自主式Pod控制器管理的Pod(防误删除) 如何基于Pod运行应用 k8s核心资源Pod介绍 K8s官方文档:https://kubernetes.io/ K8s中文官方文…...

ARM--day2(cpsr、spsr、数据搬移指令、移位操作指令、位运算操作指令、算数运算指令、比较指令、跳转指令)
.text .global _gcd _gcd:mov r0,#9mov r1,#15b loop loop:cmp r0,r1beq stopsubhi r0,r1bhi loopsubcc r1,r0bcc loopstop:b stop.end用for循环实现1~100之间和5050 .text .global _gcd _gcd:mov r0,#0x0mov r1,#0x1mov r2,#0x64b loop loop:cmp r1,r2bhi stopadd r0,r0,r1ad…...

idea报错:java: 程序包org.springframework.web.bind.annotation不存在
这个错误通常都是maven仓库的问题,试了网上很多方法,都没有解决,如果大家有遇到这个问题,且试了很多方法之后都没有解决,不妨可以试试我这个方法 先编译一下已经写好的代码,这时候会出现以上报错ÿ…...

Android平台GB28181设备接入端如何实现多视频通道接入?
技术背景 我们在设计Android平台GB28181设备接入模块的时候,有这样的场景诉求,一个设备可能需要多个通道,常见的场景,比如车载终端,一台设备,可能需要接入多个摄像头,那么这台车载终端设备可以…...

Evaluation Warning: The document was created with Spire.Doc for JAVA.
spire.doc-5.4.10.jar 生成PDF有广告语水印【Evaluation Warning: The document was created with Spire.Doc for JAVA.】 <!-- maven库访问不了 https://mvnrepository.com/artifact/e-iceblue/spire.doc e-iceblue库才能访问 https://repo.e-iceblue.cn/repository/maven…...
Java“牵手”根据关键词搜索(分类搜索)京东商品列表页面数据获取方法,京东API实现批量商品数据抓取示例
京东商城是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取京东商品列表和商品详情页面数据,您可以通过开放平台的接口或者直接访问京东商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…...

AIGC|AGI究竟是什么?为什么大家都在争先入场?
一、AI大语言模型进入爆发阶段 2022年12月ChatGPT突然爆火,原因是其表现出来的智能化已经远远突破了我们的常规认知。虽然其呈现在使用者面前仅仅只是一个简单的对话问答形式,但是它的内容化水平非常强大,甚至在某些方面已经超过人类了&#…...

【数学建模】--主成分分析
本讲将介绍主成分分析(Principal Component Analysis,PCA),主成分分析是一种降维算法,它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能…...

gitee(码云)如何生成并添加公钥,以及配置用户信息
一,简介 在使用Gitee的时候,公钥是必须的,无论是克隆还是上传。本文主要介绍如何本地生成和添加公钥到服务器,然后配置自己的用户信息,方便日后拉取与上传代码。 二,步骤介绍 2.1 本地生成公钥 打开git ba…...
wangeditor上传图片并展示在输入框内方法(vue3)
安装vue3组件 yarn add @wangeditor/editor-for-vue@next # 或者 npm install @wangeditor/editor-for-vue@next --save 页面中创建一个新的组件 <template><div style="border: 1px solid #ccc; text-align: left"><Toolbar style="border-…...

UGUI基础游戏对象Canvas
一.画布Canvas对象概述 画布是一种带有画布组件的游戏对象,所有 UI 元素都必须是此类画布的子项。 创建新的 UI 元素(如使用菜单 GameObject > UI > Image 创建图像)时,如果场景中还没有画布,则会自动创建画布。…...

PK Nounique CASCADE DROP INDEX keep index
Explicit Control Over Indexes when Creating, Disabling, or Dropping PK/Unique Constraints (Doc ID 139666.1)编辑To Bottom PURPOSEIn Oracle 9i, the DBA has an explicit control over how indexes are affectedwhile creating, disabling, or dropping Primary Ke…...

【Antd】实现Table组件行点击,解决某一列不触发行点击
今天有个新需求,点击table行,执行一些操作。实现过程中遇到了:点击操作列、操作列内按钮会冒泡触发行点击。antd版本:1.7.8 一、解决方案 customRow <a-table :customRow"handleClickRow" :data-source"data_li…...

Kafka3.0.0版本——Broker( 退役旧节点)示例
目录 一、服务器信息二、先启动4台zookeeper,再启动4台kafka三、通过PrettyZoo工具验证启动的kafka是否ok四、查看4台kafka集群节点上是否存在创建的名称为news的主题五、退役旧节点5.1、执行负载均衡操作5.2、 执行停止命令5.3、再次查看kafka中的创建过的名称为ne…...

【Rust】Rust学习 第十二章一个 I/O 项目:构建一个命令行程序
本章既是一个目前所学的很多技能的概括,也是一个更多标准库功能的探索。我们将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。 Rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择…...

【MySQL--->表的操作】
文章目录 [TOC](文章目录) 一、创建表二、查看表三、修改表四、删除表drop table 表名;  一、创建表 语句格式:create table 表名(列名 类型,…)字符集 校验规则 存储引擎;字符集和校…...

PyTorch从零开始实现ResNet
文章目录 代码实现参考 代码实现 本文实现 ResNet原论文 Deep Residual Learning for Image Recognition 中的50层,101层和152层残差连接。 代码中使用基础残差块这个概念,这里的基础残差块指的是上图中红色矩形圈出的内容:从上到下分别使用…...

企业微信 企业内部开发 学习笔记
官方文档 文档 术语介绍 引入pom <dependency><groupId>com.github.binarywang</groupId><artifactId>wx-java-cp-spring-boot-starter</artifactId><version>4.5.3.B</version></dependency>核心代码 推送消息 final WxCp…...
03 QT基本控件和功能类
一 进度条 、水平滑动条 垂直滑动条 当在QT中,在已知类名的情况下,要了解类的构造函数 常用属性 及 信号和槽 常用api 特征:可以获取当前控件的值和设置它的当值 ---- int ui->progressBar->setValue(value); //给进度条设置一个整型值 ui->progressBar->value…...

epoll数据结构
目录 1.大量的fd 集合。选择什么数据结构?2、Epoll 数据结构Epitem 的定义Eventpoll 的定义 1.大量的fd 集合。选择什么数据结构? 查找频率很高的数据结构 1.红黑树 2.哈希(扩容缩容) 3. b/btree (降低树的高度&#…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

如何做好一份技术文档?从规划到实践的完整指南
如何做好一份技术文档?从规划到实践的完整指南 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...

Selenium 查找页面元素的方式
Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素,以下是主要的定位方式: 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...