Kubernetes Pod调度基础(kubernetes)

news2024/9/23 22:18:13

实验环境依旧是k8s快照,拉取本次实验所需的镜像文件;

然后在master节点上传已经编写好的yaml文件;

然后同步会话,导入镜像;

pod控制器:

标签选择器--》标签:

标签:

在Kubernetes(k8s)中,标签(Labels)是一种非常重要的机制,用于对资源对象(如Pods、Nodes、Services等)进行分类和识别。标签以键值对的形式存在,可以附加到资源对象上,以便进行后续的管理和选择。以下是k8s中标签的定义方式的详细解释:

一、标签的定义

标签(Labels)在Kubernetes中是通过键值对(key=value)的形式来定义的。每个资源对象都可以附加任意数量的标签,而同一个标签也可以被附加到多个资源对象上。这种多对多的关系使得标签成为了一种灵活且强大的资源分类和管理工具。

二、标签的语法规则

  • 键(Key):键的命名需要遵守一定的规则,通常建议以字母或数字开头,后面可以跟字母、数字、下划线(_)、破折号(-)和点(.)。键的长度不能超过63个字符。此外,虽然前缀是可选的,但如果指定了前缀,则前缀必须符合DNS子域名的命名规则。

  • 值(Value):值可以为空,也可以包含字母、数字、下划线(_)、破折号(-)和点(.)。值的长度同样不能超过63个字符。如果值非空,则必须以字母或数字开头和结尾。

标签定义的方式:

基于等式的定义 :app=nginx

基于键值对的定义方式 :app: nginx

基于集合的标签定义方式 :{key:app,operator:In,values:[nginx,apache]}

app:nginx

app:apache

在Kubernetes(k8s)中,选择器(Selector)是一个非常重要的概念,它用于定义一组资源的选取规则。这些资源通常是Pods(容器的实例),但也可以扩展到其他Kubernetes对象,如Services、Deployments等。选择器的主要作用是帮助Kubernetes对资源进行分组和选择,以便进行调度、扩展、滚动更新等操作。

复制控制器(replication controller;RC):

让你的pod的副本数,保持在你的“预期值”

复制集控制器 (RS)

复制集控制器是复制控制器的升级版;支持基于集合的标签定义方式;

deployment(部署)(无状态集控制器)是RS的管理者。能够管理复制集控制器

滚动更新

修改副本数(扩缩容)

无状态服务:nginx、apache(tomcat)不需要持久化存储数据;没有任何依赖的环境;例如mysql中的主从复制架构就是有状态的服务;

有状态集控制器 (STS)

mysql、redis、kafka、rabbitmq

删除方式:非级联、级联

守护进程集控制器 (DS)

能够在创建pod的时候,在每一个节点上都创建出来一个。不必指定副本数。

自动按照节点的数量来匹配出一个副本数。

即:副本数和node节点数相同;

计划任务控制器

在Kubernetes(简称K8s)中,有状态集(StatefulSet)和无状态集(通常通过Deployment来管理无状态应用)是两种用于部署和管理不同类型应用程序的机制。它们在处理应用程序的状态、存储、网络以及扩展性等方面存在显著差异。以下是关于有状态集和无状态集的主要区别:

一、状态与存储

  1. 有状态集(StatefulSet)

  1. 无状态集(Deployment)

二、网络与身份

  1. 有状态集(StatefulSet)

  1. 无状态集(Deployment)

三、扩展性与管理

  1. 有状态集(StatefulSet)

  1. 无状态集(Deployment)

四、典型应用场景

  • 有状态集(StatefulSet):适用于需要持久化存储和稳定网络标识的应用程序,如数据库、消息队列、Redis等。

  • 无状态集(Deployment):适用于无状态的应用程序,如Web服务器、微服务中的某些组件等。

综上所述,有状态集和无状态集在Kubernetes中扮演着不同的角色,分别适用于不同类型的应用程序。选择哪种机制取决于应用程序的具体需求和特点。

打开一个复制控制器的yaml文件(资源对象清单)进行查看;

apiVersion: v1

# 指定了Kubernetes API的版本,这里是v1,表示使用Kubernetes的核心API版本1。

kind: ReplicationController

# 声明了这个YAML文件定义的资源类型为ReplicationController。

metadata:

name: nginx

# 定义了ReplicationController的元数据,这里指定了它的名称为nginx。

spec:

replicas: 3

