どこにでもいるSEの備忘録

たぶん動くと思うからリリースしようぜ

Elastic Cloud on Kubernetes をオンプレで試す

今までElasticsearchはDocker上で使っていましたが、Kubernetes上でElasticsearchを使ってみようと思って、調べてみたらこちらを見つけました。

www.elastic.co

試しに使ってみるために、チュートリアルをやってみました。 クラウドで使用する前にオンプレでお試しをしたかったので、今回は手元のノート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の勉強をしてました。

www.nogawanogawa.work

www.nogawanogawa.work

tutorialをやってみる

チュートリアルを参考に使ってみます。

www.elastic.co

初めにカスタムリソースの定義とオペレータをインストールするようです。

下記の記事によればオペレータ次のように説明されています。

qiita.com

オペレーターは、カスタム・リソースとカスタム・リソース・コントローラーとして機能する 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にアクセスするだけです。

https://localhost:5601/

すると、いつものKibanaの画面が表示されるかと思います。

f:id:nogawanogawa:20200421163600p:plain:w500

その他、参考にさせていただいた資料など

qiita.com

www.elastic.co

github.com

感想

今回はチュートリアルをなぞっただけの記事でした。 結構Kubernetesの使い方についての記憶が怪しかったので、これを機に復習していこうと思います。