2021/05/25

GKEにシングルノード構成のElasticsarchをデプロイする

gkek8selasticsearch

小規模なアプリで全文検索が必要だったので、Elasticsearchを導入しました。

GKE上にアプリをデプロイしている関係で、同一クラスターにElasticsearchを構築しました。
小規模なので、シングル構成でサクッと動かすようなイメージです。

注意事項

本記事では、GKE上にシングルノード構成のElasticSearchを手軽に構築する手順を説明します。

k8sのデプロイ内容詳細

以下の通り設定ファイルを作って、順番にdeployしました。

事前準備

  • データの永続化のためのCompute Diskを作成しました。

以下のようなコマンドで作成しました。(daily-snapshotという一日に一回スナップショットをとるポリシー付きです)

gcloud beta compute disks create "elasticsearch" \
  --project="your-google-project-id" \
  --zone="your-google-project-zone" \
  --type=pd-ssd \
  --size=5GB \
  --resource-policies=projects/your-google-project-id/regions/your-google-project-region/resourcePolicies/daily-snapshot

k8sへのデプロイ設定ファイル及び順序

namespace

apiVersion: v1
kind: Namespace
metadata:
  name: elasticsearch

pv & pvc

apiVersion: v1
kind: PersistentVolume
metadata:
  name: elasticsearch
spec:
  storageClassName: elasticsearch
  capacity:
    storage: 5Gi   # <- 事前準備で作成したDisk Size
  accessModes:
    - ReadWriteOnce
  gcePersistentDisk:
    pdName: elasticsearch   # <- 事前準備で作成したDisk Name
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: elasticsearch
  namespace: elasticsearch
spec:
  storageClassName: elasticsearch
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

statefulset

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
  namespace: elasticsearch
spec:
  serviceName: elasticsearch
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      name: elasticsearch
      labels:
        app: elasticsearch
    spec:
      securityContext:
        fsGroup: 1000
      initContainers:
        - name: init-elasticsearch-data
          image: docker.elastic.co/elasticsearch/elasticsearch:7.11.0
          command: ['chown', '-R', '1000:1000', '/usr/share/elasticsearch/data']
          volumeMounts:
            - mountPath: /usr/share/elasticsearch/data
              name: elasticsearch
      containers:
        - name: elasticsearch
          # pluginが別途必要であれば、別途Dockerfileを使ってプラグインインストール済のimageをビルドして使います。
          image: docker.elastic.co/elasticsearch/elasticsearch:7.11.0
          env:
            - name: discovery.type
              value: "single-node"
            - name: discovery.seed_hosts
              value: "elasticsearch"  # look up to service
            - name: cluster.initial_master_nodes
              value: null
# 必要に応じて設定
#           - name: ES_JAVA_OPTS
#             value: "-Xms768m -Xmx768m"
# 必要に応じて設定
#        resources:
#          requests:
#            memory: "1Gi"
#            cpu: "500m"
#          limits:
#            memory: "4Gi"
#            cpu: "940m"
          ports:
            - name: elasticsearch
              containerPort: 9200
            - name: node
              containerPort: 9300
          volumeMounts:
            - mountPath: /usr/share/elasticsearch/data
              name: elasticsearch
      volumes:
        - name: elasticsearch
          persistentVolumeClaim:
            claimName: elasticsearch

service

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  namespace: elasticsearch
spec:
  ports:
    - name: elasticsearch
      port: 9200
      targetPort: elasticsearch
  selector:
    app: elasticsearch

以上です。