このチュートリアルでは、Elastic Cloud on Kubernetes(ECK)オペレーターを使用して GKE で Elastic Stack を実行する方法について説明します。
Elastic Stack は、リアルタイムのデータのロギング、モニタリング、分析に使用される一般的なオープンソース ソリューションです。GKE で Elastic Stack を使用すると、GKE Autopilot と強力な Elastic Stack 機能により、優れたスケーラビリティと信頼性を利用できます。
このチュートリアルは、Kubernetes 管理者またはサイト信頼性エンジニアを対象としています。
目標
- GKE クラスタを作成する。
- ECK オペレーターをデプロイする。
- ECK オペレーターを使用して Elasticsearch クラスタと Kibana を構成する。
- ECK オペレーターを使用して、完全な Elastic Stack をデプロイする。
- Elasticsearch クラスタを自動スケーリングし、Elastic Stack Deployment をアップグレードする。
- Elastic Stack を使用して Kubernetes 環境をモニタリングする。
費用
このドキュメントでは、課金対象である次のコンポーネントを使用します。 Google Cloud
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init -
プロジェクトを作成または選択します Google Cloud 。
プロジェクトを選択または作成するために必要なロール
- プロジェクトを選択する: プロジェクトの選択には特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。詳しくは、ロールを付与する方法をご覧ください。
-
プロジェクトを作成します。 Google Cloud
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
GKE API を有効にします。
API を有効にするために必要なロール
API を有効にするには、 権限を含む Service Usage 管理者 IAM ロール(
roles/serviceusage.serviceUsageAdmin)が必要です。serviceusage.services.enable詳しくは、ロールを付与する方法をご覧ください。gcloud services enable container.googleapis.com
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init -
プロジェクトを作成または選択します Google Cloud 。
プロジェクトを選択または作成するために必要なロール
- プロジェクトを選択する: プロジェクトの選択には特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。詳しくは、ロールを付与する方法をご覧ください。
-
プロジェクトを作成します。 Google Cloud
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
GKE API を有効にします。
API を有効にするために必要なロール
API を有効にするには、 権限を含む Service Usage 管理者 IAM ロール(
roles/serviceusage.serviceUsageAdmin)が必要です。serviceusage.services.enable詳しくは、ロールを付与する方法をご覧ください。gcloud services enable container.googleapis.com
-
ユーザー アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。
roles/container.clusterAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
次のように置き換えます。
PROJECT_ID: プロジェクト ID。USER_IDENTIFIER: ユーザー アカウントの識別子。例:myemail@example.com。ROLE: ユーザー アカウントに付与する IAM ロール。
- ドメイン名を所有している必要があります。ドメイン名は 63 文字以下にする必要があります。Cloud Domains または他の登録事業者を使用できます。
環境を準備する
このチュートリアルでは、Cloud Shell を使用して Google Cloudでホストされているリソースを管理します。Cloud Shell には、kubectl、Helm、gcloud CLI など、このチュートリアルに必要なソフトウェアがプリインストールされています。
Cloud Shell を使用して環境を設定するには、次の操作を行います。
Google Cloud コンソールで
(Cloud Shell をアクティブにする)をクリックして、 Google Cloud コンソールから Cloud Shell セッションを起動します。これにより、 Google Cloud コンソールの下部ペインでセッションが起動します。
Helm チャート リポジトリを追加して更新します。
helm repo add elastic https://helm.elastic.co helm repo updateGitHub リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git作業ディレクトリを変更します。
cd kubernetes-engine-samples/observability/elastic-stack-tutorial
GKE クラスタを作成する
コントロール プレーンの指標の収集を有効にして GKE クラスタを作成します。
gcloud container clusters create-auto elk-stack \
--location="us-central1" \
--monitoring="SYSTEM,WORKLOAD,API_SERVER,SCHEDULER,CONTROLLER_MANAGER"
ECK オペレーターをデプロイする
Elastic Cloud on Kubernetes(ECK)は、Kubernetes クラスタに Elastic Stack をデプロイして管理するためのプラットフォームです。
ECK は、Elastic Stack クラスタのデプロイと管理を自動化し、Kubernetes での Elastic Stack の設定とメンテナンスのプロセスを簡素化します。提供される Kubernetes カスタム リソースのセットを使用すると、Elasticsearch、Kibana、Application Performance Management Server、その他の Elastic Stack コンポーネントを Kubernetes で作成し、構成できます。これにより、デベロッパーと DevOps チームは、Elastic Stack クラスタを大規模に構成して管理できます。
ECK は、複数の Elasticsearch ノード、自動アプリケーション フェイルオーバー、シームレス アップグレード、SSL 暗号化をサポートしています。ECK には、Elasticsearch のパフォーマンスをモニタリングしてトラブルシューティングできる機能も含まれています。
ECK Helm チャートをインストールします。
helm upgrade --install "elastic-operator" "elastic/eck-operator" \ --version="2.8.0" \ --create-namespace \ --namespace="elastic-system" \ --set="resources.limits.cpu=250m" \ --set="resources.limits.memory=512Mi" \ --set="resources.limits.ephemeral-storage=1Gi" \ --set="resources.requests.cpu=250m" \ --set="resources.requests.memory=512Mi" \ --set="resources.requests.ephemeral-storage=1Gi"オペレーターの準備ができるまで待ちます。
watch kubectl get pods -n elastic-system出力は次のようになります。
NAME READY STATUS RESTARTS AGE elastic-operator-0 1/1 Running 0 31sオペレーター
STATUSがRunningの場合は、Ctrl+Cを押してコマンドラインに戻ります。
ECK を使用して Elastic Stack を構成する
Elastic Stack をフリートモードで動作する Elasticsearch、Kibana、Elastic Agent とともに使用すると、Kibana を使用してデータの管理と可視化を行う強力でスケーラブルなフルマネージド ソリューションを設定できます。
Kibana は、Elasticsearch でデータを検索、分析、可視化できるオープンソースのデータ分析および可視化ツールです。
Elastic Agent は、ログや指標などのさまざまなソースからデータを収集し、自動的に Elasticsearch に送信する軽量のデータシッパーです。
Elastic Fleet は、Elastic エージェントが中央のフリート サーバーに報告し、構成と管理を処理する運用モードです。フリート サーバーにより、Elastic エージェントのデプロイ、構成、スケーリングが簡素化され、大規模で複雑なデプロイの管理が容易になります。
Elasticsearch 自動スケーリングは、オペレーターが定義したポリシーに基づいて追加のリソースが必要になったときに報告を行うセルフ モニタリング機能です。たとえば、利用可能なディスク容量に基づいて特定のティアをスケーリングするようにポリシーで指定できます。Elasticsearch では、ディスク容量をモニタリングし、不足が予測された場合にスケーリングを提案できます。必要なリソースを追加するかどうかはオペレーターの判断によります。Elasticsearch 自動スケーリングの詳細については、Elasticsearch ドキュメントの自動スケーリングをご覧ください。
Elasticsearch クラスタを構成する
Elasticsearch は、大量のデータを迅速かつ効率的に保存および検索するように設計された、分散型の RESTful 検索および分析エンジンを提供します。
Kubernetes に Elastic Stack をデプロイする場合は、Elasticsearch に必要な VM 設定(特に vm.max_map_count setting)を管理する必要があります。vm.max_map_count は、プロセスがファイルに割り当てることができるメモリ領域の数を指定します。Elasticsearch を最適に実行するには、この値を少なくとも 262144 に設定する必要があります。詳細については、ECK ドキュメントの
仮想メモリ
をご覧ください。
次のマニフェストを確認します。
このマニフェストでは、ホストでカーネル設定を直接構成する DaemonSet を記述しています。DaemonSet は、Pod のコピーがクラスタ内の各ノードで実行されるようにする Kubernetes コントローラです。
上記のマニフェストは、Autopilot で実行するための許可リストに登録されています。このマニフェスト(コンテナ イメージを含む)は変更しないでください。
このマニフェストをクラスタに適用します。
kubectl apply -f max-map-count-setter-ds.yaml次のマニフェストを確認します。
このマニフェストでは、次のフィールドを使用して Elasticsearch クラスタを定義しています。
initContainers: 仮想メモリホストのカーネル設定が変更されるまで待機します。podDisruptionBudget: Pod のデフラグ プロセス中にクラスタを破棄しないことを指定します。config.node.roles: Elasticsearch ノードロールの構成。ノードロールの詳細については、Elasticsearch ドキュメントでノードをご覧ください。
このマニフェストをクラスタに適用します。
kubectl apply -f elasticsearch.yamlElasticsearch クラスタの準備が整うまで待ちます。
watch kubectl --namespace elastic-system get elasticsearches.elasticsearch.k8s.elastic.co出力は次のようになります。
NAME HEALTH NODES VERSION PHASE AGE elasticsearch green 3 8.8.0 Ready 5m3sElasticsearch クラスタ
HEALTHがgreenで、PHASEがReadyの場合は、Ctrl+Cを押してコマンドラインに戻ります。
Kibana を構成する
次のマニフェストを確認します。
このマニフェストでは、フリート サーバーとエージェントのエージェント ポリシーを構成する Kibana カスタム リソースを記述しています。
このマニフェストをクラスタに適用します。
kubectl apply -f kibana.yamlPod の準備が整うまで待ちます。
watch kubectl --namespace elastic-system get kibanas.kibana.k8s.elastic.co出力は次のようになります。
NAME HEALTH NODES VERSION AGE kibana green 1 8.8.0 6m47sPod の
HEALTHがgreenになったら、Ctrl+Cを押してコマンドラインに戻ります。
Kibana にアクセスするようにロードバランサを構成する
Kibana にアクセスするには、Kubernetes Ingress オブジェクト、Google マネージド証明書、グローバル IP アドレス、DNS ゾーンを作成します。
グローバル外部 IP アドレスを作成します。
gcloud compute addresses create "elastic-stack" --globalCloud DNS でマネージド ゾーンとレコードセットを作成します。
gcloud dns managed-zones create "elk" \ --description="DNS Zone for Airflow" \ --dns-name="elk.BASE_DOMAIN" \ --visibility="public" gcloud dns record-sets create "elk.BASE_DOMAIN" \ --rrdatas="$(gcloud compute addresses describe "elastic-stack" --global --format="value(address)")" \ --ttl="300" \ --type="A" \ --zone="elk"ネームサーバーのリストを含む NS レコードセットを作成して、DNS ゾーンをベースドメインのサブドメインとして委任します。ネームサーバーのリストを取得するには、次のコマンドを使用します。
gcloud dns record-sets describe elk.BASE_DOMAIN \ --type="NS" \ --zone="elk" \ --format="value(DATA)"次のマニフェストを確認します。
このマニフェストでは、TLS 接続を確立するための SSL 証明書をプロビジョニングする ManagedCertificate を記述しています。
マニフェストをクラスタに適用します。
kubectl apply -f ingress.yaml
Elastic エージェントを構成する
次のマニフェストを確認します。
このマニフェストでは、ECK を使用してフリート サーバーを構成する Elastic Agent を記述しています。
このマニフェストをクラスタに適用します。
kubectl apply -f fleet-server-and-agents.yamlPod の準備が整うまで待ちます。
watch kubectl --namespace elastic-system get agents.agent.k8s.elastic.co出力は次のようになります。
NAME HEALTH AVAILABLE EXPECTED VERSION AGE elastic-agent green 5 5 8.8.0 14m fleet-server green 1 1 8.8.0 16mPod の
HEALTHがgreenになったら、Ctrl+Cを押してコマンドラインに戻ります。
ロギングとモニタリングを構成する
Elastic Stack は、kube-state-metrics エクスポーターを使用してクラスタレベルの指標を収集できます。
Kube 状態指標をインストールします。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install kube-state-metrics prometheus-community/kube-state-metrics --namespace elastic-systemデフォルトの Kibana
elasticユーザー認証情報を取得します。kubectl get secret elasticsearch-es-elastic-user -o yaml -n elastic-system -o jsonpath='{.data.elastic}' | base64 -dブラウザで
https://elk.BASE_DOMAINを開き、認証情報を使用して Kibana にログインします。メニューから [Analytics]、[Dashboards] の順に選択します。
検索テキスト フィールドに「Kubernetes overview」と入力し、[Overview dashboard] を選択して基本指標を表示します。
GKE では、Kibana がクラスタ指標の取得に使用するコントロール プレーン エンドポイントの一部に対するアクセスを制限しているため、一部のダッシュボード パネルにデータやエラー メッセージが表示されない場合があります。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトを削除する
プロジェクトを削除します。 Google Cloud
gcloud projects delete PROJECT_ID
個々のリソースの削除
既存のプロジェクトを削除しない場合は、リソースを個別に削除します。
Elastic Stack コンポーネント、ECK オペレーター、kube-state-metrics を削除します。
kubectl --namespace elastic-system delete ingresses.networking.k8s.io elastic-stack kubectl --namespace elastic-system delete managedcertificates.networking.gke.io elastic-stack kubectl --namespace elastic-system delete frontendconfigs.networking.gke.io elastic-stack kubectl --namespace elastic-system delete agents.agent.k8s.elastic.co elastic-agent kubectl --namespace elastic-system delete agents.agent.k8s.elastic.co fleet-server kubectl --namespace elastic-system delete kibanas.kibana.k8s.elastic.co kibana kubectl --namespace elastic-system delete elasticsearches.elasticsearch.k8s.elastic.co elasticsearch kubectl --namespace elastic-system delete daemonsets.apps max-map-count-setter kubectl --namespace elastic-system delete pvc --selector='elasticsearch.k8s.elastic.co/cluster-name=elasticsearch' helm --namespace elastic-system uninstall kube-state-metrics helm --namespace elastic-system uninstall elastic-operatorDNS レコードセット、IP アドレス、DNS マネージド ゾーン、GKE クラスタを削除します。
gcloud dns record-sets delete "elk.BASE_DOMAIN" \ --type="A" \ --zone="elk" \ --quiet gcloud compute addresses delete "elastic-stack" \ --global \ --quiet gcloud dns managed-zones delete "elk" --quiet gcloud container clusters delete "elk-stack" \ --location="us-central1" \ --quiet
次のステップ
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。