kubernetes-Pod基于污点、容忍度、亲和性的多种调度策略(一)

2024-03-28 11:36

本文主要是介绍kubernetes-Pod基于污点、容忍度、亲和性的多种调度策略(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Pod调度策略

  • 一.标签
    • 1.什么是标签
    • 2.给Pod资源打标签
    • 3.给Node节点打标签
    • 4.查看标签资源
  • 二.Node选择器
    • 1.nodeName(指定Pod调度到指定Node节点)
    • 2.nodeSelector(指定Pod调度到具有指定标签的Node节点)
  • 三.亲和性
    • 1.Node亲和性-nodeAffinity
    • 2.Pod亲和性-pod-Affinity
    • 3.Pod反亲和性-podAntiAffinity

一.标签

1.什么是标签

标签其实就一对 key/value ,被关联到对象上,比如Pod,标签的使用我们倾向于能够表示对象的特殊特点,就是一眼就看出了这个Pod是干什么的,标签可以用来划分特定的对象(比如版本,服务类型等),标签可以在创建一个对象的时候直接定义,也可以在后期随时修改,每一个对象可以拥有多个标签,但是,key值必须是唯一的。创建标签之后也可以方便我们对资源进行分组管理。如果对pod打标签,之后就可以使用标签来查看、删除指定的pod。
在k8s中,大部分资源都可以打标签。

2.给Pod资源打标签

创建一个Pod资源,定义标签 app:nginxenv:dev

vim test.podapiversion: v1
kind: Pod
metadata:name: testlabels:app: nginxenv: dev
spec: containers:- name: nginximage: nginxports:- containerPort: 80

执行YAML文件创建Pod

kubectl apply -f test.pod

给Pod打标签

kubectl label pod test release=v1

查看Pod标签内容

kubectl  get pod test --show-labels

3.给Node节点打标签

1.添加env标签针对node1节点

kubectl label nodes node1 env=dev

2.查看标签

kubectl get nodes node1 --show-labels

3.删除env节点标签针对node1节点

kubectl label nodes node1 env-

4.查看标签资源

1.查看默认空间下所有Pod资源标签内容

kubectl get pods --show-labels

2.查看kube-system命名空间下所有Pod资源标签内容:

kubectl get pods -n kube-system --show-labels

3.查看默认默认命名空间下,标签Key=app的Pod资源,不显示标签内容:

kubectl get pods -l app

4.查看默认默认命名空间下,标签Key=app的Pod资源,并显示标签内容:

kubectl get pods -L app

5.查看所有命名空间下,所有Pod资源的标签内容

kubectl get pods --all-namespaces --show-labels

6.查看所有Node节点标签

kubectl get nodes --show-labels

二.Node选择器

Node选择器是指,我们在创建Pod资源时指定该Pod资源运行在哪台Node节点上,默认schedule会根据资源随机调度到一个工作节点,但是我们可以通过nodeName、nodeSelector在指定运行到那台Node节点。

1.nodeName(指定Pod调度到指定Node节点)

指定Pod资源调度到指定的Node节点

vim nn-pod.yaml apiVersion: v1
kind: Pod
metadata:name: mypodlabels:app: nginxenv: dev
spec:nodeName: node1  # 运行在node1节点containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

执行资源文件

kubectl apply -f nn-pod.yaml

可以看到Pod调度到了node1节点上

kubectl get pod -owide

2.nodeSelector(指定Pod调度到具有指定标签的Node节点)

指定Pod资源调度到具有哪些标签的节点上,需要注意 当使用nodeSelector 选择了多个标签,会调度到都满足此标签的节点上,并非满足其中一个标签!
如下配置,该Pod资源调度到具有 test=test节点上

vim ns-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: mypodlabels:app: nginxenv: dev
spec:nodeSelector:test: testcontainers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

执行资源文件,我们查看Pod信息时会发现 当前Pod状态处于Pending 状态,就是带决策调度到那台节点上,因为我们并没有具有 test=test 的节点,下面我们给节点打标签

kubectl label  nodes node1 test=test

再次查看,Pod处于Running状态,并调度到了指定节点

kubectl get pods -o wide

三.亲和性

1.Node亲和性-nodeAffinity

K8S中的Node亲和性是指将Pod调度到特定的节点上的能力,通过使用Node亲和性,可以将Pod调度到具有特定硬件、软件或其他特定属性的节点上,以满足应用程序的需求。

我们可以使用 explain 帮助命令查看:

kubectl explain pod.spec.affinity.nodeAffinity
  • prefered软亲和性:表示有节点尽量满足这个位置定义的亲和性,并不是一个必须的条件。

  • require硬亲和性:表示必须有节点满足这个配置定义的亲和性,这是个硬性条件。

1.定义Node硬亲和性示例如下:

cat pod-require-affinity.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-nginxnamespace: defaultlabels:app: nginxenv: dev
spec:affinity:nodeAffinity:                                     # 定义Node亲和性requiredDuringSchedulingIgnoredDuringExecution: # 定义硬亲和性nodeSelectorTerms:                           - matchExpressions:                 # 根据标签选择Node- key: env                        # 定义标签key operator: In                    # IN:等于values:                         # 定义标签values(或者关系)- dev                           # 调度到具有env=dev 或者 env=test 的标签Node节点- testcontainers:- name: nginximage: nginximagePullPolicy: IfNotPresentports: - containerPort: 80 

执行后并不会创建Pod,因为没有满足标签的Node节点;给节点打标签 env=test后则会调度到此Node节点上

kubectl label node master1  env=test
kubectl get pods

2.定义Node软亲和性

cat pod-prefered-affinity.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-nginx-preferednamespace: defaultlabels:env: uatapp: nginx
spec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:   # 软亲和性- preference:matchExpressions:                           # 根据标签选择Node- key: zone                  operator: Invalues:- foo- barweight: 10                                    # 权重值containers:- name: pod-nginx-preferedimage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

执行后 会看到创建的Pod资源,即使没有满足标签的Node节点,也会找一台Node创建Pod资源

kubectl apply -f pod-prefered-affinity.yaml
kubectl get pods

权重值表示:weight 是相对权重,权重值越高,pod被调度到指定的node节点几率就越大

2.Pod亲和性-pod-Affinity

Pod亲和性是指将一组Pod调度到同一台物理主机或逻辑分区中的能力。这种亲和性可以用于确保相关的Pod在同一台主机上运行,以便它们可以更快地进行通信,或者为了提高可靠性,以便它们可以共享相同的存储或网络资源。
我们可以使用 explain 帮助命令查看:

kubectl explain pod.spec.affinity.podAffinity
  • prefered软亲和性:表示有节点尽量满足这个位置定义的亲和性,并不是一个必须的条件。

  • require硬亲和性:表示必须有节点满足这个配置定义的亲和性,这是个硬性条件。

1、定义两个Pod,第二个Pod调度到第一个Pod所在节点上。
第一个Pod资源清单如下:

cat pod-podaffinity-1.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-affinity-1namespace: defaultlabels:app: nginxenv: devspec:containers:- name: nginximage: nginx

第二个Pod资源清单如下

cat pod-podaffinity-2.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-affinity-2namespace: defaultlabels:app: nginxenv: dev
spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:  # 硬亲和性- labelSelector: matchExpressions:- key: app             # 定义 Pod的keyoperator: In         # In = =values: - nginx              # 定义Pod的value,意思指调度到具有app=nginx标签的Pod所在节点topologyKey: kubernetes.io/hostname # 定义Node节点key,用于匹配节点判断是否在同一台服务器containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand: ["sh","-c","sleep 3600"]

按照顺序执行,第二个Pod会调度到第一个Pod所在Node节点上。

kubectl apply -f pod-podaffinity-1.yaml
kubectl apply -f pod-podaffinity-2.yaml

3.Pod反亲和性-podAntiAffinity

和上面Pod亲和性相反,两组Pod不会调度到同一台物理服务器上。

1、定义两个Pod,第二个Pod,禁止调度到第一个Pod所在节点。

第一个Pod资源清单:

cat pod-1.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-1namespace: defaultlabels:app: nginxenv: devspec:containers:- name: nginximage: nginx

第二个Pod资源清单:

cat pod-2.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod-2namespace: defaultspec:affinity:podAntiAffinity:   # Pod反亲和性requiredDuringSchedulingIgnoredDuringExecution:- topologyKey: kubernetes.io/hostnamelabelSelector: # 标签匹配 app=nginxmatchExpressions:- key: appoperator: Invalues: - nginxcontainers:- name: nginximage: nginx

执行文件,两个Pod不会调度到同一个节点

kubectl apply -f pod-1.yaml
kubectl apply -f pod-2.yaml

这篇关于kubernetes-Pod基于污点、容忍度、亲和性的多种调度策略(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855498

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

什么是Kubernetes PodSecurityPolicy?

@TOC 💖The Begin💖点点关注,收藏不迷路💖 1、什么是PodSecurityPolicy? PodSecurityPolicy(PSP)是Kubernetes中的一个安全特性,用于在Pod创建前进行安全策略检查,限制Pod的资源使用、运行权限等,提升集群安全性。 2、为什么需要它? 默认情况下,Kubernetes允许用户自由创建Pod,可能带来安全风险。

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

kubernetes集群部署Zabbix监控平台

一、zabbix介绍 1.zabbix简介 Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件。可以监视各种系统与设备的参数,保障服务器及设备的安全运营。 2.zabbix特点 (1)安装与配置简单。 (2)可视化web管理界面。 (3)免费开源。 (4)支持中文。 (5)自动发现。 (6)分布式监控。 (7)实时绘图。 3.zabbix的主要功能

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不