当先锋百科网

首页 1 2 3 4 5 6 7

一、污点-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常见状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZrU9W2Hz-1684594847635)(D:\MD归档文档\IMG\image-20230520215639218.png)]

常见状态:

  • 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已经自动启动了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eo7VDLS4-1684594847636)(D:\MD归档文档\IMG\image-20230520225350040.png)]