kubernetes-pod的调度

kubernetes-pod的调度

  • kubernetes-7
    • 1、pod停止之后,服务不会停止
    • 2、pod endpoint service之间的关系
    • 3、pod的调度
      • 总述
      • 1. 资源请求(Resource Requests)和资源限制(Resource Limits)
      • 2. 节点选择器(Node Selector)
      • 3. 污点和容忍度(Taints and Tolerations)
      • 4. 亲和性和反亲和性(Affinity and Anti-Affinity)
      • 5. 优先级类(PriorityClass)
      • 6. 调度策略(Scheduling Policy)
    • 4、Kubernetes Pod调度:CPU和内存资源配置与调度策略详解
      • 4.1、例子
      • 4.2、CPU设置
      • 4.3、内存设置
      • 4.4、配置示例
      • 4.5、调度器如何使用这些设置
    • 5、Kubernetes Pod调度:定向调度
      • 5.1、指定nodeName
      • 5.2、nodeselector 方式实现定向调度
    • 6、Kubernetes Pod调度:节点亲和性
      • 6.1、概述
      • 6.2、node亲和性
    • 7、小知识点

kubernetes-7

1、pod停止之后,服务不会停止

使用 kubectl delete 命令删除特定的 Service:

kubectl delete service <service-name>
[root@master pod]# kubectl get service
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes        ClusterIP   10.96.0.1        <none>        443/TCP          14d
mydb              ClusterIP   10.111.97.213    <none>        80/TCP           9d
myservice         ClusterIP   10.110.72.101    <none>        80/TCP           9d
mysql-service     NodePort    10.108.120.107   <none>        3306:30008/TCP   43h
redis-leader      ClusterIP   10.98.178.58     <none>        6379/TCP         43h
scnginx-service   NodePort    10.103.157.7     <none>        80:30009/TCP     43h
[root@master pod]# 
[root@master pod]# kubectl delete service scnginx-service
service "scnginx-service" deleted
[root@master pod]# kubectl delete service redis-leader
service "redis-leader" deleted
[root@master pod]# kubectl delete service mysql-service
service "mysql-service" deleted
[root@master pod]# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   14d
mydb         ClusterIP   10.111.97.213   <none>        80/TCP    9d
myservice    ClusterIP   10.110.72.101   <none>        80/TCP    9d
[root@master pod]# 

2、pod endpoint service之间的关系

  • Pod是Kubernetes中能够创建和部署的最小单元,代表集群中的一个应用实例。每个Pod都有一个或多个容器,这些容器共享网络和存储资源。Pods可以独立运行,但通常它们被组织成更大的结构以便于管理和扩展。

  • ENDPOINTS就是service关联的pod的ip地址和端口

  • Service是定义一组Pods的逻辑集合以及访问它们的策略的抽象。Service允许外部流量通过统一的接口访问一组Pods,而不需要关心后端Pods的具体IP地址或数量。Service通常通过Label Selector来选择目标Pods,这意味着只有带有特定标签的Pods才会成为Service的一部分。

在Kubernetes集群中,Pods是运行在私有网络空间内的容器,它们被分配有集群内部的私有IP地址。这些私有IP地址对于外部网络是不可见的,因此外部用户无法直接访问到这些Pods。

Service对象在Kubernetes中充当了将Pods的私有网络接口转换为可从外部访问的接口的角色。Service通过定义一种访问策略(例如负载均衡),使得外部流量可以被均匀地分配到后端的Pods上。这个过程通常由kube-proxy来实现,它负责在集群节点上设置相应的网络规则。

Service有两种主要的类型:

  1. ClusterIP:这是Service的默认类型,它为Service分配一个集群内部的虚拟IP地址。这个IP地址可以被集群内的其他组件(如其他Pods或Services)用来访问Service。

  2. NodePort 或 LoadBalancer:这两种类型的Service可以将流量从集群外部导向集群内部。NodePort在集群的所有节点上分配一个端口,而LoadBalancer(如果云提供商支持)会为Service分配一个公有IP地址。这样,外部用户就可以通过这个端口或IP地址访问到Service,进而访问到后端的Pods。

Endpoints是Service背后的实际网络地址列表,它包含了所有匹配Service选择器的Pods的IP地址和端口号。当Service接收到外部请求时,它会通过Endpoints来确定应该将请求转发到哪个Pod上。

