K8s的标签应用和调度

K8s资源身份标签Labels

Labels是用于标识和选择K8s资源的键值对

可以对Pod、Node、Service、Deployment、Namespace等资源使用标签;

用途:

  • 分类和组织:通过标签可以将对象分组,如将同一个应用的所有Pod标记为一个标签。

  • 筛选和管理:使用标签选择器(Label Selector)来选择和操作特定标签的对象。

  • 自动化操作:结合标签选择器,可以在自动化流程中操作和管理对象,如自动缩放、自动部署等。

使用方法:

1.创建资源时,添加标签

javascript 复制代码
 apiVersion: v1
 kind: Pod
 metadata:
   name: my-pod
   labels:
     app: my-app
     environment: production
 spec:
   containers:
   - name: my-container
     image: nginx
 # 通过标签名筛选Pod
 kubectl get pod -l app=my-app
 kubectl get pod -l app

2.在资源运行时,添加或者修改标签(使用kubectl)

javascript 复制代码
 # 添加标签(动态添加,yaml文件不显示,但是可以通过这个标签筛选)
 kubectl label pod <pod-name> server=nginx
 # 删除标签
 kubectl label pod <pod-name> server-
 # 重新添加标签
 kubectl label pod <pod-name> server=apache

在资源中使用标签的方式:

javascript 复制代码
 apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: my-deployment
 spec:
   replicas: 3
   selector:         # 标签选择器
     matchLabels:    # 通过键值对绑定标签
       app: my-app   # 需要管理Pod的标签
   template:         # 创建Pod的模板,通过Deployment自动创建Pod
     metadata:
       labels:
         app: my-app # Pod的标签,用于被筛选和管理
     spec:
       containers:
       - name: my-container
         image: nginx
 # 查看标签
 kubectl describe pod <pod-name>
 # 查看所有Pod的标签
 kubectl get pod -A --show-labels

结合使用

标签和标签选择器在 Kubernetes 中有广泛的应用,以下是一些常见的结合使用场景:

  • 服务发现 :使用标签选择器将 Service 绑定到特定的 Pod,实现负载均衡和服务发现。
  • 自动化编排 :使用标签选择器自动化编排,如使用 HorizontalPodAutoscaler 根据标签选择器自动扩展 Pod。
  • 资源分组:使用标签将相关资源分组,便于管理和查询。

最佳实践

  1. 命名规范:使用有意义的标签键和值,便于理解和维护。
  2. 避免过度标签:避免添加过多不必要的标签,保持标签的简洁性和实用性。
  3. 一致性:在不同对象和团队之间保持标签的一致性,便于协作和自动化管理。

K8s集群调度介绍

Scheduler:调度器

作用:

在创建运行Pod时,用于将Pod的创建请求绑定到Node节点上;

可以满足调度的公平、高效、灵活;

核心:

  • 公平:如何保证每个节点都能被分配资源

  • 资源高效利用:集群所有资源最大化被使用

  • 效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作

  • 灵活:允许用户根据自己的需求控制调度的逻辑

调度过程:

1、过滤掉不满足条件的节点,预选(predicate)

2、按照节点的优先级排序,优选(priority)

3、选择优先级最高的Node节点。如果中间任何一步骤有错误,就直接返回错误。

调度方法:

1.自动调度:Scheduler经过一系列的算法计算得出最优节点;

2.定向调度

  • NodeName:指定Node名称进行调度

  • NodeSelector:通过Node标签进行选择调度

3.亲和性调度

  • NodeAffinity:节点亲和性

  • PodAffinity:Pod亲和性

  • PodAntiAffinity:Pod反亲和性

4.污点(容忍)调度

  • Taints:给Node节点打上污点,需要容忍度才能调度(没有该污点容忍度的Pod无法调度);

  • Toleration:在Pod上设置容忍度,才能运行在有污点的Node上;

几种调度方法的案例

固定调度案例:

# 指定固定节点:Pod.spec.nodeName

javascript 复制代码
 vim node1.yaml 
 apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: myweb
 spec:
   selector:
     matchLabels:
       app: myweb
   replicas: 6
   template:
     metadata:
       labels:
         app: myweb
     spec:
       nodeName: node1           # 指定Node的名称,实现固定调度
       containers:
       - name: myweb
         image: 192.168.57.200:8099/yun11/h5-game:1.0
         ports:
         - containerPort: 80

# 指定固定节点标签:Pod.spec.nodeSelector

javascript 复制代码
 vim node-2.yaml
 apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: myweb
 spec:
   selector:
     matchLabels:
       app: myweb
   replicas: 4
   template:
     metadata:
       labels:
         app: myweb
     spec:
       nodeSelector:        # 通过给Node节点打标签,使用标签选择器进行Pod调度
         cname: webserver
       containers:
       - name: myweb
         image: docker.io/nginx
         ports:
         - containerPort: 80
 # 没有对应标签的节点,所以会卡在Pending
 # 给node2创建一个标签cname:webserver
 kubectl label node node2 cname=webserver
 # 查看结果
 kubectl get node --show-labels
 kubectl get pod -o wide
 # 删除标签
 kubectl label nodes node2 cname- 
 # 一键删除多个控制器
 kubectl delete deployment myweb

