千家信息网

kubernetes yaml 文件 调动 污点容忍

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,1.基本用法apiVersion: v1kind: Pod#创建的资源类型可以是,Deployment、Job、Ingress、Service等metadata:#包含Pod的一些meta信息,比如名
千家信息网最后更新 2025年02月01日kubernetes yaml 文件 调动 污点容忍

1.基本用法

apiVersion: v1kind: Pod#创建的资源类型可以是,Deployment、Job、Ingress、Service等metadata:#包含Pod的一些meta信息,比如名称、namespace、标签等信息  name: ng1  #Podname  labels:  #标签    app: webspec:  containers:    - name: ng1      #容器name      image:  hub.c.163.com/library/nginx      #镜像拉取地址      imagePullPolicy: IfNotPresent      #镜像拉取策略,Always,(无论本地是否有每次都拉取) Never,(每次都不拉取,即使本地没有也不拉取) IfNotPresent(本地有就用,没有就去拉)       ports:      #对外开放端口        - containerPort: 80

2.调度策略

节点选择器: nodeSelector、nodeName
基于node_name调度

apiVersion: v1kind: Podmetadata:  name: ng2spec:  nodeName: cs25  #指定调度到"cs25" node节点上  containers:    - name: ng2      image:  hub.c.163.com/library/nginx

基于node标签来调度
kubectl label nodes cs25 disk=ssd
#给节点cs25 添加标签

apiVersion: v1kind: Podmetadata:  name: ng2spec:  nodeSelector:    disk: ssd    #表示要只有node节点上有"disk=ssd",才能被调度上去  containers:    - name: ng2      image:  hub.c.163.com/library/nginx

节点亲和性调度: nodeAffinity

apiVersion: v1kind: Podmetadata:  name: ng2spec:  affinity:    nodeAffinity:      requiredDuringSchedulingIgnoredDuringExecution:      #requiredDuringSchedulingIgnoredDuringExecution 硬亲和性 必须满足亲和性,满足不调用      #preferredDuringSchedulingIgnoredDuringExecution 软亲和性 能满足最好,不满足也没关系。        nodeSelectorTerms:        - matchExpressions:          - key: disk            operator: In            #表示上面那个字段必须包含下面两个值, 还可以换成"NotIn"取反            values:            - jx            - ssd      #表示 只能调度到node有"disk=jx" 或"node=ssd"  containers:    - name: ng2

POD调度 podAffinity 和 podAntiAffinity

apiVersion: v1kind: Podmetadata:  name: ng2  labels:    app: nginxspec:  containers:    - name: ng2      image:  hub.c.163.com/library/nginx---apiVersion: v1kind: Podmetadata:  name: ng3spec:  containers:    - name: ng3      image:  hub.c.163.com/library/nginx  affinity:    podAntiAffinity:    #反亲和,表示满足条件的,让两个主机不在同一台node主机上运行,换成"podAffinity:"功能相反      requiredDuringSchedulingIgnoredDuringExecution:      - labelSelector:          matchExpressions:          - {key: app, operator: In, values: ["nginx"]}        topologyKey: kubernetes.io/hostname                #亲和标准,表示node 都有hostname这个键名,及value 一样我们就认为他们在同一台节点

labelSelector : 选择跟那组Pod亲和
namespaces : 选择哪个命名空间
topologyKey : 指定节点上的哪个键
假如在反亲和场景"topologyKey: type" 这个node标签所有主机都有,则第二台容器无法被调度到任何主机

3.污点容忍调度

kubectl taint nodes cs25 key=value:NoSchedule
NoSchedule:仅影响调度过程,对现存的Pod对象不产生影响;
NoExecute:既影响调度过程,也影响显著的Pod对象;不容忍的Pod对象将被驱逐
PreferNoSchedule: 表示尽量不调度

创建污点
kubectl taint node cs25 rongren=true:NoSchedule
#表示在cs25节点上创建一个 rongren的键 键值为"true",调度策略为NoSchedule
kubectl taint node cs25 rongren-
#删除污点,指定键名加"-"即可

apiVersion: v1kind: Podmetadata:  name: ng6spec:  containers:    - name: ng6      image:  nginx  tolerations:  #设置容忍性  - key: "rongren"    operator: "Equal"    #如果操作符为Exists,那么value属性可省略,表示key这个存在即通过,如果不指定operator,则默认为Equal,value一定要和设置的值相等,否则无法通过    value: "true"    effect: "NoSchedule"  #意思是这个Pod要容忍的有污点的Node的key是"rongren" Equal true,效果是NoSchedule,  #tolerations属性下各值必须使用引号,容忍的值都是设置Node的taints时给的值。

如果在设置node的Taints(污点)之前,就已经运行了一些Pod,那么这些Pod是否还能继续在此Node上运行? 这就要看设置Taints污点时的effect(效果)了。

    如果effect的值是NoSchedule或PreferNoSchedule,那么已运行的Pod仍然可以运行,只是新Pod(如果没有容忍)不会再往上调度。   而如果effect的值是NoExecute,那么此Node上正在运行的Pod,只要没有容忍的,立刻被驱逐。   虽然是立刻被驱逐,但是K8S为了彰显人性化,又给具有NoExecute效果的污点, 在容忍属性中有一个可选的      tolerationSeconds字段,用来设置这些Pod还可以在这个Node之上运行多久,给它们一点宽限的时间,到时间才驱逐。   如果是以Pod来启动的,那么Pod被驱逐后, 将不会再被运行,就等于把它删除了。   如果是deployment/rc,那么删除的pod会再其它节点运行。   如果是DaemonSet在此Node上启动的Pod,那么也不会再被运行,直到Node上的NoExecute污被去除或者Pod容忍。
0