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


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

概览

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

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

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

配置插件

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

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

Cloud Logging

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 调度程序如何处理资源请求和限制,请参阅关于管理容器的资源的 Kubernetes 文档。如需详细了解资源请求和限制如何影响服务质量 (QoS),请参阅 Kubernetes 中的资源服务质量

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

Cloud Monitoring

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

如需详细了解 Cloud Monitoring,请参阅 Cloud Operations for GKE 概览。

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

如需配置 Cloud Monitoring,请参阅为新集群配置监控和日志记录支持

Pod 横向自动扩缩

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

如需停用 Pod 横向自动扩缩插件,请运行以下命令:

gcloud container clusters update CLUSTER_NAME \
    --update-addons=HorizontalPodAutoscaling=DISABLED

如需启用 Pod 横向自动扩缩插件,请运行以下命令:

gcloud container clusters update CLUSTER_NAME \
    --update-addons=HorizontalPodAutoscaling=ENABLED

Kubernetes DNS (kube-dns)

Kubernetes DNS (kube-dns) 对集群中的 DNS Deployment 和服务进行调度,而集群中的 Pod 使用 kube-dns 服务将 DNS 名称解析为服务、Pod、节点的 IP 地址以及公共 IP 地址。kube-dns 可解析公共域名(如 example.com)和服务名称(如 my-svc.my-namespace.svc.cluster-domain.example)。如需了解详情,请参阅服务发现和 DNS

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

如需了解详情,请参阅使用 kube-dns

减少 kube-dns 副本

如需停用 kube-dns autoscaler 并将 kube-dns 减少至 1 个副本,请运行以下命令:

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

如需启用 kube-dns autoscaler,请运行以下命令:

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,请运行以下命令,并将 --replicas=1 替换为所需的副本数:

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

如需启用 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 之前创建的服务创建环境变量。

后续步骤