# 在spec部分,指定了ReplicationController应该管理的Pod副本数量为3。

selector:

app: nginx

# selector用于选择哪些Pod应该被这个ReplicationController管理。这里通过标签选择器指定了所有带有app=nginx标签的Pod。

template:

metadata:

name: nginx

# 注意:在ReplicationController的Pod模板中指定name通常是不必要的,因为每个Pod的实例都会有自己的唯一名称。

# 这里的name更多是为了示例或文档目的,实际部署时Kubernetes会忽略它。

labels:

app: nginx

# 定义了Pod模板的元数据,包括标签,这些标签用于匹配selector中的选择器。

spec:

containers:

- name: nginx

# 定义了Pod中运行的容器。

image: nginx:1.7.9

# 指定了容器使用的镜像,这里是nginx的1.7.9版本。

ports:

- containerPort: 80

# 定义了容器内部监听的端口,这里是80端口,用于HTTP服务。

然后执行下该文件;

-前是我们手动指定的pod的名字,而-后是每个副本的名称;

现在删除一个查看下;

可以看出,删除完了之后会被再次创建出来一个新的副本;

这就是复制控制器的特点;

利用yaml文件生成的对象,想要删除的时候也要指定该文件;

打开第二个复制集控制器的文件:

复制集控制器是复制控制器的升级版;支持基于集合的标签定义方式;

yaml文件中只要看到template指的就是pod的模版:后面定义的就是pod的参数;

apiVersion: apps/v1 # API版本

kind: ReplicaSet # 资源类型,这里是ReplicaSet

metadata: # 元数据

name: frontend # ReplicaSet的名称

labels: # 标签,用于分类和选择

app: guestbook # 应用标签

tier: frontend # 层级标签

spec: # 规格说明

replicas: 3 # 副本数量

selector: # 选择器,用于匹配Pods

matchLabels: # 基于标签的选择

tier: frontend # 匹配层级为frontend的Pods

template: # Pod模板

metadata: # Pod的元数据

labels: # Pod的标签

app: guestbook

tier: frontend

spec: # Pod的规格说明

containers: # 容器列表

- name: php-redis # 容器名称,但注意这里使用的镜像应该是nginx,可能与容器名不匹配

image: nginx:1.7.9 # 容器镜像,这里应该是PHP-Redis的镜像,但示例中使用了nginx

resources: # 资源请求

requests: # 请求的资源量

cpu: 100m # CPU请求量

memory: 100Mi # 内存请求量

env: # 环境变量

- name: GET_HOSTS_FROM

value: dns # 从DNS获取服务主机信息

# 如果您的集群配置不包括DNS服务,而是想从环境变量中获取服务主机信息,

# 请注释掉上面的'value: dns'行,并取消注释下面的行。

# value: env

ports: # 端口列表

- containerPort: 80 # 容器端口

创建出来并查看:

删除的时候可以指定类型加名称删除;

但是建议和创建的时候方法一样;即:以指定文件去删除;

打开deployment的文件:

apiVersion: apps/v1 # API版本,指明使用的Kubernetes API的版本

kind: Deployment # 资源类型,这里是Deployment

metadata: # 元数据

name: nginx-deployment # Deployment的名称

labels: # 标签,用于标识和选择Deployment

name: nginx-deployment # 标签名称和值

spec: # 规格说明,定义了Deployment的具体参数

replicas: 2 # 副本数量,指明要运行的Pod副本数量

selector: # 选择器,用于选择哪些Pod受当前Deployment管理

matchLabels: # 匹配标签

app: nginx # 需要与Pod模板中的标签相匹配

template: # Pod模板,定义了要创建的Pod的配置

metadata: # Pod的元数据

labels: # Pod的标签

app: nginx # Pod的标签名称和值,用于与选择器中的标签匹配

spec: # Pod的规格说明

containers: # 容器列表,定义了Pod中要运行的容器

- name: nginx # 容器的名称

image: nginx:1.7.9 # 容器使用的镜像及其版本

ports: # 容器端口列表

- name: nginx # 端口名称

containerPort: 80 # 容器监听的端口号

应用:

以简写(deploy)的方式查看:

如何使用deployment的滚动更新特性:

可以查看deployment的描述信息:

看最后event事件信息:

更新的时候会先关闭,然后更新,更新完了之后会再启动起来;

查看滚动更新的历史:

怎么回滚到之前的版本:

