首页 > 其他分享 >Kubernetes 调度场景实战指南

Kubernetes 调度场景实战指南

时间:2023-12-16 20:33:01浏览次数:31  
标签:指南 name Kubernetes image 调度 scheduler Pod my

Kubernetes 调度是确保集群中的 Pod 在合适的节点上运行的关键组件。通过灵活配置调度策略,可以提高资源利用率、负载均衡和高可用性。在本文中,我们将深入研究一些实际的 Kubernetes 调度场景,并提供相应的配置示例和最佳实践。

1. 基础场景 - NodeSelector

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

Pod 配置:

apiVersion: v1
kind: Pod
metadata:
  name: high-performance-pod
spec:
  containers:
  - name: my-container
    image: my-image
  nodeSelector:
    disktype: ssd

2. 高级场景 - Node Affinity

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

Pod 配置:

apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
  - name: my-container
    image: my-image
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: gpu
            operator: In
            values:
            - "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-container
    image: my-image
  priorityClassName: high-priority

4. 防止 Pod 在相同节点上运行 - Pod Anti-Affinity

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

Pod 配置:

apiVersion: v1
kind: Pod
metadata:
  name: anti-affinity-pod
spec:
  containers:
  - name: my-container
    image: my-image
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - web
        topologyKey: kubernetes.io/hostname

5. 多副本的拓扑域分布 - Pod Topology Spread

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

Deployment 配置:

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

6. 节点 Taints 和 Pod Tolerations

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

Node 配置:

apiVersion: v1
kind: Node
metadata:
  name: node1
spec:
  taints:
  - key: special
    value: unique
    effect: NoSchedule

Pod 配置:

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

7. Custom Scheduler - 自定义调度器

场景描述: 通过自定义调度器,实现特定调度需求,例如根据业务规则或特殊硬件条件。

自定义调度器示例:

  1. 创建自定义调度器插件
// my_scheduler.go
package main

import (
	"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 scheduler
	YourSchedulerName = "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 plugins
	config := New()
	command := app.NewSchedulerCommand(
		// Use the WithConfig function to set your custom scheduler configuration
		app.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 Priority and Preemption - Pod 优先级和抢占

场景描述: 通过设置 Pod 的优先级和抢占策略,确保关键任务得到优先调度。

Pod 配置:

apiVersion: v1
kind: Pod
metadata:
  name: priority-pod
spec:
  containers:
  - name: my-container
    image: my-image
  priorityClassName: high-priority

9. 资源限制和请求 - Resource Limits and Requests

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

Pod 配置:

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

10. Affinity and Anti-Affinity Rules - 亲和性和反亲和性规则

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

Pod 配置:

apiVersion: v1
kind: Pod
metadata:
  name: affinity-pod
spec:
  containers:
  - name: my-container
    image: my-image
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - "high"
        topologyKey: kubernetes.io/hostname

这些场景覆盖了从基本到高级的 Kubernetes 调度实战案例。根据你的需求,可以选择合适的场景进行配置,以优化集群的资源利用和性能。在实际应用中,根据具体需求调整配置,确保调度器的策略满足业务和性能需求。

标签:指南,name,Kubernetes,image,调度,scheduler,Pod,my
From: https://blog.51cto.com/jiemei/8853852

相关文章

  • 【Web攻防之业务安全实战指南】第8章 回退模块测试
    8.1回退测试8.1.1测试原理和方法很多Web业务在密码修改成功后或者订单付款成功后等业务模块,在返回上一步重新修改密码或者重新付款时存在重新设置密码或者付款的功能,这时如果能返回上一步重复操作,而且还能更改或者重置结果,则存在业务回退漏洞。8.1.2测试过程靶场:8_1.zip首先......
  • 【Web攻防之业务安全实战指南】第6章 业务授权访问模块
    6.1非授权访问测试6.1.1测试原理和方法非授权访问是指用户在没有通过认证授权的情况下能够直接访问需要通过认证才能访问到的页面或文本信息。可以尝试在登录某网站前台或后台之后,将相关的页面链接复制到其他浏览器或其他电脑上进行访问,观察是否能访问成功。6.1.2测试过程靶......
  • Kubernetes: client-go 源码剖析(二)
    上接Kubernetes:client-go源码剖析(一)2.3运行informer运行informer将Reflector,informer和indexer组件关联以实现informer流程图的流程。2.3.1ReflectorList&Watch运行informer:informer.Run(stopCh)//client-go/tools/cache/shared_informer.gofunc(s*s......
  • Kubernetes: client-go 源码剖析(一)
    0.前言在看kube-scheduler组件的过程中遇到了kube-scheduler对于client-go的调用,泛泛的理解调用过程总有种隔靴搔痒的感觉,于是调转头先把client-go理清楚在回来看kube-scheduler。为什么要看client-go,并且要深入到原理,源码层面去看。很简单,因为它很重要。重要在两方......
  • Kubernetes v1.29 新特性一览
    新特性一览大纲一、Core组件增强调度器增强在Kubernetesv1.29中,Core组件经历了一系列增强,其中一个重要的改进是调度器的增强。这些增强使得调度器能够更加智能和高效地管理容器的调度和分配。通过引入新的调度算法和策略,调度器能够更好地适应不同的资源需求和约束条件,提高集群的容......
  • 前端实现无服务文本文件上传和解析的完整指南
    前言在许多前端应用程序中,用户可能需要上传文本文件并对其进行解析,而无需依赖后端服务。本文将详细介绍如何在前端实现无服务的文本文件上传和解析功能,并提供一个完整的指南以及示例代码。1.文件上传1.1HTML文件上传控件在前端实现文件上传功能,我们首先需要一个文件上传控件......
  • 协程与互斥锁: Kotlin Mutex的终极指南
    引言今天我们将深入研究Kotlin中的Mutex(互斥锁)原理以及在实际开发中的使用技巧。Mutex是多线程编程中的关键工具,它可以有效地解决多线程访问共享资源时可能发生的竞态条件问题。Mutex的基本原理Mutex是互斥锁的缩写,它是一种同步工具,用于保护共享资源,确保在任何时刻只有一个线程可以......
  • Keil uVersion 4单片机开发指南
    1软件安装双击打开C51V901.exe弹出安装界面,点击Next>>点击同意协议勾选框,接着点击Next>>点击Browse...选择合适的目录,接着点击Next>>按要求填写相关信息,然后点击Next>>软件安装中,等待安装完成点击Finish完成安装2注册激活桌面右键打开KeiluVision4,弹出菜单后选......
  • 百度工程师移动开发避坑指南——Swift语言篇
    百度工程师移动开发避坑指南——Swift语言篇百度Geek说 ​关注 1人赞同了该文章作者|启明星小组上一篇我们介绍了移动开发常见的内存泄漏问题,见《百度工程师移动开发避坑指南——内存泄漏篇》。本篇我们将介绍Swift语言部分常见问题。对于......
  • Helm Chart 部署 Redis 的完美指南
    目录一、Helm介绍二、安装Helm三、配置Helm的repository四、部署chart(以部署redis为例)1.搜索chart2.拉取chart3.修改values.yaml的一些配置(简单演示一下基本的配置)4.启动chart5.升级和回滚a.升级b.回滚一、Helm介绍Helm是一个Kubernetes的包管理工具,就像Linux下的包管......