我正在开展一个与研究 Kubernetes 扩展如何工作相关的大学项目,但我一直面临一个问题:我有一个包含一个主节点(用于控制平面)和一个边缘节点的集群,并且我在部署中启用了 HPA创建完毕,命名为
stress-app
,下面分别是部署和服务YAML文件:
stress-app-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: stress-app
spec:
replicas: 1
selector:
matchLabels:
app: stress-app
template:
metadata:
labels:
app: stress-app
spec:
containers:
- name: stress-app
image: annis99/stress-app:v0.2
imagePullPolicy: Always
ports:
- containerPort: 8081
resources:
requests:
cpu: 0.5
memory: 100Mi
stress-app-service.yaml
apiVersion: v1
kind: Service
metadata:
name: stress-app-service
spec:
selector:
app: stress-app
ports:
- protocol: TCP
port: 8081
targetPort: 8081
type: LoadBalancer
该应用程序是一个使用 FastAPI 构建的简单 API,具有一个端点
'/workload/cpu'
,调用时会使用stress-ng CLI 工具创建一个虚假的 CPU 负载。
该应用程序工作正常,但是,当我尝试对集群进行负载测试以查看 HPA 扩展时,它有时会扩展至 8 个副本,但只有一个 pod 副本可以处理大多数请求,从而导致托管节点的 CPU 峰值较高那个复制品。我还检查了其他副本是否正在运行并且不处于挂起状态。
在尝试使用 JMeter、Locust 和 K6 负载测试工具时,通过将 keep-alive 设置为 False,我注意到了这一点,但是,当我尝试使用浏览器(Google Chrome)打开多个选项卡并同时请求该端点时,会出现更多副本参与并处理请求,从而更公平地分配工作量。你知道为什么复杂的负载测试工具会发生这种情况吗?
尝试 Pod 反亲和力
示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- myapp
topologyKey: "kubernetes.io/hostname"
containers:
- name: myapp
image: myapp:latest