改进 Knative 工作负载的高可用性配置 ¶
发布时间:2023-06-13, 修改时间:2024-01-17
改进 Knative 工作负载的高可用性配置 ¶
作者:Matthias Weßendorf,Red Hat 高级首席软件工程师
在本博文中,您将了解如何使用 Knative Operator 来维护 Knative 工作负载高可用性的细粒度配置。
The Knative Operator 为您提供了用于描述 Knative Serving 和 Eventing 安装的声明式 API。spec
字段具有多个属性,用于定义所需的运行行为。
用于高可用性的便捷全局配置 ¶
查看以下安装清单
apiVersion: operator.knative.dev/v1beta1
kind: KnativeEventing
metadata:
name: knative-eventing
namespace: knative-eventing
spec:
high-availability:
replicas: 3
这将在 knative-eventing
命名空间中配置 Knative Eventing,并定义由 Operator 管理的所有工作负载都需要一个包含 3
个 Pod 的副本集。让我们来看看
kubectl get deployments.apps -n knative-eventing
NAME READY UP-TO-DATE AVAILABLE AGE
eventing-controller 3/3 3 3 58s
eventing-webhook 3/3 3 3 57s
imc-controller 3/3 3 3 53s
imc-dispatcher 3/3 3 3 52s
mt-broker-controller 3/3 3 3 51s
mt-broker-filter 3/3 3 3 51s
mt-broker-ingress 3/3 3 3 51s
对于每个工作负载,我们都看到正好三个部署。现在,仔细看看上面的 shell 代码片段。您会注意到,对于 InMemoryChannel
,我们有 6
个部署:3
个用于 controller
和 dispatcher
数据平面。这并不总是您想要的,因为 InMemoryChannel
更常被用作开发过程中的工具,而在生产场景中,其他工作负载,如 Knative Broker 或 Knative Channel 的 Apache Kafka 实现被使用。
使用工作负载覆盖进行细化 HA 配置 ¶
现在,workloads
字段就派上用场了。workloads
字段允许管理员对由 Knative Operator 管理的每个工作负载进行更细粒度的调整。有关配置选项的详细信息,请参阅 文档。
查看修改后的清单
apiVersion: operator.knative.dev/v1beta1
kind: KnativeEventing
metadata:
name: knative-eventing
namespace: knative-eventing
spec:
high-availability:
replicas: 3
workloads:
- name: imc-controller
replicas: 1
- name: imc-dispatcher
replicas: 1
对于 imc-controller
和 imc-dispatcher
,我们现在对全局默认值进行了覆盖,并将每个部署减少到正好一个。
kubectl get deployments.apps -n knative-eventing
NAME READY UP-TO-DATE AVAILABLE AGE
eventing-controller 3/3 3 3 9m31s
eventing-webhook 3/3 3 3 9m30s
imc-controller 1/1 1 1 9m26s
imc-dispatcher 1/1 1 1 9m25s
mt-broker-controller 3/3 3 3 9m24s
mt-broker-filter 3/3 3 3 9m24s
mt-broker-ingress 3/3 3 3 9m24s
如果系统在此示例中不使用任何 InMemoryChannel
,我们甚至可以将副本设置为 0
。
结论 ¶
虽然 high-availability
为定义 Knative 工作负载的高可用性配置提供了一个简单易用的 API,但 workloads
是一个不错的选择,可以调整和优化安装。虽然 workloads
的配置稍微复杂一些,因为它允许对生产系统的每个工作负载进行覆盖,但建议使用它来根据每个工作负载的实际需求进行调整,而不是依赖于全局默认值,因为全局默认值可能只在开始时看起来很有希望。