KubernetesでElasticsearchを起動する方法
概要
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_lock
にfalse
を設定していますが、私の環境ではこうしないとうまく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を運用して手に入れた情報はなるべく発信をしていきたいと思います。