# 深入了解Kubernetes中的k8s污点和亲和度

### 步骤概览

| 步骤 | 描述 |
| --- | --- |
| 步骤一 | 创建具有特定污点的节点 |
| 步骤二 | 创建具有亲和度要求的Pod |

### 步骤详解

#### 步骤一: 创建具有特定污点的节点

在Kubernetes中,通过为节点添加“污点”(Taint)来限制哪些Pod可以在该节点上运行。这可以用来确保特定类型的Pod只能运行在指定的节点上,比如需要某些特殊硬件资源的Pod。

首先,我们需要为节点添加一个污点。下面是如何为节点添加一个具有key为"specialnode"和value为"true"的污点:

```bash
kubectl taint nodes specialnode=true:NoSchedule
```

这行代码的含义是给指定的节点设置一个名为"specialnode"的污点,值为"true",并且指定效果为"NoSchedule",即不允许非匹配的Pod调度到这个节点上。

#### 步骤二: 创建具有亲和度要求的Pod

亲和度(Affinity)用于指定Pod应该在哪些节点上运行。有两种亲和度类型:node亲和度和pod亲和度。Node亲和度指定Pod应该调度到包含特定标签的节点上,而Pod亲和度指定Pod应该与其他Pod一起调度到同一节点上。

我们来创建一个具有Node亲和度的Pod,只能调度到有特定污点的节点上。

首先,我们需要定义一个亲和度规则(Affinity rule),在这个规则中我们指定Pod应该运行在具有指定污点的节点上。下面是一个示例YAML文件:

```yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: specialnode
operator: Exists
containers:
- name: my-container
image: nginx
```

在这个YAML文件中,我们定义了一个名为"my-pod"的Pod,通过nodeAffinity指定了Pod应该运行在具有"specialnode"污点的节点上。这样就确保了这个Pod只会被调度到符合条件的节点上运行。

通过上面的步骤,我们成功实现了使用污点和亲和度来限制Pod调度到指定节点上的目的。希望这篇文章能帮助你更好地理解Kubernetes中的k8s污点和亲和度的概念。