k8s调度场景

devtools/2024/10/11 7:26:52/

15个KUBERNETES调度情景实用指南

Kubernetes调度是确保集群中的Pod在适当节点上运行的关键组件。通过灵活配置调度策略,可以提高资源利用率、负载平衡和高可用性。

在本文中,我们将深入探讨一些实际的Kubernetes调度场景,并提供相应的配置示例和最佳实践。

1. 基本场景 – NodeSelector

场景描述:我们有一些标记有SSD硬盘的节点,并且希望将需要高性能存储的Pod调度到这些节点上。

Pod配置:

apiVersion: v1
kind: Pod
metadata:name: high-performance-pod
spec:containers:- name: my-containerimage: my-imagenodeSelector:disktype: ssd

2. 高级场景 – 节点亲和性

场景描述:我们希望将需要GPU的任务调度到带有GPU标签的节点上。

Pod配置:

apiVersion: v1
kind: Pod
metadata:name: gpu-pod
spec:containers:- name: my-containerimage: my-imageaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: gpuoperator: Invalues:- "true"

3. 资源分配 – Pod优先级和预选调度

场景描述:为了确保关键任务具有更高的优先级,我们可以定义一个PriorityClass并将其应用到Pod上。

PriorityClass配置:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:name: high-priority
value: 1000000
globalDefault: false
description: "High priority class"

Pod配置:

apiVersion: v1
kind: Pod
metadata:name: high-priority-pod
spec:containers:- name: my-containerimage: my-imagepriorityClassName: high-priority

4. 防止Pod在同一节点上运行 – Pod反亲和性

场景描述:通过Pod反亲和性,我们可以确保同一组中的Pod不会被调度到同一节点上以提高高可用性。

Pod配置:

apiVersion: v1
kind: Pod
metadata:name: anti-affinity-pod
spec:containers:- name: my-containerimage: my-imageaffinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- webtopologyKey: kubernetes.io/hostname

5. 多副本拓扑域分布 – Pod拓扑分布

场景描述:确保同一应用的多个Pod分布在不同的拓扑域以提高可用性。

部署配置:

apiVersion: apps/v1
kind: Deployment
metadata:name: web-deployment
spec:replicas: 3selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: "app"operator: Invalues:- "web"topologyKey: "kubernetes.io/hostname"

6. 节点Taints和PodTolerations

场景描述:通过节点的Taints,我们可以标记节点,只有具有相应Tolerations的Pod才能被调度到这些节点上。

节点配置:

apiVersion: v1
kind: Node
metadata:name: node1
spec:taints:- key: specialvalue: uniqueeffect: NoSchedule

Pod配置:

apiVersion: v1
kind: Pod
metadata:name: toleration-pod
spec:containers:- name: my-containerimage: my-imagetolerations:- key: "special"operator: "Equal"value: "unique"effect: "NoSchedule"

7. 自定义调度器 – 自定义调度器

场景描述:定制调度器以满足特定的调度需求,例如基于业务规则或特殊硬件条件。

自定义调度器示例:

  1. 创建自定义调度器插件
// my_scheduler.go
package mainimport ("k8s.io/kubernetes/pkg/scheduler""k8s.io/kubernetes/pkg/scheduler/framework""k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder""k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption""k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
)const (// YourSchedulerName is the name of your custom schedulerYourSchedulerName = "my-scheduler"
)// New initializes a new scheduler with your custom plugins
func New() *scheduler.Config {return &scheduler.Config{Client:              scheduler.NewHTTPClient(),SchedulerName:       YourSchedulerName,PercentageOfNodesToScore: 0.25,Profiles: []scheduler.Profile{{Name: YourSchedulerName,Plugins: []scheduler.Plugin{defaultpreemption.Name: defaultpreemption.New,defaultbinder.Name:     defaultbinder.New,names.NewNodeResourcesFit(),names.NewNodePorts(),names.NewNodeAffinity(YourSchedulerName),names.NewNodeAffinityPriority(YourSchedulerName),},},},}
}func main() {// Use the New() function to create a new scheduler with your custom pluginsconfig := New()command := app.NewSchedulerCommand(// Use the WithConfig function to set your custom scheduler configurationapp.WithConfig(config),)f := command.Flags()f.AddGoFlagSet(flag.CommandLine)if err := command.Execute(); err != nil {os.Exit(1)}
}
  1. 编译并运行自定义调度器
go build my_scheduler.go
./my_scheduler

8. Pod 优先级和抢占 – Pod 优先级和抢占

场景描述:通过设置 Pod 的优先级和抢占策略,确保关键任务被优先处理。

Pod 配置:

apiVersion: v1
kind: Pod
metadata:name: priority-pod
spec:containers:- name: my-containerimage: my-imagepriorityClassName: high-priority

9. 资源限制和请求 – 资源限制和请求

场景描述:通过为 Pod 设置资源限制和请求,调度器可以更好地优化资源利用。

Pod 配置:

apiVersion: v1
kind: Pod
metadata:name: resource-pod
spec:containers:- name: my-containerimage: my-imageresources:limits:cpu: "2"memory: "1Gi"requests:cpu: "1"memory: "500Mi"

10. 亲和性和反亲和性规则 – 亲和性和反亲和性规则