因为此次只更新了一次,无法回滚到第一次创建的时候,以及无法回滚到当前的状态;

第一次是1;现在的状态为2;

deployment还能指定副本数,实现扩缩容:

缩容:

打开守护进程集的文件;

apiVersion: apps/v1 # API版本,指定了Kubernetes API的版本

kind: DaemonSet # 资源类型,这里是DaemonSet,用于在每个节点上运行一个Pod副本

metadata: # 元数据

name: pod-controller # DaemonSet的名称

namespace: dev # 命名空间,指定了DaemonSet所在的命名空间

labels: # 标签,用于标识和选择DaemonSet

controller: daemonset # 标签名称和值

spec: # 规格说明,定义了DaemonSet的具体参数

selector: # 选择器,用于选择哪些Pod受当前DaemonSet管理

matchLabels: # 匹配标签

app: nginx-pod # 需要与Pod模板中的标签相匹配

template: # Pod模板,定义了要在每个节点上运行的Pod的配置

metadata: # Pod的元数据

labels: # Pod的标签

app: nginx-pod # Pod的标签名称和值,用于与选择器中的标签匹配

spec: # Pod的规格说明

containers: # 容器列表,定义了Pod中要运行的容器

- name: nginx # 容器的名称

image: nginx:1.7.9 # 容器使用的镜像及其版本

ports: # 容器端口列表

- name: nginx-port # 端口名称

containerPort: 80 # 容器监听的端口号

protocol: TCP # 端口协议,这里是TCP

创建出来:

提示当要用该文件创建的时候,名字为“dev”的命名空间没有创建;

由于文件中指定了命名空间;所以会有这样的提示;

所以要在创建前创建出一个命名空间;

因为守护进程集的特性会在每个工作节点上创建,所以可以进行查看:

打开有状态集控制器的文件;

服务(Service)部分:

apiVersion: v1 # API版本,指定了Kubernetes API的版本

kind: Service # 资源类型,这里是Service,用于定义一组Pod的访问策略

metadata:

name: redis-svc # 服务的名称

spec:

selector: # 选择器,用于选择哪些Pod的IP地址和端口号被此服务代理

app: redis-sts # 标签选择器,与StatefulSet中Pod的标签相匹配

ports: # 端口列表,定义了服务监听的端口和将流量转发到的目标端口

- port: 6379 # 服务监听的端口号

protocol: TCP # 端口协议,这里是TCP

targetPort: 6379 # 目标端口号,即Pod中容器监听的端口号

这个服务定义了一个名为redis-svc的服务,它使用标签选择器app: redis-sts来匹配Pod,并将流量从服务的6379端口转发到匹配的Pod的6379端口。

有状态集(StatefulSet)部分:

apiVersion: apps/v1 # API版本,指定了Kubernetes API的版本

kind: StatefulSet # 资源类型,这里是StatefulSet,用于管理有状态的应用

metadata:

name: redis-sts # StatefulSet的名称

spec:

serviceName: redis-svc # 服务的名称,这个服务必须已经存在,用于Pod的DNS发现

replicas: 2 # 副本数量,指定StatefulSet中Pod的副本数量

selector: # 选择器,用于选择哪些Pod由这个StatefulSet管理

matchLabels:

app: redis-sts # 标签选择器,与Pod模板中的标签相匹配

template: # Pod模板,定义了StatefulSet中每个Pod的配置

metadata:

labels:

app: redis-sts # Pod的标签,用于与StatefulSet选择器的标签相匹配

spec:

containers: # 容器列表,定义了Pod中要运行的容器

- image: redis:5-alpine # 容器使用的镜像及其版本

name: redis # 容器的名称

ports: # 容器端口列表

- containerPort: 6379 # 容器监听的端口号

创建出来,观察它的特性:

有状态集控制器往往带有依赖性,所以启动的时候会有先后顺序的;

例如:mysql的主从架构,肯定是要先启动主再启动从的。

而deployment生成的时候没有顺序性,所以它pod的名字也没有规律。

如何扩展:

再去扩展:

缩容:

也是具有顺序性的缩容;

会先去掉第四个,再去掉第三个。

和其他资源对象不一样的是删除的时候有区别的。

有状态集有两种删除的方式:

先采用非级联的方式删除:

sts没了,但是pod还在。

第一步先非级联的删除有状态集,再删除里面的pod;

要么直接用级联的方式删除;即:删除yaml文件即可;

为了演示,先把它创建出来:

