kubernetes-污点和容忍
- kubernetes-污点和容忍
- 1、什么是污点(Taint)
- 2、什么是容忍度(Toleration)
- 3、为什么master节点上不跑业务pod
- 4、这种打污点让我想到了通过nodename可以指定node节点
- 5、怎么打污点
- 5.1、基本用法
- 5.2、查了一下chat
- 5.3、effect污点效果的三种状态
- 5.4、打标签的时候定义的key和value有什么用呢
- 6、查看有没有打污点
- 7、打污点实验
- 7.1、实验1
- 7.2、实验2
- 8、容忍时间
- 9、内置污点
- 10、操作符Equal 和 Exists 的区别是什么
- 11、k8s中的HPA功能比传统的集群有什么优势?
- 12、k8s的调度算法(💘)
kubernetes-污点和容忍
1、什么是污点(Taint)
污点(Taint)是一种用于节点调度的机制。污点可以被认为是节点上的一种属性,它表示节点具有一些特定的限制或条件。当节点设置了污点后,只有具有对应的容忍(Toleration)标记的Pod才能被调度到该节点上。
在node节点上打污点,调度器在调度的时候,会选择没有污点的节点去启动pod。
2、什么是容忍度(Toleration)
pod有污点的节点服务器,任然可以调度到这个节点上去运行
调度器在调度的过程中会查看节点服务器是否有污点,然后看pod的策略里是否能容忍这个污点,如果能容忍就调度到这个节点服务器上,如果不能容忍就不调度过去。
本质上可以达到想让哪些pod调度到哪些节点上
3、为什么master节点上不跑业务pod
因为master有污点!!!
默认业务pod都不调度到master
4、这种打污点让我想到了通过nodename可以指定node节点
[root@master taint_toleration]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:name: demo-podnamespace: defaultlabels:app: myappenv: dev
spec:nodeName: node-1containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand:- "/bin/sh"- "-c"- "sleep 3600"
[root@master taint_toleration]#
[root@master taint_toleration]# kubectl apply -f pod.yaml
pod/demo-pod created
[root@master taint_toleration]# kubectl get -f pod.yaml -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-pod 1/1 Running 0 9s 10.244.84.185 node-1 <none> <none>
[root@master taint_toleration]#
很明显在node-1上
5、怎么打污点
5.1、基本用法
可以使用命令 kubectl taint
给节点增加一个污点
kubectl taint nodes node1 key1=value1:NoSchedule
给节点 node1
增加一个污点,它的键名是 key1
,键值是 value1
,效果是 NoSchedule
。 这表示只有拥有和这个污点相匹配的容忍度的 Pod 才能够被分配到 node1
这个节点。
若要移除上述命令所添加的污点,你可以执行:
kubectl taint nodes node1 key1=value1:NoSchedule-
5.2、查了一下chat
在 Kubernetes 中,你可以使用污点(Taints)和容忍(Tolerations)来影响 Pod 的调度。
设置节点上的污点:
要设置节点上的污点,你需要编辑节点的描述并添加 taints。以下是一个示例:
apiVersion: v1
kind: Node
metadata:name: xianchaonode1
spec:taints:- key: example-keyvalue: example-valueeffect: NoSchedule
key
: 污点的键,用于标识污点。value
: 污点的值,可选。effect
: 污点的效果,可以是NoSchedule
、PreferNoSchedule
或NoExecute
。在这个例子中,NoSchedule
表示新的 Pod 不会被调度到具有这个污点的节点上。
设置 Pod 的容忍:
要设置 Pod 的容忍,你需要在 Pod 的描述中添加 tolerations。以下是一个示例:
apiVersion: v1
kind: Pod
metadata:name: demo-pod
spec:tolerations:- key: example-keyoperator: Equalvalue: example-valueeffect: NoSchedule
key
: 容忍的键,应该与节点上的污点的键匹配。operator
: 操作符,通常为Equal
。value
: 容忍的值,应该与节点上的污点的值匹配。effect
: 容忍的效果,通常为NoSchedule
。
这样,Pod 就能够容忍节点上的具有匹配污点的条件,从而可以被调度到这样的节点上。
请注意,这只是一个简单的示例,实际上可以根据需要进行更复杂的设置,包括容忍多个污点和在容忍中使用 Exists
操作符等。
5.3、effect污点效果的三种状态
NoSchedule
:- 这是最常见的效果。当节点上有这个效果的污点时,新的 Pod 将不会被调度到该节点上。
- 已经在节点上运行的 Pod 不受影响,它们将继续在节点上运行。
PreferNoSchedule
:- 这个效果表示 Kubernetes 将尽量避免在具有该污点的节点上调度 Pod,但不是强制性的。如果没有其他可用的节点,Pod 仍然可以被调度到带有
PreferNoSchedule
污点的节点上。 - 已经在节点上运行的 Pod 不受影响,它们将继续在节点上运行。
- 这个效果表示 Kubernetes 将尽量避免在具有该污点的节点上调度 Pod,但不是强制性的。如果没有其他可用的节点,Pod 仍然可以被调度到带有
NoExecute
:- 这是一个更强制的效果。除了阻止新的 Pod 被调度到带有这个污点的节点上之外,它还会影响已经在节点上运行的 Pod。
- 对于已经在节点上运行的 Pod,如果它们不满足容忍(Tolerations),它们将被驱逐(eviction)出节点。这是一个更强制的效果,用于确保节点上的 Pod 在添加了
NoExecute
污点后被逐出。
5.4、打标签的时候定义的key和value有什么用呢
在Kubernetes中,打标签是为了给资源对象(例如Pod、Node、Service等)附加自定义的元数据。标签由键值对组成,键和值可以是任意字符串。
标签的作用是用于对资源进行分类、筛选和识别。通过为资源对象添加标签,你可以根据标签来选择性地操作或管理这些资源。
- 标识是什么类型的污点
- 方便调度的时候,pod能识别出来,容忍这个污点
6、查看有没有打污点
[root@master taint_toleration]# kubectl describe node master|grep -i taint
Taints: node-role.kubernetes.io/master:NoSchedule
[root@master taint_toleration]#
7、打污点实验
7.1、实验1
尝试给自己的node-1打污点
kubectl taint nodes node-1 cf=tencent:NoSchedule
[root@master taint_toleration]# kubectl taint nodes node-1 cf=tencent:NoSchedule
node/node-1 tainted
[root@master taint_toleration]# kubectl describe node node-1|grep -i taint
Taints: cf=tencent:NoSchedule
[root@master taint_toleration]#
创建pod看是否能调度到node-1上
[root@master taint_toleration]# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 6selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16.1ports:- containerPort: 80
[root@master taint_toleration]#
实践一下: 发现都在node2上
[root@master taint_toleration]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-559d658b74-9zr2c 1/1 Running 0 65s 10.244.247.2 node-2 <none> <none>
nginx-deployment-559d658b74-dgfpn 0/1 ContainerCreating 0 65s <none> node-2 <none> <none>
nginx-deployment-559d658b74-l4whp 1/1 Running 0 65s 10.244.247.1 node-2 <none> <none>
nginx-deployment-559d658b74-wnjxj 1/1 Running 0 65s 10.244.247.7 node-2 <none> <none>
nginx-deployment-559d658b74-wspwq 0/1 ContainerCreating 0 65s <none> node-2 <none> <none>
nginx-deployment-559d658b74-xrtr5 1/1 Running 0 65s 10.244.247.10 node-2 <none> <none>
sc-nginx-deployment-66b6c48dd5-cxkzn 1/1 Running 1 8h 10.244.84.183 node-1 <none> <none>
sc-nginx-deployment-66b6c48dd5-qmmn6 1/1 Running 1 8h 10.244.84.184 node-1 <none> <none>
[root@master taint_toleration]#
如果这个时候给node-2上也打个污点,状态用:NoExecute,那所有的pod都不能用了,状态变为:Pending
kubectl taint nodes node-2 cf=tencent:NoExecute
[root@master taint_toleration]# kubectl taint nodes node-2 cf=tencent:NoExecute
node/node-2 tainted
[root@master taint_toleration]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-559d658b74-4mbvp 0/1 Pending 0 2s <none> <none> <none> <none>
nginx-deployment-559d658b74-9zr2c 0/1 Terminating 0 10m 10.244.247.2 node-2 <none> <none>
nginx-deployment-559d658b74-c6kzv 0/1 Pending 0 2s <none> <none> <none> <none>
nginx-deployment-559d658b74-dgfpn 0/1 Terminating 0 10m 10.244.247.9 node-2 <none> <none>
nginx-deployment-559d658b74-hqn4s 0/1 Pending 0 2s <none> <none> <none> <none>
nginx-deployment-559d658b74-l4whp 0/1 Terminating 0 10m 10.244.247.1 node-2 <none> <none>
nginx-deployment-559d658b74-lqzz5 0/1 Pending 0 2s <none> <none> <none> <none>
nginx-deployment-559d658b74-tz5ks 0/1 Pending 0 2s <none> <none> <none> <none>
nginx-deployment-559d658b74-vz7bj 0/1 Pending 0 2s <none> <none> <none> <none>
nginx-deployment-559d658b74-wnjxj 0/1 Terminating 0 10m 10.244.247.7 node-2 <none> <none>
nginx-deployment-559d658b74-wspwq 0/1 Terminating 0 10m 10.244.247.12 node-2 <none> <none>
nginx-deployment-559d658b74-xrtr5 1/1 Terminating 0 10m 10.244.247.10 node-2 <none> <none>
sc-nginx-deployment-66b6c48dd5-cxkzn 1/1 Running 1 8h 10.244.84.183 node-1 <none> <none>
sc-nginx-deployment-66b6c48dd5-qmmn6 1/1 Running 1 8h 10.244.84.184 node-1 <none> <none>
[root@master taint_toleration]#
这个时候加个容忍度限制 ,修改yaml文件----》定义pod的容忍度能接受定义的污点
[root@master taint_toleration]# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 6selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16.1ports:- containerPort: 80tolerations:- key: "cf"operator: "Equal"value: "tencent"effect: "NoExecute"
[root@master taint_toleration]#
[root@master taint_toleration]# kubectl apply -f nginx.yaml
deployment.apps/nginx-deployment configured
[root@master taint_toleration]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-7ffb6b798c-hpbrn 1/1 Running 0 28s 10.244.247.13 node-2 <none> <none>
nginx-deployment-7ffb6b798c-k82vg 1/1 Running 0 25s 10.244.247.16 node-2 <none> <none>
nginx-deployment-7ffb6b798c-khh2c 1/1 Running 0 25s 10.244.247.19 node-2 <none> <none>
nginx-deployment-7ffb6b798c-nvbxw 1/1 Running 0 25s 10.244.247.14 node-2 <none> <none>
nginx-deployment-7ffb6b798c-pvr7x 1/1 Running 0 28s 10.244.247.18 node-2 <none> <none>
nginx-deployment-7ffb6b798c-s8tzz 1/1 Running 0 28s 10.244.247.11 node-2 <none> <none>
sc-nginx-deployment-66b6c48dd5-cxkzn 1/1 Running 1 8h 10.244.84.183 node-1 <none> <none>
sc-nginx-deployment-66b6c48dd5-qmmn6 1/1 Running 1 8h 10.244.84.184 node-1 <none> <none>
[root@master taint_toleration]#
然后就都跑起来了
7.2、实验2
修改nginx.yaml文件的operator和key
[root@master taint_toleration]# vim nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment-3
spec:replicas: 6selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16.1ports:- containerPort: 80tolerations:- key: ""operator: "Exists"value: ""effect: ""
[root@master taint_toleration]#
能容忍任何的污点和排斥等级
[root@master taint_toleration]# kubectl apply -f nginx.yaml
deployment.apps/nginx-deployment-3 created
[root@master taint_toleration]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-3-6bd9f68d59-6kpl9 1/1 Running 0 82s
nginx-deployment-3-6bd9f68d59-7whcx 1/1 Running 0 82s
nginx-deployment-3-6bd9f68d59-86xz9 1/1 Running 0 82s
nginx-deployment-3-6bd9f68d59-888dn 1/1 Running 0 82s
nginx-deployment-3-6bd9f68d59-hsbj7 1/1 Running 0 82s
nginx-deployment-3-6bd9f68d59-kj5f9 1/1 Running 0 82s
如果key为空,操作符号是Exists ↓
8、容忍时间
在Kubernetes中,污点(Taints)和容忍度(Tolerations)是调度策略的一部分,用于控制Pod是否可以被调度到特定的节点上。当节点上有污点,并且Pod具有相应的容忍度时,Pod可以被调度到该节点。容忍度中的“容忍时间”(tolerationSeconds)是一个特定的字段,它与NoExecute
效果的污点相关联。
当一个节点被标记为NoExecute
效果的污点时,意味着新的Pod将不会被调度到这个节点上,而且已经存在于该节点上的Pod也会被驱逐。然而,如果你在Pod的容忍度中设置了tolerationSeconds
,这将为Pod提供一个宽限期,在这个宽限期内,Pod可以继续在该节点上运行,即使它不容忍节点上的污点。
tolerationSeconds
的值是一个整数,表示Pod在被驱逐之前可以继续在节点上运行的秒数。当tolerationSeconds
设置为0时,Pod将立即被驱逐。如果tolerationSeconds
没有被设置,Pod将不会被赋予任何宽限期,一旦节点上的污点变为NoExecute
,Pod将立即被驱逐。
这是一个NoExecute
污点和tolerationSeconds
的示例:
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imagetolerations:- key: "key"operator: "Equal"value: "value"effect: "NoExecute"tolerationSeconds: 3600
在这个例子中,如果Pod被调度到一个具有相应污点的节点上,它将有3600秒(1小时)的时间来完成其工作并在被驱逐前进行清理。这个时间允许系统管理员或自动化工具在Pod被强制移除之前,有机会重新调度Pod到其他节点。
9、内置污点
10、操作符Equal 和 Exists 的区别是什么
在 Kubernetes 中,Equal
和 Exists
是容忍(Tolerations)操作符,用于定义 Pod 在调度时对节点上的污点的容忍条件。
-
Equal(等于):
- 使用
Equal
操作符时,你可以指定具体的污点键、值和效果,以确保 Pod 只会被调度到具有与容忍条件完全匹配的污点的节点上。 - 例如,如果你的节点上有一个污点:
key=example-key, value=example-value, effect=NoSchedule
,你可以在 Pod 中添加以下容忍条件,以确保它只能被调度到带有相同污点的节点上:tolerations: - key: example-keyoperator: Equalvalue: example-valueeffect: NoSchedule
- 使用
-
Exists(存在):
- 使用
Exists
操作符时,你只需指定污点的键,而不需要指定值和效果。Pod 将容忍带有匹配键的任何污点,无论污点的值和效果如何。 - 这对于那些只关心某个特定键是否存在,而不关心具体值和效果的情况非常有用。
- 例如,如果你只关心节点上是否存在一个名为
example-key
的污点,而不关心其值和效果,你可以使用以下容忍条件:tolerations: - key: example-keyoperator: Exists
- 使用
总的来说,Equal
更精确,要求匹配键、值和效果,而 Exists
只关心键是否存在,不考虑值和效果。选择使用哪种操作符取决于你的具体需求和场景。
11、k8s中的HPA功能比传统的集群有什么优势?
-
启动速度快
-
扩展性更高
-
资源消耗方面---->节省服务器
-
价格
-
成本
-
稳定性
-
可靠性
12、k8s的调度算法(💘)
-
deployment: 全自动调度 --》根据每台节点服务器的综合算力
-
nodename 节点名字
-
node selector:定向调度–>根据node的标签去调度
-
nodeaffinity 节点亲和性 --》尽量把不同的pod放到一台node上
-
podaffinity pod亲和性–》尽量把相同的pod放到一起
-
taints和tolerations 污点和容忍度