Elastic Cloud on Kubernetesの利用を開始する: デプロイ

まだアルファ版ですが、先日発表されたElastic Cloud on Kubernetes(ECK)のリリースニュースに、ElasticsearchとKubernetesの双方のコミュニティから大きな関心が寄せられています。ECKはElastic Stackの開発元が開発、サポートしており、KubernetesにElastic Stackをデプロイするには最良の手法です。本ブログ記事のシリーズでは2回にわたり、以下のプロセスの手順を詳しくご紹介します。

  1. ECKをKubernetesクラスター(MinikubeまたはGKE)にデプロイする
  2. Elastic StackをECKにデプロイする
  3. ElasticsearchとKibanaをECK内でスケール、およびアップグレードする
  4. サンプルのアプリをElastic APMでインストルメンテーションしてデプロイし、APMデータをECKが管理するElasticsearchクラスターに送る
  5. DaemonSetとしてMetricbeatをKubernetesにデプロイし、MetricbeatをECKが管理するElasticsearchクラスターに安全に接続する

このブログ記事の手順をすべて実行すると、下の図のようなシステムが完成するはずです。第1回目の今回は、ECKとElastic Stackのデプロイ手順を中心にご説明します。

ECKのデプロイ図

ECKの最新情報については、クイックスタートページやプロダクトページでご覧いただくこともできます。

k8sクラスターを作成する

ECKとElastic Stackをデプロイする前に、まずKubernetesクラスターの準備を整えておく必要があります。このブログでご紹介する手順は、MinikubeとGoogle Kubernetes Engine(GKE)のどちらでも実行することができます。またElasticは、OpenShiftやAmazon EKS、Microsoft AKSといった他のKubernetesディストリビューションもサポートしています。ご紹介する手順ではECK、Elasticsearch、Kibana、APMサーバー、サンプルアプリをデプロイする予定です。このため、KubernetesクラスターのRAMは16 GB、4コアがおすすめです。KubernetesクラスターのRAMを 12 GBにするオプションも提供されていますが、16 GBなら確実にスムーズなエクスペリエンスを実現することができます。

Minikube

Minikubeを使用される場合は、インストールに関する指示に従ってインストールしてください。インストールが完了したら、必要なリソースでMinikubeを構成して、立ち上げます。

minikube config set memory 16384 
minikube config set cpus 4
minikube start

Kubernetesのダッシュボードは、Kubernetesクラスターの監視と管理に非常に便利です。Minikubeのダッシュボードは、コマンド1つで有効化することができます。

minikube dashboard

自動でブラウザーウインドウが開き、Kubernetesダッシュボードが表示されます。これでKubernetesクラスターの準備はOKです。

Google Kubernetes Engine(GKE)

GKEを使用される場合は、Googleのドキュメントに従ってクラスターを設定してください。筆者のGKEクラスター構成は15 GB RAM、4 vCPU、1ノードです。より小さいクラスターを選択することも可能ですが、12 GB RAM以上の要件は必須です。また、GKEで作業するにはgcloudコマンドラインツールが必要です。

GKEクラスターが立ち上がったら、以下のコマンドを使用してクラスターに接続し、必要な権限を設定します。GKEでの作業には、クラスター管理者権限が必要です。下のコマンドのproject名zone名cluster 名user IDをご自身のものに置き換えて使用してください。

gcloud config set project elastic-sa 
gcloud config set compute/zone us-central1-a
gcloud config set container/cluster aquan
gcloud auth login
gcloud container clusters get-credentials aquan --zone us-central1-a --project elastic-sa
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=adam.quan@elastic.co
kubectl create clusterrolebinding adam.quan-cluster-admin-binding --clusterrole=cluster-admin --user=adam.quan@elastic.co

いよいよKubernetesコマンドラインツールを使ってMinikube、またはGKEを操作します。こちらの指示に沿ってkubectlをインストールします。kubectl version 1.11以降のバージョンをインストールしていることを確認してください。

本ブログ記事に使用したアセットは、こちらのGitHubレポジトリでダウンロードできます。

Elasticsearch Operatorをデプロイする

ECKは、わずか1つのコマンドでデプロイできます。信じられないかもしれませんが、本当です。次のコマンドを実行するだけで、(本稿執筆時点で)最新のECK 0.9.0をデプロイできます。シンプルで、簡単です。

kubectl apply -f https://download.elastic.co/downloads/eck/0.9.0/all-in-one.yaml

デプロイが完了したら、次のコマンドを使ってOperatorのログを監視し、すべて順調かどうか確認することができます。ECKはわずかな時間で起動します。

kubectl -n elastic-system logs -f statefulset.apps/elastic-operator

Elastic Stackをデプロイする

ECKが起動し、Elastic Stackをデプロイする準備が整いました。Elastic Stackのデプロイも、コマンド1つで実行できます。apm_es_kibana.yamlを見ると、elasticsearchRefを使ってKibanaとAPMサーバーを相互に通信できるように設定する手順も非常に簡単だということがわかるはずです。