污点与容忍度

如果Node节点上有污点,需要Pod有容忍度才能调度运行;

污点的三种排斥级别

  • NoSchedule:没有容忍度的Pod不能新建,已经运行的Pod不受影响;(没有配置此污点容忍度的新Pod不能调度到此节点,节点上现存的Pod不受影响)。

  • PreferNoSchedule:没有容忍度的Pod尽量不要创建,如果没有其他节点可以选择,也能创建;(没有配置此污点容忍度的新Pod尽量不要调度到此节点,如果找不到合适的节点,依然会调度到此节点)。

  • NoExecute:驱逐所有Pod应用;(没有配置此污点容忍度的新Pod对象不能调度到此节点,节点上现存的Pod会被驱逐)。

用法

污点定义在节点的nodeSpec中,容忍度定义在Pod的podSpec中。

污点和容忍度都是键值对的数据格式,但是要增加一个排斥等级(effect)标记。

语法格式为:"key=value:effect"。

使用场景

1、独占节点
  • 如果想拿出部分节点给特定的Pod使用,可以通过给节点添加污点,然后特定的Pod加入对应的容忍度。

  • 在集群中有些机器设备可能比较特殊,比如CPU性能很好、内存很大等等,不希望普通Pod占用这部分特殊节点,可以通过污点和容忍度来解决。

2、驱逐Pod

上文中定义了Node对Pod的排斥等级有3种。Node如果定义的排斥等级是NoExecute,那么没有配置该污点容忍度的Pod会被驱逐。

K8S 也会使用污点自动标识有问题的节点,比如节点在内存不足的情况下,节点控制器会自动为该节点打上污点信息,并且使用 NoExecute作为排斥等级,此时没有设置此类污点容忍度的Pod 会被驱逐。

DaemonSet控制器会无视此类污点,以便能在节点上部署重要的Pod。

目前,内置的污点也比较多,比如以下几个:

容忍度操作符

在Pod上定义容忍度时,它支持两种操作符:Equal和Exists。

  • Equal:容忍度与污点必须在key、value和effect三者完全匹配。

  • Exists:容忍度与污点必须在key和effect二者完全匹配,容忍度中的value字段要使用空值。

给Node打污点

javascript 复制代码
 # 给节点添加污点:
 kubectl taint nodes node1 key=value:effect
 # 举例
 kubectl taint nodes node1 aihao=shuijiao:Noschedule(单个的)
 kubectl taint nodes node1 exi=dubo:NoExecute
 # 给节点删除污点,此处的effect可以没有
 kubectl taint nodes node1 key[:effect]-
 # 举例:
 kubectl taint nodes node1 exi-

给Pod增加容忍度

javascript 复制代码
 ## 容忍度和container平级,注意缩进,需要多几个副本一起测试建议用deployment
 # 使用Equal的场景:(根据键的值容忍)
 tolerations:
 - key: "key"
   operator: "Equal"
   value: "value"
   effect: "NoExecute"
 # 使用Exists的场景:(根据键是否存在来容忍)
 tolerations:
 - key: "key"
   operator: "Exists"
   effect: "NoExecute"

补充:

如果Node上污点的排斥等级是NoExecute时,该Node上正在运行的Pod如果没有该污点的容忍度,就会被立刻驱逐。不过系统增加了tolerationSeconds字段,用来延迟驱逐Pod。

tolerationSeconds字段的意思是:如果 Pod 的容忍度配置里存在 排斥等级为 NoExecute ,并且指定了属性 tolerationSeconds 的值,那么Pod 还能继续在该节点上运行的时间(单位为秒):

javascript 复制代码
tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoExecute"
  tolerationSeconds: 3600
相关推荐
墨倾许2 小时前
《Windows 11 + Docker:极简DVWA靶场搭建全记录》—— 附详细排错指南与最终解决方案
windows·笔记·网络安全·docker·容器·靶场
岚天start2 小时前
解决方案—K8S集群的日志按天并按照命名空间分类定时同步到日志服务器
服务器·docker·kubernetes·shell·日志备份
梁萌3 小时前
linux中使用docker安装MySQL
linux·运维·docker·容器·mysql安装
晨晖23 小时前
docker打包,启动java程序
java·docker·容器
文言一心3 小时前
SenseVoice 离线部署指南(Xinference Docker v1.12)
运维·docker·ai·容器
AIchiNiurou3 小时前
mermaid install for free docker
运维·docker·容器
❀͜͡傀儡师3 小时前
根据docker服务保存日志脚本,时间可选版本
运维·docker·容器
Orlando cron3 小时前
K8s 中创建一个 Deployment 的完整流程
云原生·容器·kubernetes
Serverless社区4 小时前
助力企业构建 AI 原生应用,函数计算FunctionAI 重塑模型服务与 Agent 全栈生态
阿里云·云原生·serverless