由于Elastic Cloud on Kubernetes(ECK)即将成为GA(一般可用)版,所以我尝试了各种操作

由于Elastic Cloud on Kubernetes(ECK)即将(或已经)进入GA阶段,因此我尝试了许多东西。

这篇文章是2019年Elasticsearch圣诞日历的第24天的文章。
虽然第23天是空着的,但第22天是由@hssh2_bin先生撰写的“使用Logstash和Filebeat处理IIS日志”进行了一些尝试的故事。

这个文章是关于什么的?(免责声明)

2019年12月23日時点では、Elastic Cloud on K8s(ECK)のバージョン1.0が正式にリリースされたアナウンスはまだありません(泣)。最初のリリースは2019年5月21日に行われ、0.8、0.9と順調に開発が進んでいきました。そして、2019年10月14日に1.0-betaがリリースされましたので、最悪でも2か月後、年内には1.0が正式リリースされるだろうと期待して、意気込んでアドベントカレンダーにエントリーしたのですが、、。このままではアドベントカレンダーも取り下げないといけないのかと思いましたが、昨日Githubをチェックしたところ、

image.png

真令人惊讶的是,四天前(12/18),只有VERSION文件悄悄地从1.0-beta更新到了1.0(欢喜)。
然而,README仍然保持在1.0-beta的状态,也没有进行任何宣布,所以我认为可能正在进行各种调整,这只是时间问题。
基于这样的情况,我准备在心情上将它视为GA(一般可用)状态,并继续写下去,请您继续关注。
(注意)本篇文章是基于ECK 1.0-beta的内容。请注意,在1.0 GA(一般可用)时可能会有部分内容有所不同。

首先

近年来,Elasticsearch的用途变得非常广泛,不仅可以进行全文搜索,还可以对基础设施日志和访问日志等进行分析。因此,搭建Elasticsearch环境的方式也多种多样。除了在操作系统上进行软件包安装外,还可以通过Docker容器启动,或者使用ElasticCloud作为SaaS来实现运维负载的卸载,非常方便。

今年开始,Elastic Cloud on K8s(简称ECK)作为一种新的选择,在kubernetes环境中通过Operator来管理Elasticsearch和Kibana。Operator是一种将基础设施运维在kubernetes上抽象为资源并实现自动化的机制。通过这种机制,我们可以轻松地在kubernetes环境中安装Elasticsearch和Kibana,并且可以自动化所有运维工作,如节点扩展和备份。

如果你想体验一下Elasticsearch/Kibana的环境,而不想从头开始安装,只需要使用ECK,你就可以立即进行设置。此外,你还可以根据每个用户或者租户的需求,即兴地创建或者删除Elasticsearch环境。以往,在诸如共享基础设施的组织中,跨部门管理Elasticsearch集群是常见的做法,但借助ECK,将会逐渐成为各服务开发团队独立建立自己的集群的主流方式。

虽然前面的介绍有点冗长,但在这里我们将介绍一下ECK的简单用法。

前提 tí) – the premise or prerequisite

假设您有一个k8s环境。在公共云中,有一些托管的k8s服务可供使用,您可以考虑使用它们来轻松进行测试。本次我们使用Azure提供的AKS(Azure Kubernetes Service)进行操作确认。

由于很多人可能觉得在本地准备一个k8s环境很困难,或者希望以更简单的方式进行尝试,所以在本文的最后,我们也介绍了一种可以在浏览器上试用ECK的方法,如果您感兴趣,请看一下。

各种资源(仓库、文档)

ECK在GitHub上有代码公开。
https://github.com/elastic/cloud-on-k8s

文档也像elasticsearch一样托管在网站上。(顺便提一下,1.0版本的文档已经发布了。)
https://www.elastic.co/guide/en/cloud-on-k8s/1.0-beta/k8s-overview.html

顺便提一下,关于使用AKS的终端环境,Azure提供了一个非常方便的Cloud Shell,您可以直接从Azure门户进行使用。在初始状态下,已经安装了kubectl命令和az命令。请参考以下文档以了解如何使用:
https://docs.microsoft.com/ja-jp/azure/aks/kubernetes-walkthrough

利用周遭的条件或者利用环境资源

productversionAKS1.15.5kubectl1.16.0ECK1.0-betaElasticsearch7.5.1Kibana7.5.1

