概要

KubernetesでElasticsearchのイメージを動かして見たので、その方法を紹介します。

Elasticsearchは、ひとつだけ起動するシングルノード構成です。

Elasticsearchの説明はしないので、分からない人は調べてください。

一言だけ言うのであれば、全文検索のためのツールです。

環境

  • Kubernetes 1.8
  • Elasticsearch 6.2

ストレージ

Elasticsearchのデータをいれておくためのストレージを用意します。

今回は、PersistentVolumesとPersistentVolumeClaimsを使いNFSストレージをマウントして使います。

PersisteVolumesを作成するymlファイルは次のようなものです。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: elasticsearch-pv
  labels:
    name: elasticsearch-pv
spec:
  capacity:
    storage: "30Gi"
  accessModes:
    - ReadWriteOnce
  nfs:
    server: *****
    path: ******

NFSの設定などは適当に置き換えてください。

PersistentVolumeClaimsを作成するymlファイルは次ようなものです。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: elasticsearch-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: "30Gi"
  selector:
    matchLabels:
      name: elasticsearch-pv

PersistentVolumesも含めてですが、accessModesは、ReadWriteOnceにしましょう。

これは、複数の場所から書き込むことによるデータの破損を防ぐことができます。

サーバの設定

Kubernetesのノードサーバの方で、Elasticsearchの起動のために設定をする必要があります。

まず、ノードサーバの方で/etc/sysctl.confに次の内容を追加します。

vm.max_map_count=262144

さらに、/etc/security/limits.conf に次の内容を追加します。

elasticsearch - memlock unlimited
root - memlock unlimited

設定を反映するために、ノードサーバを再起動しましょう。

Elasticsearchの起動

ElasticsearchのPodを作成するymlファイルは次です。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: elasticsearch
  labels:
    app: elasticsearch
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
    type: RollingUpdate
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
        - image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.2
          name: postgres
          env:
            - name: cluster.name
              value: docker-cluster
            - name: bootstrap.memory_lock
              value: "false"
            - name: cluster.routing.allocation.disk.threshold_enabled
              value: "false"
            - name: ES_JAVA_OPTS
              value: -Xms512m -Xmx512m
          resources:
            limits:
              memory: 1536Mi
          volumeMounts:
            - name: elasticsearch-persistent-storage
              mountPath: /usr/share/elasticsearch/data
      volumes:
        - name: elasticsearch-persistent-storage
          persistentVolumeClaim:
            claimName: elasticsearch-pvc

Elasticsearchのイメージは、Elastic社の方で用意しているレジストリサーバから取得しています。イメージとして、OSS版のElasticsearchを使用しています。もしOSS版を使いたくない場合はイメージのURLをdocker.elastic.co/elasticsearch/elasticsearch:6.2.2としましょう。

環境変数として、いくつかの値を設定しています。

これは、Elasticsearchの設定ファイルの内容と対応しているので、詳細はそれぞれの設定項目について調べてください。ちなみに、bootstrap.memory_lockfalseを設定していますが、私の環境ではこうしないとうまくElasticsearchを起動できませんでした。

resourcesで、メモリの使用を制限していますが、ElasticsearchはJavaのソフトウェアのためか、メモリをたくさん使います。なので、なるべくたくさんメモリを確保できるようにしましょう。もしここを変更する場合は、合わせてES_JAVA_OPTSも一緒に変更してJavaの使用できるメモリも変更しましょう。

アクセス

Elasticsearchに外部からアクセスできるようにするには、KubernetesのServiceを作る必要があります。

Serviceの作成には次のymlファイルを使います。

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  labels:
    app: elasticsearch
spec:
  type: ClusterIP
  ports:
    - name: db
      port: 9200
      targetPort: 9200
      protocol: TCP
    - name: transport
      port: 9300
      targetPort: 9300
      protocol: TCP
  selector:
    app: elasticsearch

あくまでも例なので、目標としている構成に合わせて内容を書き換えてください。

さいごに

Elasticsearchは、かなりのリソースを使います。

そのため起動まではそれほど難しくないですが、今後運用していくとなればパフォーマンスの面など色々考えなくてはならなくなると思います。

私自身も今回ログを集約する目的で初めてElasticsearchを使い始めたので、Elasticsearchを使うノウハウがなく、今後障害が発生することもあると思います。

今後のためにも、Elasticsearchを運用して手に入れた情報はなるべく発信をしていきたいと思います。