总结来说,Service通过kube-proxy作为负载均衡器,将外部的请求转发到集群内部的Pods。Service有一个虚拟的IP地址和端口,这些信息通过Endpoints映射到实际的Pods上。这样,即使Pods的私有IP地址对外部不可见,外部用户也可以通过Service访问到这些Pods上运行的应用。

一个service对应一个pod

3、pod的调度

总述

  1. 自动调度:根据node节点的综合算例(cpu,内存等资源) 分配–》具有随机性
  2. 定向调度:指定在哪个node节点上 —>NodeName、NodeSelector
  3. 亲和性和反亲和性调度:
    • pod亲和性
    • node亲和性
    • pod反亲和性:排斥,互斥
  4. 污点和容忍度

1. 资源请求(Resource Requests)和资源限制(Resource Limits)

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imageresources:requests:cpu: "500m"memory: "256Mi"limits:cpu: "1"memory: "512Mi"

在这个例子中,my-pod Pod中的容器my-container请求了500毫核的CPU和256Mi的内存。同时,它设置了1个CPU核心和512Mi内存的资源限制。

2. 节点选择器(Node Selector)

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:nodeSelector:disktype: ssdcontainers:- name: my-containerimage: my-image

这里,my-pod将被调度到带有disktype: ssd标签的节点上。

3. 污点和容忍度(Taints and Tolerations)

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:tolerations:- key: "example-key"operator: "Equal"value: "example-value"effect: "NoSchedule"containers:- name: my-containerimage: my-image

在这个Pod定义中,my-pod容忍了一个名为example-key的污点,其操作符为Equal,值为example-value,并且这个污点的效果是NoSchedule,意味着这个Pod不会被调度到带有不匹配污点的节点上。

4. 亲和性和反亲和性(Affinity and Anti-Affinity)

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: exampleoperator: Invalues:- valuetopologyKey: "kubernetes.io/hostname"containers:- name: my-containerimage: my-image

这个Pod定义使用了podAffinity来指定my-pod在调度时需要与具有example: value标签的Pods在同一主机(kubernetes.io/hostname)上运行。

5. 优先级类(PriorityClass)

apiVersion: v1
kind: Pod
metadata:name: my-podannotations:"scheduler.alpha.kubernetes.io/critical-pod": ""
spec:priorityClassName: high-prioritycontainers:- name: my-containerimage: my-image

这里,my-pod使用了high-priority优先级类,这意味着它在资源不足时会比其他低优先级的Pod更有可能被调度。

6. 调度策略(Scheduling Policy)

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:schedulerName: my-schedulercontainers:- name: my-containerimage: my-image

在这个例子中,my-pod指定了使用名为my-scheduler的调度器,而不是默认的调度器。

4、Kubernetes Pod调度:CPU和内存资源配置与调度策略详解

4.1、例子

在Kubernetes中,Pod的自动调度涉及到多个与资源相关的设置,尤其是CPU和内存的配置。以下是关于CPU和内存设置的详细信息,这些设置会影响Pod的调度行为:

4.2、CPU设置

  1. CPU请求(cpuRequests):

    • 指定Pod需要的最小CPU资源量。
    • 例如:cpuRequests: "250m" 表示Pod需要250毫核(millicores)的CPU资源。
  2. CPU限制(cpuLimits):

    • 指定Pod可以使用的最大CPU资源量。
    • 例如:cpuLimits: "500m" 表示Pod最多只能使用500毫核的CPU资源。

4.3、内存设置

  1. 内存请求(memoryRequests):

    • 指定Pod需要的最小内存资源量。
    • 例如:memoryRequests: "128Mi" 表示Pod需要128 Mebibytes(Mi)的内存资源。
  2. 内存限制(memoryLimits):

    • 指定Pod可以使用的最大内存资源量。
    • 例如:memoryLimits: "256Mi" 表示Pod最多只能使用256 Mebibytes的内存资源。

4.4、配置示例

以下是一个Pod定义文件的示例,展示了如何设置CPU和内存的请求和限制:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imageresources:requests:cpu: "250m"memory: "128Mi"limits:cpu: "500m"memory: "256Mi"

在这个示例中,my-pod Pod中的my-container容器请求了250毫核的CPU和128Mi的内存。同时,它设置了500毫核CPU和256Mi内存的限制。

4.5、调度器如何使用这些设置