场景描述:使用亲和性和反亲和性规则确保 Pod 在特定节点上,或避免与其他 Pod 被调度到同一节点。

Pod 配置:

apiVersion: v1
kind: Pod
metadata:name: affinity-pod
spec:containers:- name: my-containerimage: my-imageaffinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: securityoperator: Invalues:- "high"topologyKey: kubernetes.io/hostname

11. Pod 中断预算 – Pod 中断预算

场景描述:使用 Pod 中断预算限制允许在维护期间中断的 Pod 数量,以确保系统稳定性。

PodDisruptionBudget 配置:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:name: web-pdb
spec:maxUnavailable: 1selector:matchLabels:app: web

12. 水平 Pod 自动缩放器 – 水平扩展器

场景描述:使用水平扩展器根据 CPU 使用率或其他指标自动调整 Pod 数量,以满足应用需求。

HorizontalPodAutoscaler 配置:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:name: web-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: web-deploymentminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70

13. Pod 开销 – Pod 开销

场景描述:通过设置 Pod 开销,告知调度器考虑 Pod 需要的额外资源,以避免在节点上调度过多的 Pod。

Pod 配置:

apiVersion: v1
kind: Pod
metadata:name: overhead-pod
spec:containers:- name: my-containerimage: my-imageresources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"overhead:podFixed: 100Miephemeral-storage: 1Gi

14. 节点本地 DNS 缓存 – 节点本地 DNS 缓存

场景描述:在节点上启用本地 DNS 缓存以提高 DNS 查询性能。

kubelet 配置:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
clusterDomain: cluster.local
featureGates:CoreDNSLocalCache: true

15. Pod 优先级类别 – Pod 优先级类别

场景描述:使用 Pod 优先级类别将 Pod 划分为不同的优先级,以确保关键任务被优先调度。

PriorityClass 配置:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:name: high-priority
value: 1000000
globalDefault: false
description: "High priority class"
preemptionPolicy: PreemptLowerPriority

结论

这些场景涵盖了从基础到高级的 Kubernetes 调度实际案例。根据您的需求,您可以选择适当的场景进行配置,以优化集群的资源利用率和性能。

在实际应用中,根据具体需求调整配置,确保调度器的策略符合业务和性能要求。

***********链接:https://yylives.cc/2024/02/29/kubernetes-scheduling-scenario-practical-guide/*************


http://www.ppmy.cn/devtools/6632.html

相关文章

D3-八数码

D3-八数码 题目描述解题思路代码如下 题目描述 解题思路 本题若直接在3*3网格中思考较为困难,可以转换为一维的字符串,在一维字符串中考虑较为简单,要注意本题中两个字符交换位置时只能是x和另外字符交换,本题另外一个难点在于如何…

图论学习总结

目录 图论学习总结前言一、基础知识图的存储图的遍历 二、最短路多源最短路 F l o y d Floyd Floyd​ 算法例题及变形 e g 1 : S o r t i n g I t A l l O u t eg1:Sorting\ It\ All\ Out eg1:Sorting It All Out ( 蓝书例题,传递…

C语言入门算法——选数

题目描述&#xff1a; 已知 n 个整数 x1​,x2​,⋯,xn​&#xff0c;以及 1 个整数 k&#xff08;k<n&#xff09;。从 n 个整数中任选 k 个整数相加&#xff0c;可分别得到一系列的和。例如当 n4&#xff0c;k3&#xff0c;4个整数分别为3,7,12,19 时&#xff0c;可得全部…

稀碎从零算法笔记Day51-LeetCode:最小路径和

题型&#xff1a;DP、数组、矩阵 链接&#xff1a;64. 最小路径和 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为…

如何在 Ubuntu 上启用 IPv6

一、前提条件 一台安装了 Ubuntu 22.04 的计算机具有 sudo 权限的用户账户已连接到支持 IPv6 的网络 二、检查系统是否支持 IPv6 在启用 IPv6 之前&#xff0c;首先要确保您的系统支持 IPv6。要检查内核是否启用了 IPv6&#xff0c;可以运行以下命令&#xff1a; cat /proc/…

Android --- 布局与点击事件

View&#xff08;视图) 此类代表用户界面组件的基本构建块。视图占据屏幕上的一个矩形区域&#xff0c;负责绘图和事件处理。View 是widgets的基类&#xff0c;用于创建交互式 UI 组件&#xff08;按钮、文本字段等&#xff09;。 子类是布局ViewGroup的基类&#xff0c;布局是…

美团财务科技后端一面:如何保证数据一致性?延时双删第二次失败如何解决?

更多大厂面试内容可见 -> http://11come.cn 美团财务科技后端一面&#xff1a;项目内容拷打 美团财务科技后端一面&#xff1a;项目相关面试题&#xff0c;主要包含 Zset、延时双删失败重试、热点数据解决、ThreadLocal 这几个方面相关的内容 由于前几个问题是对个人项目的…

记录golang日常错误处理

golang工作错误记录 1.报错:invalid flag in #cgo LDFLAGS: -Wl,–rpath./ 解决方式: export CGO_CFLAGS_ALLOW".*" export CGO_LDFLAGS_ALLOW".*"2.go get失败 解决方式: go env -w GO111MODULEon3.go代理设置 go env -w GOPROXYhttps://goproxy.cn,d…