引导程序

手順的概述如下:
1. AKS的设置。
2. 在k8s环境中安装ECK Operator。
3. 通过Operator部署Elasticsearch资源。
4. 通过Operator部署Elasticsearch集群和Kibana。
5. 进行访问确认。

1. AKS的建立设置

以下是设置AKS集群的示例步骤,请参考一下。根据需要,可以更改资源组名称、集群名称和子网CIDR等。另外,注意选择的地域是东日本,但由于AKS在不同地域可能有不同版本的k8s可用,请注意。(可以使用az aks get-versions –location japaneast等命令来确认)

## ログイン
$ az login

## リソースグループの作成
$ az group create --name akstest01rg --location japaneast

## 仮想ネットワークとサブネットの作成
$ az network vnet create \
--name aksVNet \
--resource-group akstest01rg \
--address-prefixes 10.0.0.0/8 \
--subnet-name aksSubNet \
--subnet-prefixes 10.1.0.0/16 \
--location japaneast

## AKS を所属させるサブネットリソースID の取得
$ VNET_SUBNET_ID=$(az network vnet subnet list \
--resource-group akstest01rg \
--vnet-name aksVNet \
--query [].id --output tsv)

## AKSクラスタの作成
$ az aks create --resource-group akstest01rg \
--name aks01 \
--network-plugin azure \
--vnet-subnet-id ${VNET_SUBNET_ID} \
--docker-bridge-address 172.17.0.1/16 \
--dns-service-ip 10.0.0.10 \
--service-cidr 10.0.0.0/16 \
--node-count 3 \
--kubernetes-version 1.15.5 \
--generate-ssh-keys

## クレデンシャル情報の登録
$ az aks get-credentials --resource-group akstest01rg --name aks01
Merged "aks01" as current context in /home/USER/.kube/config

## ノード確認
$ kubectl get node
NAME                       STATUS   ROLES   AGE     VERSION
aks-nodepool1-18086731-0   Ready    agent   3d17h   v1.15.5
aks-nodepool1-18086731-1   Ready    agent   3d17h   v1.15.5
aks-nodepool1-18086731-2   Ready    agent   3d17h   v1.15.5

在k8s环境中安装ECK Operator。

用以下步骤在k8s环境中安装ECK Operator。基本上只需使用kubectl apply命令一次即可完成安装。非常方便。

$ kubectl apply -f https://download.elastic.co/downloads/eck/1.0.0-beta1/all-in-one.yaml
customresourcedefinition.apiextensions.k8s.io/apmservers.apm.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticsearches.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/kibanas.kibana.k8s.elastic.co created
clusterrole.rbac.authorization.k8s.io/elastic-operator created
clusterrolebinding.rbac.authorization.k8s.io/elastic-operator created
namespace/elastic-system created
statefulset.apps/elastic-operator created
serviceaccount/elastic-operator created
$

在创建CRD(自定义资源定义)之后,会创建一个命名空间和服务账户及RBAC定义,然后继续启动为Operator准备的Pod(有状态应用集)。

请确保通过以下命令Operator已启动。

$ kubectl get all -n elastic-system
NAME                     READY   STATUS    RESTARTS   AGE
pod/elastic-operator-0   1/1     Running   0          2m25s

NAME                                READY   AGE
statefulset.apps/elastic-operator   1/1     2m26s

在这个时间点上,我们将通过下图展示环境的当前状态。这张图是在上个月巴塞罗那k8s meetup上由Elastic公司提供的资料。

image.png

目前已安装了Operator,此时图中的①已经完成。自定义资源定义(CRD)和控制这些Pod正在运行。之后,用户通过yaml文件单独发送资源请求(②),控制器将开始工作(③),并会自动部署所需的资源(例如Elasticsearch集群或Kibana)(④)。接下来,我们将看到②③④的操作步骤。

通过运营商在Elasticsearch资源上进行部署

只要操作者正在运行,就可以随时部署Elasticsearch和Kibana的资源。现在,我们来试着部署一个环境。
为了部署资源,我们需要创建一个定义资源的yaml文件(自定义资源定义)。以下是一个例子。

apiVersion: elasticsearch.k8s.elastic.co/v1beta1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 7.5.1
  nodeSets:
  - name: default
    count: 1
    config:
      node.master: true
      node.data: true
      node.ingest: true
      node.store.allow_mmap: false

