我在 Kubernetes 集群(在 OpenFaaS 上运行)上部署了一个 CPU 密集型无服务器函数。我想实现的是,每当调用我的函数时,我的集群中都会启动一个新节点来执行该进程,因为给定时间可能会执行多个进程。到目前为止,我已经创建了一个HPA,设置为CPU利用率的70%:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: 4d-as
namespace: openfaas-fn
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: process-layer
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 70
我还向部署添加了一条podAntiAffinity
规则,以确保在给定节点上仅部署单个副本:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- process-layer
topologyKey: kubernetes.io/hostname
部署还具有resource
配置设置:
requests:
cpu: 400m
memory: 1000Mi
limits:
cpu: 1000m
memory: 2000Mi
到目前为止,我能够启动新节点,并在每个节点上部署我的函数副本。期望的结果是每个节点执行彼此隔离的无服务器功能。例如:
Function invoked with parameter A -> Node 1 executes the function with parameter A
Function invoked with parameter B -> Node 2 executes the function with parameter B
Function invoked with parameter C -> Node 3 executes the function with parameter C
...
相反,我看到的是Node 1
使用参数A
执行函数,然后它开始使用参数B
执行函数。在 CPU 利用率超过 70% 后,Node 2
旋转并开始多次执行我的函数,使用参数A
和B
。
相反,我想要的是Node 1
仅使用参数A
执行我的函数,Node 2
仅使用参数B
执行我的函数,依此类推。
有没有办法实现上述目标?
我认为你需要看看 Kubernetes 作业并指定 podAntiAffinity。 如果您使用的是HPA,则需要不断校准资源参数以实现您正在做的事情。