# 深入了解K8S中的numa nodes per socket

在Kubernetes(K8S)集群中,针对各种应用程序的部署和管理,可以使用numa nodes per socket来优化性能。numa nodes per socket是指每个CPU插槽中的NUMA节点数,可以帮助我们更好地利用硬件资源,提高应用程序的性能和效率。

## 流程概述

下面是实现numa nodes per socket的流程概述,我们将通过以下步骤来完成这一任务。

| 步骤 | 操作 |
| ---- | ---- |
| 1 | 在K8S集群中启用numa支持 |
| 2 | 为Pod指定numa nodes per socket参数 |
| 3 | 部署应用程序并验证性能 |

现在让我们一步步来实现吧!

## 步骤一:启用numa支持

首先,我们需要在K8S集群中启用numa支持。我们可以通过修改kubelet的配置文件来实现。

1. 编辑kubelet配置文件(一般位于/etc/kubernetes/kubelet.conf),添加以下参数:

```bash
KUBELET_EXTRA_ARGS=--feature-gates=NumaTopology=true
```

这样就启用了numa支持。

2. 重启kubelet服务使配置生效:

```bash
systemctl restart kubelet
```

## 步骤二:指定numa nodes per socket参数

接下来,我们需要为Pod指定numa nodes per socket参数,以确保应用程序能够充分利用硬件资源。

1. 在Pod的spec.spec.containers部分添加以下配置:

```yaml
containers:
- name: my-app
...
resources:
limits:
alpha.kubernetes.io/nvidia-gpu: 1
ephemeral-storage: 0.5Gi
hugepages-2Mi: "4Mi"
limits:
cpu: "2"
memory: "4Gi"
name: "my-pod"
numa:
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values: [my-node]
preferred:
nodeSelectorTerms:
- matchExpressions:
- key: nodesocket
operator: NotIn
values: ["NUMA0", "NUMA1"]
```

这里的"NUMA0", "NUMA1"分别表示两个numa节点,根据实际情况调整。

## 步骤三:部署应用并验证性能

最后,我们部署我们的应用程序,并验证性能是否得到了提升。

1. 使用kubectl创建Pod:

```bash
kubectl apply -f my-app.yaml
```

2. 查看Pod运行状态和日志,确保应用程序正常运行:

```bash
kubectl get pods
kubectl logs my-app
```

3. 使用工具监控应用程序性能,比如Prometheus、Grafana等,观察性能是否有所改善。

通过以上步骤,我们成功实现了在K8S集群中使用numa nodes per socket来优化我们的应用程序性能。希望本文对你有所帮助!