先把pod删除掉;因为控制器已经被删除了,所以不会自动创建出来的。

采用级联的方式删除:

第二种级联方式的删除:

最后一个计划任务控制器:

这个YAML文件定义了一个Kubernetes CronJob资源,用于定期执行一个计划任务。

以下是对这个YAML文件的详细翻译和解释,同时确认apiVersion已经正确设置为batch/v1,适用于Kubernetes 1.21及以上版本。

apiVersion: batch/v1 # 指定API版本为batch/v1,适用于CronJob资源

kind: CronJob # 定义资源的类型为CronJob

metadata:

name: hello # CronJob的名称设置为hello

spec:

schedule: "*/1 * * * *" # Cron作业的执行计划,这里表示每分钟执行一次

jobTemplate: # 定义了作业模板,CronJob将基于这个模板创建作业

spec:

template: # 定义了作业的Pod模板

spec:

containers: # 定义了Pod中的容器列表

- name: hello # 容器的名称

image: busybox:v1 # 容器使用的镜像,这里是busybox的v1版本

args: # 传递给容器内命令的参数列表

- /bin/sh # 容器内要执行的命令是/bin/sh

- -c # -c参数告诉sh执行后面的字符串作为命令

- date; echo Hello from the Kubernetes cluster # 要执行的命令,首先打印当前日期,然后打印一条消息

restartPolicy: OnFailure # 定义了Pod的重启策略,这里是在容器失败时重启

创建出来并查看:

会发现并没有直接被创建出来:

再去查看就有了;

而且状态是已完成的状态;

因为该pod在运行的时候只是让pod里面的容器运行了一条指令,立马就运行完了。

查看该pod的日志;

每分钟会生成一个pod;

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

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

相关文章

还在用windows自带录屏?试试这三款录屏工具

作为一名办公室文员,我经常需要录制电脑屏幕来制作教程或者记录工作流程。在众多的录屏工具中,我尝试了四款不同的录屏工具,包括Windows自带录屏工具。今天,我就来跟大家分享一下我的使用体验,希望能帮助到和我有同样需…

利用代码,玩转腾讯云脱敏服务:Java、Python、PHP案例集

腾讯云数据脱敏服务-数据管理的优势是什么? 腾讯云数据脱敏服务-数据管理 提供了一种高效且灵活的方式来保护敏感数据。其核心优势在于可以在数据处理和传输过程中自动化地执行数据脱敏操作。无论是脱敏信用卡号、身份证号还是其他个人信息,该服务都能精…

Games101笔记-二维Transform变换(二)

1、什么是Transform Transform就是通过一个矩阵,进行缩放、旋转、平移等变换 2、缩放、旋转、切变、平移等基础变换 缩放变换: 反射变换: 切变: 绕原点旋转: 以上都是线性变换: 平移变换&#xf…

线程同步:消费者模型(非常重要的模型)

一.线程同步的概念 线程同步:是指在互斥的基础上,通过其它机制实现访问者对 资源的有序访问。条件变量:线程库提供的专门针对线程同步的机制线程同步比较典型的应用场合就是 生产者与消费者 二、生产者与消费者模型原理 在这个模型中&…

中文文本分词-技术实现

当做语音&文本相关的技术时,经常会涉及到文本的分词实现。以下是对中文的文本简单实现。 一、单个中文句子的分词 import jiebatext_ "我爱我的祖国!" # 精确模式 seg_list jieba.cut(text_, cut_allFalse) print("精确模式: &qu…

【51实物与仿真】基于51单片机设计的波形/函数发生器(正弦波、锯齿波、三角波、矩形波,设定频率步进值,改变振幅,LCD显示)——文末完整资料链接

基于51单片机设计的波形函数发生器 演示视频: 功能简介: 1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机。 2.LCD1602液晶显示波形种类和频率值(10-100HZ)。 3.按键设置波形种类和设定频率步进值。 4.电位器器改变振幅(0V-3.5V稳定)。 5…

医院预约|基于springBoot的医院预约挂号系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书(可指定任意题目) 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 近年来,信息化管理行业的不断兴起,使得人们的日…

集合根据上下级关系转树结构

