减少较小集群中的插件资源用量


本页面介绍如何减少 Google Kubernetes Engine (GKE) 集群插件所使用的资源。这些方法适用于小集群,例如节点数不超过 3 个的集群,或是使用资源有限的机器类型的集群。

概览

除了工作负载之外,集群节点还会运行多个插件,这些插件将节点与集群控制层面集成,并提供其他功能。因此,节点的总资源数量与可用于工作负载的资源数量之间存在差异。您可以详细了解 GKE 的集群架构

这些插件的默认配置适用于典型集群,但您可以根据特定集群配置微调插件的资源使用情况。您也可以停用您的用例不需要的一些插件。

对于计算资源有限的集群(例如具有单个节点或极少量节点的集群),或者在低成本机器类型上运行的集群,微调尤其有用。您可以使用小集群来试用 GKE 或新功能。

配置插件

您可以配置每个单独的插件来减少其对节点资源的影响。

借助插件,您可了解并调试您的集群。例如,如果在运行生产工作负载的集群上停用监控功能,则问题调试将更加困难。

Cloud Logging

Cloud Logging 会自动收集、处理和存储容器及系统日志。

您可完全停用 Cloud Logging,也可继续启用它,但要通过微调 Fluentd 插件来限制其资源使用量。

停用 Cloud Logging 后查看日志

停用 Cloud Logging 后,您仍可以查看最近的日志条目。如需查看特定 Pod 的日志,请运行以下命令:

kubectl logs -f pod-name

其中,-f 选项会流式传输日志。

要查看与选择器匹配的所有 pod 中的日志,请运行以下命令:

kubectl logs -l selector

其中,selector 是部署选择器,例如 'app=frontend'

微调 Fluentd

如果您选择不停用日志记录,则可以通过微调 Fluentd 来限制日志记录所使用的资源。

Fluentd 会从节点收集日志,并将其发送到 Google Cloud 的运维套件。 使用 DaemonSet 可将 Fluentd 代理部署到您的集群,该代理的实例能在集群的每个节点上运行。对于写入大量日志记录数据的应用,Fluentd 可能需要更多资源。

您可以通过创建专门针对您的需求的扩缩政策来微调 Fluentd 的资源分配情况。扩缩政策定义 Pod 的资源请求和限制。要了解 Kubernetes 调度程序如何处理资源请求和限制,请参阅管理容器的计算资源。如需详细了解资源请求和限制如何影响服务质量 (QoS),请参阅 Kubernetes 中的资源服务质量

展开下列部分,了解如何测量 Fluentd 的资源使用情况,并了解如何使用这些值编写自定义扩缩政策。

Cloud Monitoring

我们建议您使用 Cloud Monitoring。但是,您也可以停用监控功能来回收一些资源。

如需详细了解 Cloud Monitoring,请参阅 GKE 监控概览

如果您将 Pod 横向自动扩缩程序插件与 Cloud Monitoring 的自定义指标结合使用,则必须先在集群上停用 Pod 横向自动扩缩程序 (HPA),然后才能完全停用 Cloud Monitoring。

Kubernetes Engine Monitoring

如需在集群中启用或停用 Kubernetes Engine Monitoring,请使用 Kubernetes 控制台。点击此链接转到控制台

Pod 横向自动扩缩

Pod 横向自动扩缩 (HPA) 根据 CPU 用量或内存等指标扩缩部署的副本。如果您不需要 HPA 并且已停用 Cloud Monitoring,也可以停用 HPA。

要停用 HPA,请运行以下命令:

gcloud container clusters update cluster-name \
    --update-addons=HorizontalPodAutoscaling=DISABLED

要重新启用 HPA,请运行以下命令:

gcloud container clusters update cluster-name \
    --update-addons=HorizontalPodAutoscaling=ENABLED

Kube DNS

Kube DNS 对集群中的 DNS Deployment 和服务进行调度,而集群中的 Pod 使用 Kube DNS 服务将 DNS 名称解析为服务、Pod、节点的 IP 地址以及公共 IP 地址。Kube DNS 可解析公共域名(如 example.com)和服务名称(如 servicename.namespace.svc.cluster.local)。您可以详细了解服务和 Pod 的 DNS

默认情况下,GKE 会运行多个 Kube DNS 副本以实现高可用性。如果您不需要高度可用的 DNS,则可以通过减少 Kube DNS 副本的数量来节省资源。如果您根本不需要 DNS 名称解析,则可以完全停用 Kube DNS。如果您停用了 Kube DNS,则可以在 Pod 上配置外部 DNS

减少 Kube DNS 副本

要关闭 kube-dns 自动扩缩器并将 kube-dns 减少到 1 个副本,请运行以下命令:

kubectl scale --replicas=0 deployment/kube-dns-autoscaler --namespace=kube-system
kubectl scale --replicas=1 deployment/kube-dns --namespace=kube-system

要启用自动扩缩功能,请运行以下命令:

kubectl scale --replicas=1 deployment/kube-dns-autoscaler --namespace=kube-system

要更精确地控制自动扩缩情况,您可以微调自动扩缩参数

如需了解如何设置自定义 kube-dns Deployment,请参阅设置自定义 kube-dns Deployment

停用 Kube DNS

您可以完全停用 Kube DNS。解析任何相关服务 DNS 名称的工作负载必须使用 Kube DNS。该 DNS 名称包括公共域名和集群服务的名称。

要停用 Kube DNS,请运行以下命令:

kubectl scale --replicas=0 deployment/kube-dns-autoscaler --namespace=kube-system
kubectl scale --replicas=0 deployment/kube-dns --namespace=kube-system

如需启用 Kube DNS,请运行以下命令:

kubectl scale --replicas=1 deployment/kube-dns --namespace=kube-system

其中,--replicas=1 是您所需的副本数量。

如需启用 Kube DNS 自动扩缩功能,请运行以下命令:

kubectl scale --replicas=1 deployment/kube-dns-autoscaler --namespace=kube-system
进行外部 DNS 查找但不使用 Kube DNS

您可以将 Pod 配置为将所选的 DNS 服务与外部域名解析搭配使用。以下示例展示了使用 Google 公共 DNS 查找外部名称的 Pod:

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 8.8.8.8
      - 8.8.4.4
执行服务发现但不使用 Kube DNS

您可以使用服务环境变量来替代基于 DNS 的服务发现。创建 Pod 时,系统将为该 Pod 所在的同一命名空间中的每个服务自动创建服务环境变量。这比使用 Kube DNS 更具限制性,因为此方案仅为在创建该 Pod 之前创建的服务创建环境变量。

后续步骤