一、污点-Taint
在 Kubernetes 中,污点(Taint)是一种标记,用于标识一个Node节点上的某些资源或条件不可用或不可接受。当一个节点被标记了污点后,只有那些能够容忍该污点的 Pod 才能被调度到该节点上。
污点常用与以下场景:
- 将某些节点标记为“故障”,以防止新的 Pod 被调度到这些节点上;
- 将某些节点标记为“高负载”,以防止过多的 Pod 被调度到这些节点上,导致节点过载;
- 将某些节点标记为“专用”,以保证只有特定的 Pod 能够被调度到这些节点上。
1、查看定义taint
帮助信息
kubectl explain node.spec.taints
污点排斥等级如下:
- NoSchedule:表示Pod不会被调度到具有该污点的节点上,不影响已经存在的Pod。
- PreferNoSchedule:表示调度器会尽量避免将Pod调度到具有该污点的节点上。
- NoExecute:表示如果节点上已经存在该污点,那么Pod将被驱逐出该节点。如果Pod没有相应的容忍度,那么Pod将被删除。
2、定义污点
kubectl taint nodes node-1 node-type=dev:NoSchedule
3、查看 node-1
Node节点污点信息
kubectl describe nodes node-1|grep Taints
4、删除 node-1
Node节点 node-type
污点
kubectl taint nodes node-1 node-type=dev:NoSchedule-
二、容忍度-Tolerations
当我们节点定义污点后,如果我们不定义对应的容忍度,那么Pod将不会调度到此Node节点。
为了方便下面实验,我把所有node节点全部定义上污点
kubectl taint nodes node-1 node-type=dev:NoSchedule
kubectl taint nodes node-2 node-type=dev:NoSchedule
查看定义容忍度帮助:
kubectl explain pod.spec.tolerations
1、定义Pod容忍度,容忍node-type=dev
且 排斥等级等于NoExecute
的污点,使用了operator=Equal
表示这三点必须同事满足。
cat pod-1.yml
---
apiVersion: v1
kind: Pod
metadata:
name: pod-1
namespace: default
labels:
app: nginx
env: dev
spec:
tolerations:
- effect: "NoExecute" # 指定排斥等级
key: "node-type" # 污点key
operator: "Equal" # Equal表示等于
value: "dev" # 污点value
tolerationSeconds: 3600 # 删除Pod前等待时间,默认30s
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
执行文件:
kubectl apply -f pod-1.yml
查看状态,因为没有任何节点满足该Pod容忍,所以该Pod处于Pending状态
kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-1 0/1 Pending 0 10m
2、定义Pod容忍度,将排斥等级改为 NoSchedule
,这样我们污点key,value,排斥等级都满足了,Pod才会调度 Pod资源清单文件如下:
cat pod-2.yml
---
apiVersion: v1
kind: Pod
metadata:
name: pod-2
namespace: default
labels:
app: nginx
env: dev
spec:
tolerations:
- effect: "NoSchedule" # 指定排斥等级
key: "node-type" # 污点key
operator: "Equal" # Equal表示等于
value: "dev" # 污点value
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
执行文件
kubectl apply -f pod-2.yml
查看状态,Pod成功调度,且状态为 Running
kubectl get pods pod-2
NAME READY STATUS RESTARTS AGE
pod-2 1/1 Running 0 5m32s
3、定义Pod容忍度,将 operator=Exists
表示满足其中一项即可容忍,下面Pod没有定义key,value,表示没有key,value方面限制,容忍排斥等级=NoSchedule的节点。
cat pod-3.yml
---
apiVersion: v1
kind: Pod
metadata:
name: pod-3
namespace: default
labels:
app: nginx
env: dev
spec:
tolerations:
- effect: "NoSchedule" # 指定排斥等级
operator: "Exists" # Exists表示满足一项即可
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
执行文件
kubectl apply -f pod-3.yml
查看状态,Pod成功调度,且状态为 Running
kubectl get pods pod-3
NAME READY STATUS RESTARTS AGE
pod-3 1/1 Running 0 5m16s
二、Pod重启策略
1、Pod常见状态
常见状态:
-
Pending(挂起):Pod 已经被 Kubernetes API 接受,但是容器镜像还没有被拉取到本地,或者某些容器正在等待其他容器启动。
-
Running(运行):Pod 中的所有容器都已经被创建并且至少有一个容器正在运行。
-
Succeeded(成功):Pod 中的所有容器都已经成功地完成了它们的任务并退出。
-
Failed(失败):Pod 中的所有容器都已经退出,并且至少有一个容器以非零状态退出。
-
Unknown(未知):Pod 的状态无法被 Kubernetes API 服务器获取,通常是由于与 API 服务器的通信故障导致的。
其他状态:
- Unschedulable:Pod不能被调度, scheduler没有匹配到合适的node节点。
- PodScheduled:调度器已经为Pod选择了一个节点,并且该节点已经为该Pod分配了资源,表示Pod已经被调度到了一个节点上,但是它还没有被调度器标记为已经运行。
- Initialized:所有pod中的初始化容器已经完成了。
- ImagePullBackOff:Pod所在的node节点下载镜像失败。
2、Pod重启策略
Pod的重启策略,应用于Pod中所有的容器,可以通过在 Pod 的 YAML 文件中设置 restartPolicy
字段来指定 Pod 的重启策略。
- Always:只要容器退出,kubelet就会自动重启该容器。(默认策略)
- OnFailure:只有在 Pod 失败时才会被重启。
- Never:Pod 不会被重启。
- OnChanged:只有在 Pod 的配置发生变化时才会被重启。
1、创建 Pod,指定 Always
重启策略
cat pod-always.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-always
namespace: default
labels:
env: uat
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx-container
image: nginx
执行文件 && 动态查看Pod状态:
kubectl apply -f pod-always.yaml
kubectl get pods nginx-always -w
进入Pod内部将Nginx手动停止掉,查看Pod状态
kubectl exec -it nginx-always -- /bin/bash
nginx -s stop
可以看到Pod已经自动启动了