1、创建实体对象 public class TreeNode {private String id;private String pid;private String name;private List<TreeNode> children;public TreeNode(String id,String pid,String name){this.id id;this.pid pid;this.name name;}public String getId() {retur…

独立游戏《Project:Survival》UE5C++开发日志0——游戏介绍

该游戏是《星尘异变》团队的下一款作品&#xff0c;太空科幻题材的生存游戏&#xff0c;我将负责使用C、蓝图实现游戏的基础框架和核心功能&#xff0c;其中还包含使用人工智能算法助力游戏开发或帮助玩家运营 目前已有功能&#xff1a; 1.3D库存系统&#xff1a;所有库存中的物…

Python练习宝典:Day 3 - 选择题 - 字符串与正则表达式、基础练习补充

目录 一、基础练习补充二、字符串与正则表达式 一、基础练习补充 1.下列能返回变量s的数据类型的是: A.print(type(s)) B.print(s) C.print(int(s)) D.print(str(s))2.如果想要换行,可以使用: A.\ B.\n C.\t D.\f3.合法的标识符是: A.M-N B.and C.Dior_Ysl D.6_friends4.在…

计算机毕业设计springboot+vue项目分享在线服务平台

目录 功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行需求分析系统设计软件测试核心代码部分展示详细视频演示源码获取 功能和技术介绍 本项目包含程序源码和MySql脚本和文档,idea开发,支持Eclipse。使用vue的本质是SpringFramework【IoC&am…

【门牌制作 / A】

题目 代码 #include <bits/stdc.h> using namespace std; int main() {int cnt 0;for (int i 1; i < 2020; i){string s;s to_string(i);cnt count(s.begin(), s.end(), 2);}cout << cnt; }

用c++实现分数(fraction)类

这个想法已经有3周&#xff0c;于是今天将它实现了。 Step 1基础&#xff1a; 我们需要定义一个class——fraction&#xff0c;全部属性定义为public class fraction{ public:}; 现在&#xff0c;让我们添加2个元素&#xff0c;分子和分母——fz和fw Step 1.1添加分子分母…

QT| “无法粘贴窗口部件”错误以及customplot

“无法粘贴窗口部件”错误以及customplot “无法粘贴窗口部件”错误customplot下载添加到项目中使用QCustomPlot常用的代码 “无法粘贴窗口部件”错误 情景&#xff1a;使用QT设计界面&#xff0c;很多部分比较类似&#xff0c;可以复制另一个界面的ui&#xff0c;但是粘粘的时…

c++278函数指针

#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<string.h> #include<stdio.h>//数组类型基本语法知识梳理 //定义一个数组类型 //int a[10];//定义一个指针数组类型//定义一个指向数组类型的指针 数组类型的指针void main() {int a[10];//a代…

“AI+Security”系列第3期(二):AI赋能自动化渗透测试

近日&#xff0c;“AI Security” 系列第 3 期&#xff1a;AI 安全智能体&#xff0c;重塑安全团队工作范式技术沙龙活动正式举行。该活动由安全极客、Wisemodel 社区、InForSec 网络安全研究国际学术论坛和海升集团联合主办&#xff0c;吸引了线上与线下千余名观众参与。 在…

数据结构基础详解:拓扑排序和关键路径_AOE网的详细画法

文章目录 1.有向无环图&#xff08;前置知识&#xff09;2. 拓扑排序2.1 AOV网2.2 排序序列 3.关键路径3.1 AOE网3.2 关键活动3.2.1 事件v~k~的最早发生时间v~e~(k)3.2.2 活动a~I~的最迟开始时间l(i)3.2.3 事件v~k~的最迟发生时间v~l~(k)3.2.4 活动a~I~的最早开始时间e(i)3.2.5…

插件MyBatis X

文章目录 插件插件MyBatis X 插件 插件MyBatis X 安装完重启idea 蓝色 sql映射文件 红色 mapper接口 点击对应的鸟&#xff0c;sql映射文件和对应mapper接口就能相互跳转

Python应用指南:利用高德地图API获取POI数据

随着地理信息系统&#xff08;GIS&#xff09;技术的发展&#xff0c;地理位置数据在城市规划、商业分析、旅游推荐等多个领域发挥着越来越重要的作用。POI&#xff08;Point of Interest&#xff0c;兴趣点&#xff09;数据作为地理信息的重要组成部分&#xff0c;提供了丰富的…

线程对象的生命周期、线程等待和分离

线程对象的生命周期、线程等待和分离 #include <iostream> #include<thread> using namespace std;bool is_exit false;//用于判断主线程是否退出 void ThreadMain() {cout << "begin sub thread main ID: " << this_thread::get_id() &l…