根据
@Tim Hockin的说法,插件的默认配置适用于典型的集群。但可以通过更改资源限制规范进行微调。
在进行插件调整之前,请记住您还可以禁用不必要的插件以供使用。这可能有所不同,具体取决于插件、其版本、Kubernetes版本和提供者。
Google有一个页面涵盖了一些选项,其他提供者也可以使用相同的概念。
根据链接的问题的解决方案和@Tim Hockin的回答,使用addon-resizer是目前最可行的方法。它可以找到最佳限制和要求,修补Deployment/Pod/DaemonSet并重新创建相关的Pod以匹配新的限制,但比手动完成所有这些工作要少得多。
然而,另一种更强大的实现方式是使用Vertical Pod Autoscaler,正如@Tim Smart的回答所述。VPA可以实现addon-resizer的功能,但有许多好处:
- VPA是插件自定义资源定义,使您的代码比使用addon-resizer更加紧凑。
- 作为自定义资源定义,它也更容易保持实现的最新状态。
- 一些提供商(例如谷歌)在控制平面进程上运行VPA资源,而不是在您的工作节点上部署。这样即使addon-resizer更简单, VPA也不会使用任何资源,而addon-resizer则会。
更新后的模板如下:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: <addon-name>-vpa
namespace: kube-system
spec:
targetRef:
apiVersion: "apps/v1"
kind: <addon-kind (Deployment/DaemonSet/Pod)>
name: <addon-name>
updatePolicy:
updateMode: "Auto"
重要的是要检查您当前集群中使用的插件,因为它们可能因提供商(AWS、Google等)和其Kubernetes实现版本而有很大差异。
请确保在您的集群中安装了VPA插件(大多数Kubernetes服务都将其作为一个简单选项来检查)。
更新策略可以是初始(只在创建新的 Pod 时应用新的限制),重新创建(强制不符合规范的 Pod 死亡并应用于新的 Pod),关闭(创建建议但不应用)或自动(目前与重新创建匹配,未来可能会更改)
在@Tim Smart的答案示例中唯一的区别是当前api版本为autoscaling.k8s.io/v1
,目标的当前api版本为apps/v1
,一些提供者的更新版本使用FluentBit代替Fluentd。他的答案可能更适用于早期的Kubernetes版本。
例如,如果您正在使用Google Kubernetes Engine,则当前某些“最重”要求的插件包括:
- fluentbit-gke(DaemonSet)
- gke-metadata-server(DaemonSet)
- kube-proxy(DaemonSet)
- kube-dns(Deployment)
- stackdriver-metadata-agent-cluster-level(Deployment)
通过对其应用VPAs,我的插件资源需求从1.6降至0.4。
--pod-recommendation-min-memory-mb
,默认设置为 250。 我已经在deploy/recommender-deployment.yaml
的recommender
容器中添加了以下内容:args: ["--pod-recommendation-min-cpu-millicores=5", "--pod-recommendation-min-memory-mb=40", "--v=4", "--stderrthreshold=info", "--prometheus-address=http://prometheus.monitoring.svc"]
- Denis Isaev