Kubernetes调度器在调度Pod时会考虑这些资源请求和限制:

  • 过滤(Filtering)阶段: 调度器会筛选出具有足够资源(基于请求)的节点。
  • 打分(Scoring)阶段: 调度器会根据资源的使用情况和其他策略(如亲和性规则)为每个节点打分,选择得分最高的节点来调度Pod。

正确配置资源请求和限制对于确保Pod的稳定运行和集群资源的有效管理至关重要。请求设置得太小可能会导致Pod在资源紧张时被频繁地驱逐,而请求设置得太大可能会导致资源浪费。限制设置得太小可能会导致Pod在资源使用高峰时被杀掉,而设置得太大则可能会导致集群资源过载。

5、Kubernetes Pod调度:定向调度

5.1、指定nodeName

[root@master sch]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-nodenamenamespace: sc
spec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentnodeName: node-1
[root@master sch]# 
[root@master sch]# kubectl apply -f pod.yaml 
pod/pod-nodename created
[root@master sch]# kubectl get pod -n sc
NAME           READY   STATUS    RESTARTS   AGE
pod-nodename   1/1     Running   0          11s
[root@master sch]# kubectl get pod -n sc -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
pod-nodename   1/1     Running   0          21s   10.244.84.152   node-1   <none>           <none>
[root@master sch]# 

5.2、nodeselector 方式实现定向调度

NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的label-selector机制实现的,也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。

  1. 首先分别为node-2节点添加标签:nodeenv=prod

    [root@master sch]# kubectl label nodes node-2 nodeenv=prod
    node/node-2 labeled
    [root@master sch]# kubectl get nodes --show-labels
    NAME     STATUS   ROLES                  AGE   VERSION   LABELS
    node-2   Ready    worker                 11d   v1.20.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-2,kubernetes.io/os=linux,node-role.kubernetes.io/worker=worker,nodeenv=prod
    [root@master sch]# 
    
  2. 给node-1节点添加标签: nodeenv=test

    [root@master sch]# kubectl label nodes node-1 nodeenv=test
    node/node-1 labeled
    [root@master sch]# kubectl get nodes --show-labels|grep node-1
    node-1   Ready    worker                 11d   v1.20.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=worker,nodeenv=test
    [root@master sch]# 
    
  3. 创建一个pod-node-selector.yaml文件,并使用它创建Pod

    [root@master sch]# vim pod-node-selector.yaml
    apiVersion: v1
    kind: Pod
    metadata:name: pod-nodeselectornamespace: sc
    spec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentnodeSelector:nodeenv: prod # 指定调度到具有nodeenv=prod标签的节点上
    [root@master sch]# 
    
    [root@master sch]# kubectl apply -f pod-node-selector.yaml 
    pod/pod-nodeselector created
    [root@master sch]# kubectl get -f pod-node-selector.yaml
    NAME               READY   STATUS    RESTARTS   AGE
    pod-nodeselector   1/1     Running   0          9s
    [root@master sch]# kubectl get -f pod-node-selector.yaml -o wide
    NAME               READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
    pod-nodeselector   1/1     Running   0          14s   10.244.247.28   node-2   <none>           <none>
    [root@master sch]# 
    

6、Kubernetes Pod调度:节点亲和性

6.1、概述

节点亲和性(Node Affinity)是 Kubernetes 中的一个调度特性,它允许你定义规则,指导调度器将 Pod 调度到具有特定特征的节点上。这些特征可以是节点的标签(Labels),也可以是节点的其他属性,如硬件类型、区域等。节点亲和性的目的是确保 Pod 能够运行在最适合其运行条件的节点上,从而优化资源利用率、提高性能或满足特定的部署要求。

亲和性调度(Aw inity)主要分为三类:

  • nodeAw inity(node亲和性):以node为目标,解决pod可以调度到哪些node的问题
  • podAw inity(pod亲和性) :以pod为目标,解决pod可以和哪些已存在的pod部署在同一个拓扑域中的问题
  • podAntiAw inity(pod反亲和性) : 以pod为目标,解决pod不能和哪些已存在pod部署在同一个拓扑域中的问题

6.2、node亲和性

1.选择一个节点,给它添加一个标签:

[root@master sch]# kubectl label nodes node-1 disktype=hdd
node/node-1 labeled
[root@master sch]# kubectl get nodes --show-labels|grep node-1
node-1   Ready    worker                 11d   v1.20.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=hdd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=worker,nodeenv=test
[root@master sch]# 