デプロイをカスタマイズ方法はたくさんあります。以下はその一例です。

  • Podテンプレート
  • ノード構成
  • 仮想メモリ
  • HTTP証明書のカスタマイズ
  • 設定を安全に保つ

次のコマンドで、Elastic Stackをデプロイします。

kubectl apply -f apm_es_kibana.yaml

kubectl、またはKubernetesダッシュボードでElasticsearch、Kibana、APMサーバーのステータスを確認します。すべてグリーンで、準備完了の状態となるようにします。

kubectl get elasticsearch,kibana,apmserver

コンポーネントが3つともグリーンになったら、Elasticsearchクラスターが立ち上がったサインです。データを投入することができます。さて、ECKはさまざまなタスクを実行してくれます。次の手順を説明する前に、ECKがここまでにクラスターのために実行したタスクを確認しておきましょう。

  • ECKではセキュリティが有効化されています。ECKがデプロイするすべてのElastic Stackリソースは、デフォルトで安全に保たれています。Basic認証でログイン可能なelasticユーザが組み込まれ、Elasticsearchクラスターに出入りするネットワークトラフィックはTLSで安全に保たれます。
  • 証明書:デフォルトで、各クラスターには自己署名CA証明書が使用されます。カスタムのHTTPS証明書を設定することができます。
  • デフォルトのサービスエクスポージャー:使用するクラスターとKibanaには、自動でClusterIP Serviceが生成されます。必要な場合はこれを、明示的にLoadBalancerタイプに設定することができます。

Elasticsearch、Kibana、APMサーバーの稼働状況を、Kibanaで確認することが可能です。

Kibanaへのアクセス

デフォルトで、KibanaはクラスターIPを持つサービスとしてエクスポーズされます。このクラスターIPはクラスター内からアクセスすることができますが、インターネットにはエクスポーズされていません。以下のポート転送コマンドを使ってこの設定を変更し、ノートPCなどからKibanaにアクセスできるようにすることが可能です。

kubectl port-forward service/kibana-sample-kb-http 5601

Kibanaにログインする前に、デフォルトのElasticユーザーの資格情報を入手しておく必要があります。kubectlでシークレットを取得し、そのシークレットを調べてシークレットのJSONパスを見つけることができます。筆者のケースで、正しいシークレットとパスは次のようになります。

echo `kubectl get secret elasticsearch-sample-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode`

Elasticユーザーのパスワードが表示されました。これをノートパッドにコピーして保存しましょう。

次にブラウザーを開き、https://localhost:5601に接続します。この手順では自己署名証明書を使用しているため、ブラウザーに表示されるセキュリティ警告を承諾する必要があります。先ほど取得したElasticユーザー情報とパスワードを使ってKibanaにログインすると、Kibanaのホームページが表示されます。これでクラスターの準備は万端です!

スケールとアップグレード

ECKでElasticsearchクラスターをスケール、またはアップグレードするには、kubectlでデプロイの設定を変更、適用するだけです。とてもシンプルです。

スケール

デプロイのマニフェスト、apm_es_kibana.yamlの以下のセクションを修正し、Elasticsearchコンテナーのメモリサイズを2 GBから3 GBに変更してみましょう。

        containers:
- name: elasticsearch
resources:
limits:
memory: 3Gi

ファイルを保存し、次のコマンドを使ってノードをスケールさせます。

kubectl apply -f apm_es_kibana.yaml

すぐにKubernetesコンソールが切り替わり、作成されたElasticsearch podが表示されます。ECKでは、ダウンタイムなしにElasticsearchノードをスケールできます。ごくわずかな時間で新しいpodが稼働しはじめ、元のpodは消滅します。古いpodのデータはシームレスに引き継がれます。

また、ノードをさらに追加するなど、別の方法でクラスターをスケールさせることもできます。どのような方法の場合も、kubectlにコマンドを適用するだけのシンプルな手順であることは変わりません。

スケール中のElasticsearch pod

アップグレード

次は、クラスターを7.2.0にアップグレードしてみましょう。デプロイのマニフェストファイル、apm_es_kibana.yaml内でElasticsearch、Kibana、APMサーバーのバージョンを変更するだけのシンプルな手順です。次のコマンドでアップグレードを保存、および適用します。

kubectl apply -f apm_es_kibana.yaml

先ほどと同様にダウンタイムはなく、KubernetesコンソールでECKがシームレスにElasticsearch、Kibana、APMサーバーをアップグレードする様子を確認できます。

アップグレードプロセスが完了したら、Elastic Stackがバージョン7.2.0で実行されていることを確認します。ここまでの手順で、ECKのパワフルさを実感していただけたのではないでしょうか?

まとめ

本記事で、すばやく立ち上げできるElastic Cloud on Kubernetesのエクスペリエンスや、簡単さをお楽しみいただくことができたら幸いです。このブログシリーズの第2回では、APMでインストルメンテーションしたシンプルなアプリをデプロイし、ECKが管理するクラスターにAPMデータを送るよう設定する手順をご紹介します。また、KubernetesにMetricbeatをデプロイして、クラスターにメトリックデータを送る方法もご紹介します。