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

このページでは、クラスタ アドオンによって消費されるリソースを減らす方法について説明します。これらの手法は、ノード数が 3 つ以下のクラスタやリソースが限られたマシンタイプを使用するクラスタなど、小規模のクラスタで使用してください。

概要

ワークロードに加えて、クラスタノードは、ノードをクラスタ マスターと統合して他の機能を提供するさまざまなアドオンを実行します。したがって、ノードの総リソース数とワークロードで使用可能なリソースとの間には相違があります。詳細については、GKE のクラスタ アーキテクチャのドキュメントをご覧ください。

これらのアドオンのデフォルト構成は標準的なクラスタに適していますが、アドオンのリソース使用を、特定のクラスタ構成に応じて微調整できます。ご使用の状況で不要なアドオンを無効にすることもできます。

微調整は、コンピューティング リソースが限られたクラスタ(単一ノードのクラスタやノード数が非常に少ないクラスタなど)や、低コストのマシンタイプで実行されるクラスタで特に役立ちます。小規模なクラスタを使用して、GKE を試したり、新しい機能を試したりできます。また微調整は、最初のクラスタクラスタ テンプレートを使用して作成したクラスタにも適用できます。

アドオンを構成する

個別のアドオンごとに構成することで、ノードのリソースに与える影響を削減できます。

アドオンは、クラスタの可視性とデバッグの機能を提供します。たとえば、本番環境ワークロードを実行するクラスタでモニタリングを無効にすると、問題のデバッグがより困難になります。

Stackdriver Logging

Stackdriver Logging により、コンテナログとシステムログが自動的に収集、処理、保存されます。

Stackdriver Logging は完全に無効にできます。また、有効にしたままで Fluentd アドオンを微調整することでリソース使用を制限することもできます。

Stackdriver Logging が無効なときにログを表示する

Stackdriver Logging が無効になっている場合でも、最近のログエントリを表示できます。特定のポッドのログを表示するには、次のコマンドを実行します。

kubectl logs -f [POD_NAME]

-f オプションはログをストリーミングします。

セレクタに一致するすべてのポッドのログを表示するには、次のコマンドを実行します。

kubectl logs -l [SELECTOR]

[SELECTOR] は、デプロイ セレクタ(たとえば "app = frontend")です。

Fluentd を調整する

前述のようにロギングを無効にしない場合は、Fluentd を微調整することによりロギングで使用されるリソースを制限できます。

Fluentd はノードからログを収集して、Stackdriver に送信します。Fluentd エージェントは DaemonSet を使用してクラスタにデプロイされるため、そのエージェントのインスタンスがクラスタの各ノードで実行されます。大量のログデータを書き込むアプリケーションの場合、Fluentd では追加のリソースが必要となる場合もあります。

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

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

Stackdriver Monitoring

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

Stackdriver Monitoring の詳細については、GKE モニタリングの概要をご覧ください。

Stackdriver Monitoring のカスタム指標を水平ポッド オートスケーラー アドオンで使用する場合は、Stackdriver Monitoring を完全に無効にする前に、クラスタで水平ポッド オートスケーラー(HPA)を無効にする必要があります。

Stackdriver Kubernetes Monitoring

クラスタで Stackdriver Kubernetes Monitoring を有効または無効にするには、Kubernetes コンソールを使用する必要があります。このリンクをクリックしてコンソールに移動します。

水平ポッド自動スケーリング

水平ポッド自動スケーリング(HPA)では、CPU 使用率やメモリなどの指標に基づいてデプロイのレプリカがスケーリングされます。HPA が不要で、すでに Stackdriver Monitoring を無効にしている場合は、HPA も無効できます。

HPA を無効にするには、次のコマンドを実行します。

gcloud container clusters update [CLUSTER_NAME] --update-addons=HorizontalPodAutoscaling=DISABLED

HPA を有効にするには、次のコマンドを実行します。

gcloud container clusters update [CLUSTER_NAME] --update-addons=HorizontalPodAutoscaling=ENABLED

Kubernetes ダッシュボード

Kubernetes ダッシュボード アドオンを無効にして、クラスタ リソースを節約できます。このダッシュボードの機能は、Google Cloud Console で使用できる GKE ダッシュボードと同じなので、無効にしてもデメリットはほとんど、あるいはまったくありません。

ダッシュボードを無効にするには、次のコマンドを実行します。

gcloud container clusters update [CLUSTER_NAME] 
--update-addons=KubernetesDashboard=DISABLED

ダッシュボードを有効にするには、次のコマンドを実行します。

gcloud container clusters update [CLUSTER_NAME] 
--update-addons=KubernetesDashboard=ENABLED

Kube DNS

Kube DNS は DNS Deployment とサービスをクラスタ内にスケジュールし、クラスタ内のポッドは Kube DNS サービスを使用し、DNS 名を解決してサービス、ポッド、ノードの IP アドレスや、パブリック IP アドレスに変換します。Kube DNS は example.com などのパブリック ドメイン名や servicename.namespace.svc.cluster.local などのサービス名を解決します。サービスとポッドの DNS の詳細については、こちらをご覧ください。

デフォルトでは、高可用性を維持するために複数の Kube DNS レプリカが実行されます。高可用性の DNS 解決が不要な場合は、Kube DNS レプリカの数を 1 つに減らすことでクラスタ リソースを節約できます。DNS 名前解決がまったく必要ない場合は、Kube DNS を完全に無効にできます。

Kube DNS レプリケーションを減らす

クラスタで高可用性の DNS 解決が不要な場合は、Kube DNS 水平自動スケーリングをオフにしてレプリカ数を 1 つに減らすことで、クラスタ リソースを節約できます。

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 を無効にする

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 を有効にするには、次のコマンドを実行します。

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
Kube DNS を使用しない外部 DNS ルックアップ

ポッドを、任意の DNS サービスを使用した外部ドメイン名解決を使用するよう構成できます。次の例は、外部名ルックアップに Google Public DNS を使用するポッドを示しています。

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 ベースのサービス ディスカバリの代わりに使用できます。ポッドが作成されると、サービス環境変数がポッドと同じ名前空間のすべてのサービスに自動的に作成されます。環境変数の対象は、ポッドが作成される前に作成されたサービスであるため、Kube DNS を使用する場合よりもその範囲が限定されます。

次のステップ