k8s污点及容忍度+实践
- 前言
- 一、标签、注解和污点
- 1、如何查询污点及一个容器或者工作负载的标签注解
- a、通过describe命令查看一个节点的详细信息
- 2、标签查询修改
- 二、污点和容忍度
- 容忍度(Tolerations)
- 2、taint / label命令及解释
- 三、为应用程序设置干扰预算(Disruption Budget)
- 四、实践是检验真理的唯一标准
- 1、创建busybox容器。
- 3、实例
- a、mssh 三个副本必须在某个node节点上,假如被分配到node1
- b、ddp 三个副本同一个node节点不能有两个
- c、xxl 三个副本随机分配,但是不能与mssh在同一节点上
前言
因为实际工作种可能存在的需求:
1、同一功能的pod,需要调度到同一节点
2、一个pod需要部署n个副本,且同一节点上只能存在一个副本。
3、k8s避免不了设置节点不可调度,或清空一个node的所有pod
。。。。
根据具体需求,整理下k8s容器的污点及容忍度
环境准备:共三个node节点,master节点设置不可调度
192.168.220.110 master1
192.168.220.120 master2
192.168.220.130 master3
192.168.220.140 node1
192.168.220.150 node2
192.168.220.160 node3
一、标签、注解和污点
Kubernetes 将所有标签和注解保留在 kubernetes.io 和 k8s.io 名字空间中。
1、如何查询污点及一个容器或者工作负载的标签注解
a、通过describe命令查看一个节点的详细信息
kubectl describe node master1
kubectl get nodes -o yaml | grep taint -A 7 ## sts\deploy
2、标签查询修改
##获取pod
root@master1:/u01/yaml# kubectl get pod
NAME READY STATUS RESTARTS AGE
busybox-86c9f49fdd-mf2tx 1/1 Running 48 (3m9s ago) 2d
busybox-86c9f49fdd-pthlg 1/1 Running 48 (3m12s ago) 2d
busybox-86c9f49fdd-sk9hk 1/1 Running 48 (3m9s ago) 2d
##显示容器的标签
root@master1:/u01/yaml# kubectl get pods busybox-86c9f49fdd-mf2tx --show-labels
NAME READY STATUS RESTARTS AGE LABELS
busybox-86c9f49fdd-mf2tx 1/1 Running 48 (3m24s ago) 2d app=busybox,pod-template-hash=86c9f49fdd
##显示节点的标签
root@master1:/u01/yaml# kubectl get node node2 --show-labels
NAME STATUS ROLES AGE VERSION LABELS
node2 Ready <none> 3d2h v1.28.10 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
##添加或修改标签
kubectl label pods <pod-name> <label-key>=<label-value>
kubectl label deployments mssh env=production
deployment.apps/mssh labeled
kubectl get deploy mssh -o yaml | grep -C 2 labels
generation: 1
labels:
env: production
name: mssh
--
metadata:
creationTimestamp: null
labels:
app: mssh
##删除标签
kubectl label pods <pod-name> <label-key>-
kubectl label deployments mssh env-
deployment.apps/mssh unlabeled
metadata:
creationTimestamp: null
labels:
app: mssh
二、污点和容忍度
容忍度(Tolerations)
— Node对Pod对象的排斥(effect)等级有3种:
- NoSchedule:没有配置此污点容忍度的新Pod不能调度到此节点,节点上现存的Pod不受影响。(不允许调度)
- PreferNoSchedule:没有配置此污点容忍度的新Pod尽量不要调度到此节点,如果找不到合适的节点,依然会调度到此节点。(优先不调度)
- NoExecute:没有配置此污点容忍度的新Pod对象不能调度到此节点,节点上现存的Pod会被驱逐。(不允许运行)
— 容忍度操作符(operator)
在Pod上定义容忍度时,它支持两种操作符:Equal和Exists。
- Equal:容忍度与污点必须在key、value和effect三者完全匹配。
- Exists:容忍度与污点必须在key和effect二者完全匹配,容忍度中的value字段要使用空值。
##使用Equal的场景:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoExecute"
##使用Exists的场景:
tolerations:
- key: "key"
operator: "Exists"
effect: "NoExecute"
2、taint / label命令及解释
kubectl taint nodes <节点> key1=value1:NoSchedule
字段可选值:
NoSchedule: 一定不能被调度
PreferNoSchedule: 尽量不要调度
NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod
kubectl label nodes node1 diskType=ssd
kubectl label nodes node2 diskType=ssd
kubectl get nodes --show-labels
kubectl get node -o yaml | grep taint -A 7
apiVersion: v1
kind: Pod
metadata:
name: mssh
labels:
app: mssh
spec:
nodeSelector:
# 选择调度到具有这个label的节点
"disktype": "ssd"
# kubernetes.io/hostname: node2
tolerations:
- key: "disktype"
operator: "Equal"
value: "broken-disk"
effect: "NoSchedule"
containers:
- name: mssh
image: mssh-image
##查询节点的污点(Taints)
root@master1:/u01/yaml# kubectl describe node master1 | grep -i taint
Taints: node.kubernetes.io/unschedulable:NoSchedule
root@master1:/u01/yaml# kubectl describe node node1 | grep -i taint
Taints: <none>
三、为应用程序设置干扰预算(Disruption Budget)
— 用于限制在 Kubernetes 中某个应用程序的 Pod 被删除的速率,以确保在维护或节点故障期间不会影响应用程序的可用性。在设置干扰预算时,你可以指定允许同时终止的 Pod 的最大数量。
- minAvailable: 指定了要保持的最小可用 Pod 数量。这个值可以是一个整数,表示要保持的 Pod 数量,或者是一个百分比字符串,表示要保持的 Pod 数量占总副本数的百分比。
- maxUnavailable: 指定了在维护期间允许不可用的最大 Pod 数量。与 minAvailable 相反,它可以是整数或百分比字符串。如果设置了 minAvailable,则不应设置 maxUnavailable,反之亦然。
- selector: 用于选择受影响的 Pod 的标签选择器。只有匹配这些标签的 Pod 才会受到干扰预算的影响。
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: mssh-budget
spec:
minAvailable: 4 # 设置最小可用数量为 4 个 Pod
selector:
matchLabels:
app: mssh
四、实践是检验真理的唯一标准
1、创建busybox容器。
cat busy-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
spec:
selector:
matchLabels:
app: busybox
replicas: 3
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox:1.32
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- sleep 3600
imagePullSecrets:
- name: default-secret
3、实例
我k8s中共3个node节点分别为node1、node2、node3,现在有3种pod(mssh,ddp,xxl)每个pod需要有6个副本,但是有以下几个条件:
a、mssh 三个副本必须在某个node节点上,假如被分配到node1
apiVersion: apps/v1
kind: Deployment
metadata:
name: mssh
spec:
replicas: 3
selector:
matchLabels:
app: mssh
template:
metadata:
labels:
app: mssh
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
containers:
- name: mssh
image: busybox:1.32
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- sleep 3600
imagePullSecrets:
- name: default-secret
b、ddp 三个副本同一个node节点不能有两个
apiVersion: apps/v1
kind: Deployment
metadata:
name: ddp
spec:
replicas: 3
selector:
matchLabels:
app: ddp
template:
metadata:
labels:
app: ddp
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- ddp
topologyKey: "kubernetes.io/hostname"
containers:
- name: ddp
image: busybox:1.32
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- sleep 3600
imagePullSecrets:
- name: default-secret
c、xxl 三个副本随机分配,但是不能与mssh在同一节点上
apiVersion: apps/v1
kind: Deployment
metadata:
name: xxl
spec:
replicas: 3
selector:
matchLabels:
app: xxl
template:
metadata:
labels:
app: xxl
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- mssh
topologyKey: "kubernetes.io/hostname"
containers:
- name: xxl
image: busybox:1.32
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- sleep 3600
imagePullSecrets:
- name: default-secret