在这里,我们试图使用一台Master、Data和Ingest节点来构建。版本是7.5.1对吧。
请注意写着”kind: Elasticsearch”的地方。在普通的k8s中,没有这种资源类型,但是当安装Operator时,我们添加了这些自定义资源作为CRD(Custom Resource Definition),因此用户可以请求并使用这些抽象化的资源,如”kind: Elasticsearch”。
以前,用户需要按照Elasticsearch的安装步骤进行设置,但在k8s环境+ECK中,所有这些都可以通过yaml文件进行设置。

那么,我们将使用这个资源定义文件来进行实际的部署。

$ kubectl apply -f quickstart.yaml
elasticsearch.elasticsearch.k8s.elastic.co/quickstart created
$

我们将检查实际上创建了哪些资源。

$ kubectl get all
NAME                          READY   STATUS    RESTARTS   AGE
pod/quickstart-es-default-0   1/1     Running   0          11m

NAME                            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/kubernetes              ClusterIP   10.0.0.1       <none>        443/TCP    3d19h
service/quickstart-es-default   ClusterIP   None           <none>        <none>     11m
service/quickstart-es-http      ClusterIP   10.0.110.167   <none>        9200/TCP   11m

NAME                                     READY   AGE
statefulset.apps/quickstart-es-default   1/1     11m

已经定义了用于Elasticsearch节点的有状态集(StatefulSet),并根据此定义启动了一个Pod。此外,还创建了用于访问9200端口的service资源。

顺便提一下,由于没有考虑,该资源被部署到了默认命名空间中,与 service/kubernetes 等资源共存。在接下来的示例中,我想创建一个新的命名空间,并在其上部署。

通过以下命令可以确认以”kind: Elasticsearch”方式创建的资源。可以看到一个单节点集群正在以green状态运行。

$ kubectl get elasticsearch
NAME         HEALTH   NODES   VERSION   PHASE   AGE
quickstart   green    1       7.5.1     Ready   8m59s
$

如果想删除资源,可以使用kubectl delete命令。只需指定资源名称为”kind名/实例名”,然后执行即可。

$ kubectl delete elasticsearch/quickstart
elasticsearch.elasticsearch.k8s.elastic.co "quickstart" deleted
$

通过Operator将Elasticsearch集群和Kibana资源部署。

为了尝试更实践的内容,下面考虑以下要求。

    • Elasticsearchリソースを展開するための専用ネームスペースを作る

 

    • ElasticsearchクラスタをMaster/Data分離構成で作る

 

    • 可用性を考えてMasterを3ノード構成、Dataを2ノード構成にする

 

    • 上記Elasticsearchに接続するKibanaをデプロイする

 

    AKS外部からアクセスできるよう外部ロードバランサからのアクセス経路を設定する

我們將按照順序進行工作。

    Elasticsearchリソースを展開するための専用ネームスペースを作る
$ kubectl create namespace myeckns
namespace/myeckns created
$
    • ElasticsearchクラスタをMaster/Data分離構成で作る

 

    • 可用性を考えてMasterを3ノード構成にする

 

    AKS外部からアクセスできるよう外部ロードバランサからのアクセス経路を設定する

这可以在yaml文件中以下方式定义所有内容。

apiVersion: elasticsearch.k8s.elastic.co/v1beta1
kind: Elasticsearch
metadata:
  name: myeck
  namespace: myeckns
spec:
  version: 7.5.1
  nodeSets:
  - name: master
    count: 3
    config:
      node.master: true
      node.data: false
      node.ingest: false
      node.store.allow_mmap: false
  - name: data
    count: 2
    config:
      node.master: false
      node.data: true
      node.ingest: true
      node.store.allow_mmap: false
  http:
    service:
      metadata: {}
      spec:
        type: LoadBalancer

这是一个稍微详细的解释,可以通过”spec.nodeSets”来定义按角色划分的节点组,进一步可以通过”spec.nodeSets.config”来使用true/false指定每个角色的节点。在这里,我们将master角色设置为包含3个true的节点,将data/ingest角色设置为每个含有2个true的节点。
在底部,我们进行了与此集群相关的服务资源的自定义定义,通过在AKS中指定”type: LoadBalancer”,可以将外部的Azure LoadBalancer与之关联。

