学习笔记十四: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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/39001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【博客692】grafana如何解决step动态变化时可能出现range duration小于step

grafana如何解决step动态变化时可能出现range duration小于step 1、grafana中的step和resolution grafana中的 “step” grafana本身是没有提供step参数的,因为仪表盘根据查询数据区间以及仪表盘线条宽度等,对于不同查询,相同的step并不能…

校园外卖小程序怎么做

校园外卖小程序是为满足校园内学生和教职员工的外卖需求而开发的一种应用程序。它涵盖了从用户端、商家端、骑手端、电脑管理员到小票打印、多商户入驻等多个方面的功能,以下将逐一介绍。 1. 用户端功能:校园外卖小程序为用户提供了便捷的订餐和外卖服务…

深入理解epoll

文章目录 概述1. epoll_create - 创建一个epoll实例2. epoll_ctl - 控制epoll实例的事件结构体介绍events取值:data: 联合体(共用体): 3. epoll_wait - 等待事件发生伪代码总结 概述 在网络编程中,高效地处…

每天一道leetcode:797. 所有可能的路径(图论中等深度优先遍历)

今日份题目: 给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节…

​五金件机器视觉定位​并获取外观轮廓软硬件视觉方案

【检测目的】 五金件机器视觉定位,视觉检测五金件轮廓并矫正五金件位置进行涂油 【客户要求】 FOV:540*400mm 【拍摄与处理效图一】 【拍摄与处理效图二】 【实验原理及说明】 【方案评估】 根据目前的图像和处理结果来看,可以检测出产品轮廓并进行位置…

HCIP-OpenStack搭建

1、OpenStack概述 OpenStack是一种云操作系统,OpenStack是虚拟机、裸金属和容器的云基础架构。可控制整个数据中心的大型计算、存储和网络资源池,所有资源都通过具有通用身份验证机制的API进行管理和配置。管理员也可通过Web界面控制,同时授…

Qt 之 QPushButton,信号与槽机制

文章目录 前言一、QPushButton二、信号与槽机制总结 前言 一、QPushButton 当我们开发基于Qt框架的图形用户界面(GUI)应用程序时,经常需要在界面上添加按钮来实现用户交互。Qt提供了一个名为 QPushButton 的类作为按钮控件的实现。QPushButt…

WSL2 Ubuntu子系统安装OpenCV

文章目录 前言一、基本概念二、操作步骤1.下载源码2.安装依赖3.运行编译4.配置路径 前言 OpenCV用C语言编写,它的主要接口也是C语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语…

[python] 安装numpy+scipy+matlotlib+scikit-learn及问题解决

这篇文章主要讲述Python如何安装Numpy、Scipy、Matlotlib、Scikit-learn等库的过程及遇到的问题解决方法。最近安装这个真是一把泪啊,各种不兼容问题和报错,希望文章对你有所帮助吧!你可能遇到的问题包括: ImportError: N…

高并发数据抓取实战:使用HTTP爬虫ip提升抓取速度

又到每天一期学习爬虫的时间了,作为一名专业的爬虫程序员,今天要跟你们分享一个超实用的技巧,就是利用HTTP爬虫ip来提升高并发数据抓取的速度。听起来有点高大上?别担心,我会用通俗易懂的话来和你们说,让你…

自动切换HTTP爬虫ip助力Python数据采集

在Python的爬虫世界里,你是否也被网站的IP封锁问题困扰过?别担心,我来教你一个终极方案,让你的爬虫自动切换爬虫ip,轻松应对各种封锁和限制!快来跟我学,让你的Python爬虫如虎添翼! 首…

uniapp-微信小程序篇

uniapp-微信小程序篇 一、创建项目(以Vue3TS 项目为示例) 可以通过命令行的方式创建也可以通过HBuilderX进行创建(通过HBuilderX创建的项目建议选择最简单的模板),个人建议使用命令行方式。 (1) 命令行方式: npx degit dcloudio…

怎么学习AJAX相关技术? - 易智编译EaseEditing

学习AJAX(Asynchronous JavaScript and XML)相关技术可以让你实现网页的异步数据交互,提升用户体验。以下是一些学习AJAX技术的步骤和资源: HTML、CSS和JavaScript基础: 首先,确保你已经掌握了基本的HTML…

【Redis】Redis三种集群模式-主从、哨兵、集群各自架构的优点和缺点对比

文章目录 前言1. 单机模式2. 主从架构3. 哨兵4. 集群模式总结 前言 如果Redis的读写请求量很大,那么单个实例很有可能承担不了这么大的请求量,如何提高Redis的性能呢?你也许已经想到了,可以部署多个副本节点,业务采用…

Android系统-进程-Binder1-概述

目录 引言: 一次拷贝 Binder一次通信过程 应用启动中的binder交互 C/S模式: Binder COMMAND BWR数据结构: 引言: Android的binder是从openbinder发展过来的。包括了binder驱动,Native层,Java层。用…

光耦继电器:实现电气隔离的卓越选择

光耦继电器是一种常用的电子元件,用于实现电气隔离和信号传输。在工业控制、自动化系统和电力电子等领域,光耦继电器具有独特的特点和优势。本文将从可靠性、隔离性、响应速度和适应性等方面对光耦继电器的特点进行概述。 光耦继电器是一种典型的固态继电…

部署工业物联网可以选择哪些通信方案?

部署工业物联网有诸多意义,诸如提升生产效率,降低管理成本,保障生产品质稳定,应对长期从业劳动力变化趋势等。针对不同行业、场景,工业物联网需要选择不同的通信方案,以达到成本和效益的最佳平衡。本篇就简…

安全头响应头(三)​X-Content-Type-Options

一 X-Content-Type-Options响应头 说明:先写个框架,后续补充 思考:请求类型是 "style" 和 "script" 是什么意思? script标签 style StyleSheet JavaScript MIME type 文件扩展和Content-Type的映射关系 场景: 一个…

Mybatis 源码 ∞ :杂七杂八

文章目录 一、前言二、TypeHandler三、KeyGenerator四、Plugin1 Interceptor2 org.apache.ibatis.plugin.Plugin3. 调用场景 五、Mybatis 嵌套映射 BUG1. 示例2. 原因3. 解决方案 六、discriminator 标签七、其他1. RowBounds2. ResultHandler3. MapKey 一、前言 Mybatis 官网…

mysql主从复制搭建(一主一从)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言MySQL复制过程分为三部: 一、准备工作二、配置>主库Master三、配置>从库SlaveSlave_IO_Running: YesSlave_SQL_Running: Yes 四、测试至此&am…