K8s 亲和性拓扑指的是通过设置一些规则,让 Kubernetes 集群中的 Pod 可以更灵活地进行调度,从而实现更高效的资源利用与性能优化。在一些场景下,我们可能需要将一些相关的 Pod 部署到同一个节点上,以提高它们之间的通信效率;或者将一些不相干的 Pod 部署到不同的节点上,以避免资源竞争。本文将向您介绍如何在 Kubernetes 中实现亲和性拓扑。

### 实现步骤

以下是实现 K8s 亲和性拓扑的步骤:

| 步骤 | 操作 |
|------|-------------------------------------------|
| 1 | 创建节点标签 |
| 2 | 创建调度策略 |
| 3 | 设置 Pod 的亲和性拓扑规则 |

### 详细说明

#### 步骤 1:创建节点标签

首先,我们需要为 Kubernetes 集群中的节点设置标签,以便后续可以根据这些标签来进行调度。下面是设置标签的代码示例:

```bash
# 为节点添加标签
kubectl label nodes NODE_NAME key=value
```

在代码示例中,需要将 `NODE_NAME` 替换为相应节点的名称,`key=value` 可以根据实际情况设置标签的键值对。

#### 步骤 2:创建调度策略

接下来,我们可以创建调度策略,来定义 Pod 的亲和性和反亲和性。可以根据需要设置 Pod 的亲和性策略(Pod 之间优先调度在同一节点)或反亲和性策略(Pod 之间避免调度在同一节点)。以下是一个设置亲和性拓扑的代码示例:

```yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: key
operator: In
values:
- value
```

需要注意的是,在上述代码示例中,`key` 和 `value` 需要替换为前面设置的节点标签的实际值。

#### 步骤 3:设置 Pod 的亲和性拓扑规则

最后,我们可以为具体的 Pod 设置亲和性拓扑规则,以实现我们需要的调度策略。以下是一个设置 Pod 亲和性拓扑规则的代码示例:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
template:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app
topologyKey: "kubernetes.io/hostname"
containers:
- name: my-container
image: nginx
```

在上述代码示例中,我们设置了 Pod 的反亲和性策略,要求 `my-app` 标签相同的 Pod 不能调度在同一节点上。

通过以上步骤,我们就可以在 Kubernetes 中实现亲和性拓扑,实现更灵活的 Pod 调度策略,以提高集群的资源利用和性能表现。

希望本文对您能有所帮助,如有任何疑问,请随时联系。祝您在 K8s 的学习路上越走越远!