另外,提及的“version:7.5.1”是可以指定Elasticsearch版本的属性,但截至2019年12月22日,无法获取7.6.0的Docker镜像(尚未发布),因此我们使用了7.5.1版本。

$ sudo docker image pull docker.elastic.co/elasticsearch/elasticsearch:7.6.0
Error response from daemon: manifest for docker.elastic.co/elasticsearch/elasticsearch:7.6.0 not found
$

让我们尝试使用以下命令创建这个资源。

$ kubectl apply -f myes.yaml
elasticsearch.elasticsearch.k8s.elastic.co/myeck created
$

请注意,在进行资源确认时,需要使用“-n”选项并明确指定命名空间。

$ kubectl get all -n myeckns
NAME                    READY   STATUS    RESTARTS   AGE
pod/myeck-es-data-0     1/1     Running   0          7m37s
pod/myeck-es-data-1     1/1     Running   0          7m36s
pod/myeck-es-master-0   1/1     Running   0          7m37s
pod/myeck-es-master-1   1/1     Running   0          7m37s
pod/myeck-es-master-2   1/1     Running   0          7m37s

NAME                      TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)          AGE
service/myeck-es-data     ClusterIP      None           <none>         <none>           7m37s
service/myeck-es-http     LoadBalancer   10.0.125.221   138.91.14.xx   9200:31475/TCP   7m38s
service/myeck-es-master   ClusterIP      None           <none>         <none>           7m37s

NAME                               READY   AGE
statefulset.apps/myeck-es-data     2/2     7m37s
statefulset.apps/myeck-es-master   3/3     7m37s
$

由于外部负载均衡器的支持,让我们试着访问Elasticsearch集群的9200端口。

由于 ECK 在默认情况下启用了安全性,因此需要获取 elastic 用户的密码。密码已通过 k8s 的 secret 资源进行了 base64 编码,可以使用以下命令来获取。

$ kubectl get secret -n myeckns
NAME                              TYPE                                  DATA   AGE
default-token-2qx47               kubernetes.io/service-account-token   3      27m
myeck-es-data-es-config           Opaque                                1      10m
myeck-es-elastic-user             Opaque                                1      10m  ★ここに格納されている★
myeck-es-http-ca-internal         Opaque                                2      10m
myeck-es-http-certs-internal      Opaque                                3      10m
myeck-es-http-certs-public        Opaque                                2      10m
myeck-es-internal-users           Opaque                                3      10m
myeck-es-master-es-config         Opaque                                1      10m
myeck-es-transport-ca-internal    Opaque                                2      10m
myeck-es-transport-certificates   Opaque                                13     10m
myeck-es-transport-certs-public   Opaque                                1      10m
myeck-es-xpack-file-realm         Opaque                                3      10m
$
$ PASSWORD=$(kubectl get secret myeck-es-elastic-user -n myeckns -o=jsonpath='{.data.elastic}' | base64 --decode)
$ echo $PASSWORD
44gkrmqh75lnzx8p7ppsgcbg
$

由于elastic用户的密码被存储在PASSWORD变量中,因此可以使用下面的命令进行curl访问。