2.创建pod-nginx的yaml文件

[root@master sch]# vim pod-nginx-podaffinity.yaml
[root@master sch]# cat pod-nginx-podaffinity.yaml 
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:affinity: #亲和性nodeAffinity: #节点亲和性requiredDuringSchedulingIgnoredDuringExecution: #硬限制nodeSelectorTerms:- matchExpressions: #匹配标签- key: disktypeoperator: Invalues:- hdd            containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresent
[root@master sch]# 
[root@master sch]# kubectl apply -f pod-nginx-podaffinity.yaml 
pod/nginx created
[root@master sch]# kubectl get -f pod-nginx-podaffinity.yaml -o wide 
NAME    READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          10s   10.244.84.147   node-1   <none>           <none>
[root@master sch]# 

7、小知识点

  • 每个服务都会有一个ip
  • 通过访问宿主机上的端口,映射到pod里–》外网就可以访问内部的pod了
  • kubectl get service —》用于获取集群中服务(Service)的列表或特定服务的详细信息。
  • kubectl get nodes --show-labels —》查看节点打的标签
  • disk磁盘类型:hdd—>机械磁盘 hard disk driver ssd:固态磁盘

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

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

相关文章

Android 卸载系统自带APP

https://www.xda-developers.com/uninstall-carrier-oem-bloatware-without-root-access/ pm uninstall -k --user 0 NameOfPackage pm install-existing NameOfPackage you can simply use “adb shell cmd package install-existing ” in ADB and you’ll get the package…

ES6 Nunber类型、Math对象扩展

二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法&#xff0c;分别用前缀0b&#xff08;或0B&#xff09;和0o&#xff08;或0O&#xff09;表示。 0b111110111 503 // true 0o767 503 // true// 非严格模式 (function(){console.log(0o11 011); })() // true/…

RAxML-NG安装与使用-raxml-ng-v1.2.0(bioinfomatics tools-013)

01 背景 1.1 ML树 ML树&#xff0c;或最大似然树&#xff0c;是一种在进化生物学中用来推断物种之间进化关系的方法。最大似然&#xff08;Maximum Likelihood, ML&#xff09;是一种统计框架&#xff0c;用于估计模型参数&#xff0c;使得观察到的数据在该模型参数下的概率最…

SpringCloudAlibaba系列之Seata实战

目录 环境准备 1.下载seata安装包 2.修改配置文件 3.准备seata所需配置文件 4.初始化seata所需数据库 5.运行seata 服务准备 分布式事务测试 环境准备 1.下载seata安装包 Seata-Server下载 | Apache Seata 本地环境我们选择稳定版的二进制下载。 下载之后解压到指定目录…

网络分层架构(七/四层协议)详解

OSI七层模型和TCP/IP四层模型 业内普遍的分层方式有两种&#xff1a;OSI七层模型 和TCP/IP四层模型。记忆则为 “应表会传网数物” 关于协议&#xff1a; ① OSI七层模型详解 结构名 功能 主要设备 应用层 是最靠近用户的OSI层。用户接口、应用程序。应用层向应用进程展示…

基金养老怎么选?

养老分三大支柱&#xff0c;分别是基本养老金&#xff0c;企业年金&#xff0c;个人养老金。这里讲一下个人养老金如果靠基金如何来养老。 基金用来养老&#xff0c;分为三种&#xff0c;一中是养老目标基金&#xff0c;一种是高分红的基金&#xff0c;最后一种是有定期现金流的…

不同数据库中sql如何添加数据

在 SQL 中向数据库表中添加数据&#xff0c;通常使用 INSERT 语句。下面是各种主流数据库的代码案例&#xff0c;演示如何向表中添加数据&#xff1a; MySQL -- 向表中添加一行数据 INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3);Pos…

try catch捕获异常,如果代码多了就显得冗余重复。我们可以用ControllerAdvice捕获全局异常变量处理

try catch捕获异常&#xff0c;如果代码多了就显得冗余重复。我们可以用ControllerAdvice捕获全局异常变量处理 比如重复重入unique数据&#xff0c;sql会报错 全局异常捕获 package com.itheima.reggie.common;import lombok.extern.slf4j.Slf4j; import org.springframework…

详解MySql索引

