小規模クラスタでアドオン リソース使用を削減する


このページでは、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 のオペレーション スイートに送信します。Fluentd エージェントは DaemonSet を使用してクラスタにデプロイされるため、そのエージェントのインスタンスがクラスタの各ノードで実行されます。大量のログデータを書き込むアプリケーションの場合、Fluentd では追加のリソースが必要となる場合もあります。

要件に固有のスケーリング ポリシーを作成することで、Fluentd のリソース割り当てを調整できます。スケーリング ポリシーでは、Pod のリソース リクエストと制限が定義されます。Kubernetes スケジューラがリソースのリクエストと制限を処理する方法については、Kubernetes のドキュメントでコンテナのリソースの管理に関する説明をご覧ください。リソース リクエストと制限がサービス品質(QoS)にどのような影響を与えるかについて詳しくは、Kubernetes でのリソース サービス品質をご覧ください。

Fluentd のリソース使用量を測定する方法と、これらの値を使用してカスタム スケーリング ポリシーを作成する方法については、次のセクションを開いてください。

Cloud Monitoring

Cloud Monitoring を使用することをおすすめします。ただし、一部のリソースを再利用するためにモニタリングを無効にすることはできます。

Cloud Monitoring の詳細については、Cloud Operations for GKE の概要をご覧ください。

Cloud Monitoring のカスタム指標を HorizontalPodAutoscaler アドオンで使用する場合は、Cloud Monitoring を完全に無効にする前に、クラスタで HorizontalPodAutoscaler を無効にする必要があります。

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 名を解決して Service、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 を完全に無効化できます。kube-dns は、依存関係のあるサービスの 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
kube-dns を使用しない外部 DNS ルックアップ

Pod を、任意の DNS サービスを使用した外部ドメイン名解決を使用するよう構成できます。次の例は、外部名ルックアップに Google Public 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 と同じ Namespace のすべてのサービスに自動的に作成されます。環境変数の対象は、Pod が作成される前に作成されたサービスであるため、kube-dns を使用する場合よりもその範囲が限定されます。

次のステップ