$ curl -u "elastic:$PASSWORD" -k https://138.91.14.xx:9200
{
  "name" : "myeck-es-data-1",
  "cluster_name" : "myeck",
  "cluster_uuid" : "o9GKgJVDTTOOIJO8v_bbGQ",
  "version" : {
    "number" : "7.5.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96",
    "build_date" : "2019-12-16T22:57:37.835892Z",
    "build_snapshot" : false,
    "lucene_version" : "8.3.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
$ curl -u "elastic:$PASSWORD" -k https://138.91.14.xx:9200/_cat/nodes
10.1.0.88  6 91 5 0.14 1.03 0.83 lm  - myeck-es-master-2
10.1.0.96  9 91 5 0.14 1.03 0.83 dil - myeck-es-data-0
10.1.0.30 11 97 6 0.16 0.25 0.31 lm  * myeck-es-master-1
10.1.0.41  7 96 9 0.24 0.47 0.54 dil - myeck-es-data-1
10.1.0.37 11 96 9 0.24 0.47 0.54 lm  - myeck-es-master-0
$
    上記Elasticsearchに接続するKibanaをデプロイする

我也会尝试部署Kibana。我们将按照相同的方式定义yaml文件,这次的自定义资源是”kind: Kibana”。重要的一点是”spec.elasticsearchRef.name”必须为”myeck”,这与上述Elasticsearch资源的name必须匹配,这样才能将Kibana连接到正确的Elasticsearch。

apiVersion: kibana.k8s.elastic.co/v1beta1
kind: Kibana
metadata:
  name: myeck
  namespace: myeckns
spec:
  version: 7.5.1
  count: 1
  elasticsearchRef:
    name: myeck
  http:
    service:
      metadata: {}
      spec:
        type: LoadBalancer

稍等一下,我将确认一下资源。已经成功部署了相当多的资源,包括与Elasticsearch集群相匹配的资源。

$ kubectl get all -n myeckns
NAME                            READY   STATUS    RESTARTS   AGE
pod/myeck-es-data-0             1/1     Running   0          24m
pod/myeck-es-data-1             1/1     Running   0          24m
pod/myeck-es-master-0           1/1     Running   0          24m
pod/myeck-es-master-1           1/1     Running   0          24m
pod/myeck-es-master-2           1/1     Running   0          24m
pod/myeck-kb-5c846f465c-9jbk9   1/1     Running   0          6m49s

NAME                      TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)          AGE
service/myeck-es-data     ClusterIP      None           <none>         <none>           24m
service/myeck-es-http     LoadBalancer   10.0.125.221   138.91.14.xx   9200:31475/TCP   24m
service/myeck-es-master   ClusterIP      None           <none>         <none>           24m
service/myeck-kb-http     LoadBalancer   10.0.170.36    13.78.26.xxx   5601:32406/TCP   6m50s

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/myeck-kb   1/1     1            1           6m49s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/myeck-kb-5c846f465c   1         1         1       6m49s

NAME                               READY   AGE
statefulset.apps/myeck-es-data     2/2     24m
statefulset.apps/myeck-es-master   3/3     24m

5. 确认访问

我会立即尝试访问Kibana。访问的IP地址是上面提到的“service/myeck-kb-http”资源的EXTERNAL-IP,即“13.78.26.xxx”,端口是5601。请注意,由于启用了安全性,要使用https进行访问。

image.png

弹性用户的密码存储在上述的PASSWORD变量中,您可以使用以下命令进行复制粘贴。

$ echo $PASSWORD
44gkrmqh75lnzx8p7ppsgcbg
$
image.png

我能顺利地访问Kibana。
为了安全起见,我还会在Monitoring中确认节点列表。

image.png

Masterx3和Datax2已经按照预期进行了设置。之所以有7+7个分片,是因为在导入示例数据之后这样设置的。(并不是说有ECK特有的分片)

关于ECK的内容和功能,能否再详细解释一些呢?

到目前为止,这只是关于ECK的基本使用方法,接下来我会稍微详细地介绍一些具体的配置和用法。

1. 采用 StatefulSet

在 ECK 初次发布的 0.8 版本中,没有使用 StatefulSet,而是采用了 Operator 直接管理 Pod 的架构。当在 k8s 上处理有状态工作负载时,使用 StatefulSet 资源可以让 k8s 负责处理多个 Pod 的启动、停止顺序以及 PVC 的映射等考虑,因此许多其他的 Operator 都选择了使用 StatefulSet。

但是,由于ECK中的每个节点可以拥有不同的角色和规格配置,很难将其应用于像StatefulSet一样的唯一Pod组进行管理。而且,在需要进行升级或节点扩展等细节控制和考虑的情况下,StatefulSet很难处理。因此,我们首先放弃了使用StatefulSet。关于这点的背景,可以在版本0.8时的Github上的设计讨论中找到,并且非常有趣,所以我提供了一个URL供参考。

    • StatefulSet of Custom controller

https://github.com/elastic/cloud-on-k8s/blob/0.8/docs/design/0001-no-stateful-sets.md

从1.0-beta版本开始,我们决定在集群内按照相同类型进行分组,我们将这些分组称为nodeSets,并且将它们分别作为StatefulSet处理。因此, Master和Data将分别作为StatefulSet来管理Pod,这就是我们的架构设计。

$ kubectl get statefulset -n myeckns
NAME              READY   AGE
myeck-es-data     2/2     72m
myeck-es-master   3/3     72m
$

在这里,每个StatefulSet都对应着yaml定义内的nodeSets的每个分组。

其实通过采用StatefulSet,在替换节点、更换容器映像等操作时,所需的时间大大缩短了。原因在于StatefulSet能够为每个节点分配(bind)节点特定的PVC(持久化卷索赔),而持久化数据基本上存储在PV(持久化卷)上,这意味着在容器重新启动或者更新为新的映像时,PVC数据可被重新利用。

让我们来确认一下实际上每个属于StatefulSet的Pod是否拥有PVC。

$ kubectl get pvc -n myeckns
NAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
elasticsearch-data-myeck-es-data-0     Bound    pvc-ddd1efc1-7a2b-4d7d-8c83-cf9d1205c7cb   1Gi        RWO            default        78m
elasticsearch-data-myeck-es-data-1     Bound    pvc-461de1a1-6ce4-4241-8e94-33bfee7df8ab   1Gi        RWO            default        78m
elasticsearch-data-myeck-es-master-0   Bound    pvc-df8174fd-52a1-4deb-9ebc-d9615abc1603   1Gi        RWO            default        78m
elasticsearch-data-myeck-es-master-1   Bound    pvc-ccf71a3c-9428-4e1d-ab16-fe2498ade35b   1Gi        RWO            default        78m
elasticsearch-data-myeck-es-master-2   Bound    pvc-97a9ba87-855b-4157-a074-42a7679ed9fa   1Gi        RWO            default        78m
$

每个Pod都有自己专用的PVC(默认大小为1GB),无论容器是重新启动还是更换,都可以被重复使用。在使用StatefulSet之前,容器更换时无法继承数据区域,需要每次从其他节点进行数据同步,但这个问题已经得到改善。

2. 自定义节点结构

在介绍导入方法时,我们提到可以通过在yaml文件中指定节点数量和节点类型(角色)来实现多节点配置。但在这里,我们将介绍一种更一般的节点配置自定义方法。

    • “elasticsearch.yaml”に記載していた設定パラメータ

実は”spec.nodeSets.config”以下にそのまま従来使っていたelasticsearch.yamlファイルの設定を書くことができます。以下は一例です。

spec:
  nodeSets:
  - name: mlenabled-nodes
    count: 3
    config:
      node.master: true
      node.data: true
      node.ingest: true
      node.ml: true
      xpack.ml.enabled: true
      cluster.remote.connect: false
    • JVMヒープサイズ

ヒープサイズの設定もconfig以下に書きたいところですが、これは環境変数ですので、コンテナ設定のenv属性で指定する必要があります(指定がない場合のデフォルト値は1Gです)
さらに、この設定をする場合、resources句を用いて、PodにおけるCPU、メモリリソースの制限を明記することをおすすめします

spec:
  nodeSets:
  - name: node-with-jvmheapsetting
    count: 1
    podTemplate:
      spec:
        containers:
        - name: elasticsearch
          env:
          - name: ES_JAVA_OPTS
            value: "-Xms4g -Xmx4g"
          resources:
            requests:
              memory: 8Gi
              cpu: 0.5
            limits:
              memory: 8Gi
              cpu: 2
    • ボリュームサイズの指定

デフォルトでは”default”ストレージクラスから1GiのPVCを割り当てようとします
これを変更したい場合、同じようにspec以下に指定します
metadata.nameの値は”elasticsearch-data”で固定です(注意:名前をこれ以外に変更してはいけません)
自前のk8s環境で要件に合わせたストレージクラスを用意している場合はstorageClassNameに明示的に指定して使い分けることが可能です

spec:
  nodeSets:
  - name: data-with-big-and-fast-volume
    count: 3
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data ★★注意:この値はelasticsearch-dataから変更不可★★
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
        storageClassName: superfast-ssd
    • スケールアウト・スケールイン

ノード拡張したい場合、元のyamlの定義”spec.nodeSets.count”を編集して”kubectl apply”します
ノード縮退についても同じです
(注意)StatefulSetを使っていることから、以下のコマンドでノード拡張したくなりますが、StatefulSetのコントロールはすべてOperatorが掌握しているため、このコマンドは無視されますので、上記の方法でノード拡張をしてください(※厳密に言うと、replicasが一瞬3になりますが、すぐにOperatorがあるべき設定値(=desired state)である2に戻してしまいます)

$ kubectl scale statefulsets myeck-es-data --replicas=3 -n myeckns
statefulset.apps/myeck-es-data scaled
$ kubectl get statefulset -n myeckns
NAME              READY   AGE
myeck-es-data     2/2     105m  ★★レプリカ数を3にしたが無視されている★★
myeck-es-master   3/3     105m
$

Elasticsearch/Kibanaのバージョンアップ

ノード拡張と同様で、yaml定義ファイルのspec.versionの値を編集して”kubectl apply”します
基本的な動作としては、既存コンテナは破棄されて、新規コンテナが起動します(ただし、PVC/PVは引き継げるためコンテナ起動時間だけ待てばOKです)
バージョンダウンはできない仕様となっています

ノードスケジューリング制御

Masterノードなどクラスタ可用性を担うロールのノードはk8sクラスタの同一ノードで起動しないように制御したい場合があります
ECKではデフォルトで「できるだけ」同じロールのノードは別ホストでスケジューリングされるようになっています
デフォルトスケジューリングポリシーを変更して、たとえば「必ず」別ホストでスケジュールさせることも可能です

spec:
  nodeSets:
  - name: antiaffinity-nodes
    count: 3
    podTemplate:
      spec:
        affinity:
          podAntiAffinity:
            requiredDuringSchedulingIgnoredDuringExecution: ★★同一ホストでの起動を禁止★★
            - podAffinityTerm:
                labelSelector:
                  matchLabels:
                    elasticsearch.k8s.elastic.co/cluster-name: myeck
              topologyKey: kubernetes.io/hostname

在上述例子中,我们以k8s主机名为基准,通过使用podAntiAffinity指定”requiredDuringSchedulingIgnoredDuringExcecution”,使得这些nodeSets(同一角色的节点组)在同一主机上不会被调度启动。由于Pod数量为3,如果k8s主机只有2个节点,那么第3个Pod将无法启动并处于Pending状态。
默认情况下使用”prefferedDuringSchedulingIgnoredDuringExcecution”策略,这意味着如果在其他节点上无法启动,也会允许在同一主机上启动。

    • プラグインインストール

kuromojiなど追加でプラグインをインストールするには、コンテナ起動時にinitContainerでplugin-installコマンドを実行するという手順をふみます

apiVersion: elasticsearch.k8s.elastic.co/v1beta1
kind: Elasticsearch
metadata:
  name: myeck
  namespace: myeckns
spec:
  version: 7.5.1
  nodeSets:
  - name: default
    count: 3
    config:
      node.master: true
      node.data: true
      node.ingest: true
      node.store.allow_mmap: false
    podTemplate:
      spec:
        initContainers:
        - name: install-plugins
          command:
          - sh
          - -c
          - |
            bin/elasticsearch-plugin install --batch analysis-kuromoji ★★ここでインストール★★
  http:
    service:
      metadata: {}
      spec:
        type: LoadBalancer

确认是否成功安装,请执行以下命令。指定的kuromoji插件已经正确安装。

$ curl -u "elastic:$PASSWORD" -k https://<LBのIP>:9200/_cat/plugins
myeck-es-default-0 analysis-kuromoji 7.5.1
myeck-es-default-1 analysis-kuromoji 7.5.1
myeck-es-default-2 analysis-kuromoji 7.5.1
$

我已经讲解了以上内容,包括ECK的安装和自定义方法等等。详细的内容也可以在官方文档中找到,建议在阅读以上内容并大致理解后再参考文档,这样可以在短时间内进行快速学习。

还有一件事情… yī …)

我們已經介紹了在本地的k8s環境中使用ECK的步驟,但也許有很多人覺得建立k8s環境太麻煩了。因此,我們找到了一個Katakoda場景,幾乎可以在瀏覽器上體驗到我們之前講解的內容,請務必試試看。

    • katakoda: elastic-eck-quickstart

https://www.katacoda.com/avwsolutions/scenarios/elastic-eck-quickstart

image.png

总结

在这里,我们介绍了Elastic Cloud on K8s(ECK)的安装方法和一些用法,假设它已经正式发布。我们认为未来会增加类似云的使用方式,即根据需要立即启动Elasticsearch,希望ECK能够成为其中的助力。这是2019年Elastic Stack Advent Calendar(第1个)的最后一篇,由@amanekey先生分享!

广告
将在 10 秒后关闭
bannerAds