0

我在 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使用 parameter 执行函数A,然后开始使用 parameter 执行函数B。CPU 利用率超过 70% 后,Node 2启动并开始多次执行我的函数,使用参数AB.

我想要的是仅使用参数执行我的函数,仅Node 1使用参数执行我的函数,等等。ANode 2B

有没有办法实现上述目标?

4

1 回答 1

0

我认为您需要查看Kubernetes 作业并指定 podAntiAffinity。如果您使用 HPA,则需要不断校准资源参数以实现您正在做的事情。

于 2022-01-28T07:32:25.780 回答