今までElasticsearchはDocker上で使っていましたが、Kubernetes上でElasticsearchを使ってみようと思って、調べてみたらこちらを見つけました。
試しに使ってみるために、チュートリアルをやってみました。 クラウドで使用する前にオンプレでお試しをしたかったので、今回は手元のノートPCでやりました。 今回はそのメモです。
Elastic Cloud on Kubernetes
Kubernetes Operatorに基づいて開発されたElastic Cloud on Kubernetes(ECK)。Kubernetesの基本的なオーケストレーション機能を拡張することにより、KubernetesでのElasticsearchやKibanaの設定/管理をサポートします。
オープンソースのプラットフォームであるKubernetesは、コンテナー化されたアーキテクチャーを扱うことができます。Elasticはクラウドネイティブなテクノロジーへの取り組みの一環として、Kubernetesなどプラットフォーム向けのプロダクトを提供しています。 Elastic Cloud on Kubernetes | Elasticsearch on Kubernetesでデプロイ&管理
ElasticsearchをKubernetes上で動かせるようです。
使ってみる
なにはともあれやってみたいと思います。
Kubernetesのおさらい
過去にKubernetesの勉強をしてました。
tutorialをやってみる
チュートリアルを参考に使ってみます。
初めにカスタムリソースの定義とオペレータをインストールするようです。
下記の記事によればオペレータ次のように説明されています。
オペレーターは、カスタム・リソースとカスタム・リソース・コントローラーとして機能する K8s apiserver のクライアントである。
また、カスタムリソースは次の様に説明されています。
一方、カスタム・リソースは、K8s API の拡張であり、一般的な必須の機能ではなく、特定目的のためのカスタマイズと表現できる。
Elastic Cloud on KubernetesではElasticsearchやKibanaを独自のカスタムリソースとして定義しています。 そのため、その定義を取り込んでいるようです。
$ kubectl apply -f https://download.elastic.co/downloads/eck/1.0.1/all-in-one.yaml
Elasticsearch
Elasticsearch本体のデプロイメントはこちらのように記述されています。
$ cat <<EOF | kubectl apply -f - apiVersion: elasticsearch.k8s.elastic.co/v1 kind: Elasticsearch metadata: name: quickstart spec: version: 7.6.2 nodeSets: - name: default count: 1 config: node.master: true node.data: true node.ingest: true node.store.allow_mmap: false EOF
注意としては、Kubernetesクラスタに少なくとも2GiBの空きメモリを持つノードがないと、ポッドはPending状態になるようです。
状態を確認する際には下記のように確認できます。
$ kubectl get elasticsearch NAME HEALTH NODES VERSION PHASE AGE quickstart green 1 7.6.2 Ready 13h
$kubectl get service quickstart-es-http NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE quickstart-es-http ClusterIP 10.99.107.170 <none> 9200/TCP 13h
実際にElasticsearchにアクセスする際には、user/passwordを取得する必要があります。
デフォルトでは
- user : elastic
- password : kubernetesのsecretに保存される
ようになっているようです。passwordだけ環境変数に保存しておきます。
PASSWORD=$(kubectl get secret elasticsearch-es-elastic-user -o=jsonpath='{.data.elastic}' -n elastic | base64 --decode)
kubernetesクラスタの内部からアクセスする際には、
$ curl -u "elastic:$PASSWORD" -k "https://quickstart-es-http:9200"
ローカル環境から接続する際には、一旦ポートフォワーディングを設定してから実行します。
$ kubectl port-forward service/quickstart-es-http 9200
その上で、localhostに対してアクセスします。
$ curl -u "elastic:$PASSWORD" -k "https://localhost:9200" { "name" : "quickstart-es-default-0", "cluster_name" : "quickstart", "cluster_uuid" : "m4sAc4d5TI2qm44HNOKblA", "version" : { "number" : "7.6.2", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f", "build_date" : "2020-03-26T06:34:37.794943Z", "build_snapshot" : false, "lucene_version" : "8.4.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
Kibana
今度はkibanaもkubernetes上にデプロイします。
$ cat <<EOF | kubectl apply -f - apiVersion: kibana.k8s.elastic.co/v1 kind: Kibana metadata: name: quickstart spec: version: 7.6.2 count: 1 elasticsearchRef: name: quickstart EOF
kubernetesクラスタ外からアクセスするためにポートフォワーディングします。
$ kubectl port-forward service/quickstart-kb-http 5601
kibanaのユーザー名はデフォルトでelastic、kibanaログイン時のパスワードは下記のように取得することができます。
$ kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode; echo
あとはkibanaにアクセスするだけです。
すると、いつものKibanaの画面が表示されるかと思います。
その他、参考にさせていただいた資料など
感想
今回はチュートリアルをなぞっただけの記事でした。 結構Kubernetesの使い方についての記憶が怪しかったので、これを機に復習していこうと思います。