13. 高可用性

对于生产工作负载,Linkerd 的控制平面可以在高可用性 (HA) 模式下运行。 这种模式:

  • 运行关键控制平面组件的个副本。
  • 在控制平面组件上设置生产就绪(production-ready) CPU内存资源请求。
  • 数据平面代理上设置生产就绪的 CPU内存资源请求
  • 要求代理自动注入器可用于任何要调度的 pod
  • 在关键控制平面组件上设置反亲和性(anti-affinity)策略, 以确保在可能的情况下,默认情况下将它们安排在单独的节点和单独的区域中。

启用 HA

您可以在控制平面安装时使用 --ha 标志启用 HA 模式:

linkerd install --ha | kubectl apply -f -

另请注意,Viz 扩展还支持具有类似特征的 --ha 标志:

linkerd viz install --ha | kubectl apply -f -

您可以在安装时通过将其他标志传递给 install 命令来覆盖 HA 行为的某些方面。 例如,您可以使用 --controller-replicas 标志覆盖关键组件的副本数:

linkerd install --ha --controller-replicas=2 | kubectl apply -f -

请参阅完整的install CLI 文档以供参考。

linkerd upgrade 命令可用于在现有控制平面上启用 HA 模式:

linkerd upgrade --ha | kubectl apply -f -

代理注入器故障策略

HA 代理注入器部署了更严格的故障策略,以强制执行自动代理注入。 此设置可确保在没有 Linkerd 代理的情况下,不会意外安排带注解(annotation)的工作负载在您的集群上运行。 (当代理注入器关闭时可能会发生这种情况。)

如果在准入阶段由于无法识别或超时错误导致代理注入过程失败, 则工作负载准入(workload admission)将被 Kubernetes API 服务器拒绝,部署将失败。

因此,始终至少有一个运行在集群上的代理注入器的健康副本非常重要。

如果您不能保证集群上健康的代理注入器(healthy proxy injector)的数量, 您可以通过将其值设置为 Ignore 来放松 webhook 故障策略, 如 Linkerd Helm chart 所示。

排除 kube-system 命名空间

根据 Kubernetes 文档的建议, 应该为 kube-system 命名空间禁用代理注入器。

这可以通过使用以下标签标记 kube-system 命名空间来完成:

kubectl label namespace kube-system config.linkerd.io/admission-webhooks=disabled

在具有此标签的 namespace 中工作负载的准入阶段,Kubernetes API 服务器不会调用代理注入器。

如果您的 Kubernetes 集群具有可以恢复对 kube-system 命名空间所做的任何更改的内置协调器, 您应该按照这些说明放松代理注入器故障策略。

Pod 反亲和规则

所有关键控制平面组件都部署了 pod anti-affinity 规则以确保冗余。

Linkerd 使用 requiredDuringSchedulingIgnoredDuringExecution pod anti-affinity 规则 来确保 Kubernetes 调度程序不会将关键组件的副本并置在同一节点上。 还添加了一个 preferredDuringSchedulingIgnoredDuringExecution pod anti-affinity 规则, 以尝试在可能的情况下在不同区域中安排副本。

为了满足这些 anti-affinity 规则,HA mode 假设 Kubernetes 集群中始终至少有三个节点。 如果违反此假设(例如,集群缩小到两个或更少的节点),则系统可能会处于功能失效。

请注意,这些 anti-affinity 规则不适用于 PrometheusGrafana 等附加组件。

扩展 Prometheus

Linkerd Viz 扩展提供了一个预配置的 Prometheus pod,但对于生产工作负载, 我们建议设置您自己的 Prometheus 实例。 要抓取数据平面指标,请按照此处的说明进行操作。 这将使您能够更好地控制资源需求备份策略数据保留

在规划存储 Linkerd 时间序列数据的内存容量时,通常的指导是每个网格 pod 5MB

如果您的 Prometheus 由于来自数据平面的数据量而遇到常规的 OOMKilled 事件, 则可以调整的两个关键参数是:

  • storage.tsdb.retention.time 定义了在存储中保留样本的时间。 更高的值意味着需要更多的内存来将数据保存更长时间。 降低此值将减少 OOMKilled 事件的数量,因为数据保留的时间较短
  • storage.tsdb.retention.size 定义了可以为块存储的最大字节数。 较低的值也将有助于减少 OOMKilled 事件的数量

有关更多信息和其他支持的存储选项, 请参阅此处Prometheus 文档。

使用 Cluster AutoScaler

Linkerd 代理将其 mTLS 私钥存储在 tmpfs emptyDir 卷中, 以确保此信息永远不会离开 pod。 这会导致 Cluster AutoScaler 的默认设置无法缩小具有注入工作负载副本的节点。

解决方法是使用 cluster-autoscaler.kubernetes.io/safe-to-evict: "true" annotation 来注入工作负载。 如果您可以完全控制 Cluster AutoScaler 配置, 则可以使用 --skip-nodes-with-local-storage=false 选项启动 Cluster AutoScaler

有关这方面的更多信息,请参阅 此处Cluster AutoScaler 文档。