目录 一 、概念 二、使用场景 三、索引使用 四、索引存在问题 五、命中索引问题 六、索引执行原理 一 、概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。暂时可以理解成C语言的指针,文章后面详解 二、使用场景 数据量较大&#xff0c;且…

P1881 绳子对折

题目描述 FJ 有一个长度为 L&#xff08;1≤L≤10,000&#xff09;的绳子。这个绳子上有 N&#xff08;1≤N≤100&#xff09;个结&#xff0c;包括两个端点。FJ 想将绳子对折&#xff0c;并使较短一边的绳子上的结与较长一边绳子上的结完全重合&#xff0c;如图所示&#xff…

CleanMyMac X2024永久免费的强大的Mac清理工具

作为产品功能介绍专员&#xff0c;很高兴向您详细介绍CleanMyMac X这款强大的Mac清理工具。CleanMyMac X具有广泛的清理能力&#xff0c;支持多种文件类型的清理&#xff0c;让您的Mac始终保持最佳状态。 系统垃圾 CleanMyMac X能够深入系统内部&#xff0c;智能识别并清理各种…

kotlin flow sample的用法

sample 方法是用于对数据流进行采样的操作&#xff0c;它会根据指定的时间间隔或者其它条件从数据流中抽取样本。 以下是三个使用 sample 方法的示例&#xff1a; 使用时间间隔进行采样&#xff1a; import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* impo…

C++中内存泄露的几种情况?

在C中&#xff0c;内存泄露主要发生在以下几种情况&#xff1a; 动态分配的内存未释放&#xff1a;使用new操作符动态分配的内存&#xff0c;如果没有在不再需要的时候使用delete释放&#xff0c;就会导致内存泄露。这通常发生在对象生命周期结束时忘记删除&#xff0c;或者在异…

MinGW64 windows gcc编译器安装

下载编译好的文件包 https://sourceforge.net/projects/mingw-w64/ 打开网址 界面左上方 点File 滚轮 滚到下面 点 红框 解压 配置path 环境变量

Vue3+TS+Vite 找不到模块“@/components/xxx/xxx”或其相应的类型声明

引入vue文件时文件是存在的&#xff0c;引入路径也是对的&#xff0c;报找不到模块&#xff0c;有一些解决方案是在tsconfig.json里面做一些配置&#xff0c;大家可以自行百度&#xff08;不知道是不是我百度的不对&#xff0c;我的没有解决&#xff09;还有一种是在项目根目录…

进程学习--02

在C语言中&#xff0c;一般使用fork函数开辟进程&#xff0c;这个函数开辟进程后会返回一个进程号&#xff0c;在子进程中会返回0&#xff0c;在父进程中会返回子进程的进程号。 int main(){int ret fork();if(ret<0){fprintf(stderr, "pid error");exit(-1);}e…

bsdtar 归档程序在保留文件特殊属性上比 GNU tar 更全面和简便

&#xff08;首发地址&#xff1a;学习日记 https://www.learndiary.com/2024/03/bsdtar/ &#xff09; 大家好&#xff0c;我是淘宝网“学习日记小店”的 Linux 服务提供者 learndiary。今天我将重点分享关于 BSD 版 tar 工具—— bsdtar&#xff08;libarchive版本&#xff…

【Python编程基础】第一节.Python基本语法(上)

文章目录 前言⼀、Python介绍二、Python环境配置三、Pycharm 书写代码四、Python基本语法 4.1 print 函数的简单使用 4.2 注释 4.3 Python 代码中三种波浪线和 PEP8 4.4 在 cmd 终端中运⾏ Python 代码 4.5 变量 4.6 数据类型 4.7 类型转换…

字典树 [Tire]

数据结构、算法总述&#xff1a;数据结构/基础算法 C/C_禊月初三的博客-CSDN博客 字典树&#xff0c;英文名 trie。顾名思义&#xff0c;就是一个像字典一样的树。 Trie 树是一种多叉树的结构&#xff0c;它的特点是所有的字符都存储在树的分支上&#xff0c;并且从根节点到某…

什么是VR应急预案演练虚拟化|VR体验馆加盟|元宇宙文旅

VR 应急预案演练虚拟化指的是利用虚拟现实&#xff08;Virtual Reality&#xff0c;VR&#xff09;技术进行应急预案演练的过程。在传统的应急预案演练中&#xff0c;人们通常需要在实际场地或模拟环境中进行演练&#xff0c;这可能存在一些限制&#xff0c;如成本高昂、场地受…