Elastic Cloud on Kubernetesでオンプレk3s上にElasticsearch 7.4.0をデプロイ

# はじめに
Elasticsearchを触ってみたかったので手元に環境を作ってみることにしました。
せっかくなので最近リリースされた最新の7.4.0＋[前回記事](https://qiita.com/ussvgr/items/b98ada65563edf77f12b)で構築したk3s環境を使用します。
(k3s特有の要素はないので、通常のKubernetes環境でも変わらず動くと思います)


# CRD作成
Elastic Cloud on KubernetesではElasticsearchやKibanaを独自のCustom Resourceとして定義しています。
[公式ドキュメント](https://www.elastic.co/guide/en/cloud-on-k8s/master/index.html)の[QuickStart](https://www.elastic.co/guide/en/cloud-on-k8s/master/k8s-quickstart.html)にある、

```
$ kubectl apply -f https://download.elastic.co/downloads/eck/1.0.0-beta1/all-in-one.yaml
```
を実行します。
~~※2019/10/12現在、公式ドキュメント記載のURLは404になっています。
 URLのバージョン部分を[GithubのRelease](https://github.com/elastic/cloud-on-k8s/releases)で公開されている表記にすればよさそうです。
 上記では「1.0.0-beta1-bc12」としています。~~
※2019/10/23更新
1.0.0-beta1の公開に伴い、上記の記述は必要なくなりました。
公式ドキュメントの記載通りで問題ありません。

# Namespace作成
管理上Namespaceを分けたいので作成します。
今回は「elastic」としました。

```namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: elastic
  labels:
    name: elastic
```

```
$ kubectl apply -f namespace.yaml
namespace/elastic created
```

# Elasticsearch デプロイ
今回はお手軽にホストのディレクトリをhostPathでデータ永続化に利用します。
複数ノード構成にするときは要検討。
また、LoadBalancerで外部からのアクセスをHTTPで受けれるようにします。

```elasticsearch.yaml
apiVersion: elasticsearch.k8s.elastic.co/v1beta1
kind: Elasticsearch
metadata:
  name: elasticsearch
  namespace: elastic
spec:
  version: 7.4.0
  nodeSets:
  - name: node
    count: 1
    config:
      node.master: true
      node.data: true
      node.ingest: true
      node.store.allow_mmap: false
    podTemplate:
      spec:
        volumes:
        - name: elasticsearch-data
          hostPath:
            path: /opt/k8s-elastic
  http:
    tls:
      selfSignedCertificate:
        disabled: true
    service:
      spec:
        ports:
          - port: 9200
            targetPort: 9200
        type: LoadBalancer
        loadBalancerIP: 192.168.24.103
```

```
$ kubectl apply -f elasticsearch.yaml
elasticsearch.elasticsearch.k8s.elastic.co/elasticsearch created
```
少し待ってからelasticsearchリソースの状態を確認し、

```
$ kubectl get elasticsearch -n elastic
NAME            HEALTH   NODES   VERSION   PHASE   AGE
elasticsearch   green    1       7.4.0     Ready   3m15s
```
上記のようにHEALTHがgreen、PHASEがReadyであればOKです。

パスワードがsecretに格納されているので以下のように取得し、

```
$ PASSWORD=$(kubectl get secret elasticsearch-es-elastic-user -o=jsonpath='{.data.elastic}' -n elastic | base64 --decode)
```
curlでアクセスしてみます。

```
$ curl -u "elastic:$PASSWORD" http://192.168.24.103:9200
{
  "name" : "elasticsearch-es-node-0",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "WGWsr4wSQV2eodUKapxyoA",
  "version" : {
    "number" : "7.4.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "22e1767283e61a198cb4db791ea66e3f11ab9910",
    "build_date" : "2019-09-27T08:36:48.569419Z",
    "build_snapshot" : false,
    "lucene_version" : "8.2.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
```
# Kibana のデプロイ
KibanaもLoadBalancerで外部からのアクセスをHTTPで受けれるようにします。

```kibana.yaml
apiVersion: kibana.k8s.elastic.co/v1beta1
kind: Kibana
metadata:
  name: kibana
  namespace: elastic
spec:
  version: 7.4.0
  count: 1
  elasticsearchRef:
    name: elasticsearch
  http:
    tls:
      selfSignedCertificate:
        disabled: true
    service:
      spec:
        ports:
          - port: 80
            targetPort: 5601
        type: LoadBalancer
        loadBalancerIP: 192.168.24.104
```
```
$ kubectl apply -f kibana.yaml 
kibana.kibana.k8s.elastic.co/kibana created
```
デプロイ終わったらブラウザで[http://192.168.24.104](http://192.168.24.104)にアクセスすると、

![スクリーンショット 2019-10-12 12.45.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/bd0cba42-332f-4e84-0875-7677e1cd2d85.png)
ログイン画面が表示されます。
Username,PasswordはElasticsearchと同じ物を入力すればOKです。