关于Elastic Cloud on Kubernetes (ECK)的工作原理和每个配置更改的行为

这篇文章是ZOZO Technologies Advent Calendar #2的第17篇文章。

TL;DR(太长不看);

    • ECK動作確認環境構築手順

 

    • ECKの仕組み

 

    各構成・設定変更における挙動解説

建立動作確認環境

本文将简要介绍用于解释本文的环境建立方法。请注意,虽然我们使用的是Amazon Elastic Kubernetes Service(以下简称EKS)作为Kubernetes环境,但我们将省略有关EKS设置和k8s集群操作所需的kubectl等配置步骤。另外,我们假设您已经处于可以连接到k8s集群的状态。

环境

    • クライアントOS: macOS

 

    • Kubernetes versions:

client: v1.19.4
server: v1.18.9

ECK: 1.3

搭建

我们假设您已经成功通过kubectl命令可以访问k8s集群。


kubectl get nodes

NAME                                                STATUS   ROLES    AGE    VERSION
ip-192-168-27-58.ap-northeast-1.compute.internal    Ready    <none>   3d4h   v1.18.9-eks-d1db3c
ip-192-168-38-215.ap-northeast-1.compute.internal   Ready    <none>   3d4h   v1.18.9-eks-d1db3c
ip-192-168-85-80.ap-northeast-1.compute.internal    Ready    <none>   3d4h   v1.18.9-eks-d1db3c

易点击安装

将ECK 1.3.0(弹性操作符和相关资源)的清单应用到K8s集群,请按以下方式操作。

VERSION=1.3.0
kubectl apply -f https://download.elastic.co/downloads/eck/${VERSION}/all-in-one.yaml

ECK的核心资源将部署在elastic-system命名空间中。通过以下命令确认Elastic Operator pod是否正在运行。

kubectl get all -n elastic-system

NAME                     READY   STATUS    RESTARTS   AGE
pod/elastic-operator-0   1/1     Running   0          14m

NAME                             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/elastic-webhook-server   ClusterIP   10.100.111.185   <none>        443/TCP   14m

NAME                                READY   AGE
statefulset.apps/elastic-operator   1/1     14m

可以通过以下方式查看Elastic Operator的日志。

kubectl -n elastic-system logs -f statefulset.apps/elastic-operator

部署Elasticsearch集群。

完成Elastic Operator的安装后,接下来将在k8s上部署Elasticsearch集群。已经安装的Elastic Operator会自动将Elasticsearch集群部署到k8s上,并管理k8s资源以保持所声明的状态。

首先,在本文中进行操作确认时,创建名为”testeck”的命名空间。

kubectl create namespace testeck

将创建的命名空间testeck中部署一个由3个master节点和1个data节点组成的Elasticsearch集群ecksandbox。

cat <<EOF | kubectl apply -n testeck -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: ecksandbox
spec:
  version: 7.10.0
  nodeSets:
  - name: master-nodes
    count: 3
    config:
      node.store.allow_mmap: false
      node.roles: ["master"]
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
        storageClassName: gp2
  - name: data-nodes
    count: 1
    config:
      node.store.allow_mmap: false
      node.roles: ["data", "ingest"]
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 2Gi
        storageClassName: gp2
EOF

请注意:在volumeClaimTemplates中,对于master节点分别声明分配1GB的EBS卷(gp2),对于data节点声明分配2GB的EBS卷(gp2)。

获取已部署Elasticsearch资源的状态如下。 如果一切正常,HEALTH状态应为绿色,NODES为4个,PHASE应准备好。

kubectl get elasticsearch -n testeck

NAME         HEALTH   NODES   VERSION   PHASE   AGE
ecksandbox   green    4      7.10.0    Ready   64s

访问Elasticsearch集群

首先访问部署的Elasticsearch集群。然后按以下方式获取自动保存在secrets中的elastic用户密码。

export NAMESPACE=testeck
export PASSWORD=$(kubectl get secret ecksandbox-es-elastic-user -n ${NAMESPACE} -o go-template='{{.data.elastic | base64decode}}')

echo $PASSWORD
2LIh4PY5XUAejd85d9c3q461

接下来,我们将获取为Elasticsearch集群创建的service。ecksandbox-es-http将成为连接目标的service。

kubectl get svc -n testeck

NAME                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
ecksandbox-es-data-nodes     ClusterIP   None             <none>        9200/TCP   2m50s
ecksandbox-es-http           ClusterIP   10.100.237.243   <none>        9200/TCP   2m52s
ecksandbox-es-master-nodes   ClusterIP   None             <none>        9200/TCP   2m50s
ecksandbox-es-transport      ClusterIP   None             <none>        9300/TCP   2m52s

使用kubectl port-forward命令,可以将本地机器上的端口9200转发到Elasticsearch的ecksandbox-es-http,实现对其的访问。

kubectl port-forward service/ecksandbox-es-http 9200 -n testeck

Forwarding from 127.0.0.1:9200 -> 9200
Forwarding from [::1]:9200 -> 9200

最后,使用之前获取的elastic用户密码,向Elasticsearch集群发送请求,将会得到以下结果。


curl -u "elastic:$PASSWORD" -k "https://localhost:9200"

{
  "name" : "ecksandbox-es-master-nodes-0",
  "cluster_name" : "ecksandbox",
  "cluster_uuid" : "Jdcikd2dSPqlPGR9uj2hqA",
  "version" : {
    "number" : "7.10.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96",
    "build_date" : "2020-11-09T21:30:33.964949Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

尝试摄取测试数据并进行搜索。

根据 Elastic 公司的官方快速入门指南,在上述创建的 Elasticsearch 集群中,按照以下方式导入测试数据。

以与之前相同的方式,将本地设备上的端口导向到Elasticsearch的ecksandbox-es-http,以便能够访问。如果已经导向了端口,则可以省略此步骤。

kubectl port-forward service/ecksandbox-es-http 9200 -n testeck

然后,获取测试数据,并使用bulk API将数据以Bulk的方式导入到Elasticsearch集群中。这里将目标索引设置为bank。

# テストデータ取得
curl -o accounts.json https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/resources/accounts.json

# Bulkインジェスト
curl -u "elastic:$PASSWORD" -k -H "Content-Type: application/json" -XPOST "https://localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@accounts.json"

当通过cat indices API来检查索引时,我们可以看到该索引包含一个主分片和一个副本分片,bank索引中存储了1000个文档。

curl -u "elastic:$PASSWORD" -k "https://localhost:9200/_cat/indices?v"

health status index uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   bank  TyjMvOOCQDiNZNqwNHSNQA   1   1       1000            0      394kb          394kb

ECK的机制

弹性运营商

ECK会使用Elastic Operator自动化在Kubernetes上的Elasticsearch和Kinana的配置和管理。Elastic Operator负责处理集群的部署、集群配置更改和升级、节点规模的扩展和缩小、备份等操作。有关功能的详细信息请参阅此处。

以下的图像展示了通过弹性运算符(Elastic Operator)部署 Elasticsearch 和 Kibana 资源的流程。当用户创建定义 Elasticsearch 和 Kibana 资源的 CRD(Custom Resource Definition) YAML,并将其应用到 k8s 中时,弹性运算符将根据此创建部署或修改 Elasticsearch 和 Kibana 资源。刚刚进行的 Elasticsearch 集群(ecksandbox)的部署也是按照这个流程进行的。

eck-elastic-operator.png

关于 NodeSets 和 StatefulSet

弹性操作员通过使用表示集群内相同Elasticsearch配置的节点组NodeSets来进行Elasticsearch集群的拓扑配置。这些NodeSets的实体是StatefulSet。通常,会为Elasticsearch的主节点和数据节点分别设置独立的NodeSets,每个Pod会在不同的StatefulSet中管理。以下是NodeSets的定义以及为每个定义创建独立的StatefulSet的示例图。更多关于NodeSets的详细信息,请参考官方页面上的节点编排部分。

eck-nodesets.png

由于NodeSets作为StatefulSet资源进行部署,所以在理解ECK对各种配置更改的行为时,需要先理解StatefulSet。以下是需要了解的关键点,以便理解配置和设置更改时的行为。

重点1: 在StatefulSet中为每个Pod分配独立的PVC和PV。

根据volumeClaimTemplate的定义,StatefulSet为每个Pod分配单独的PVC(持久性卷索赔)和PV(持久性卷)。例如,在之前进行的ecksandbox集群的data-nodes节点上,使用volumeClaimTemplates配置为每个Pod分配2GB的EBS卷(gp2)。

  nodeSets:
  - name: data-nodes
    count: 1
    config:
      node.store.allow_mmap: false
      node.roles: ["data", "ingest"]
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 2Gi
        storageClassName: gp2

这样,每个Pod都被分配了独立的PVC和PV。另一方面,k8s中有ReplicaSet,但对于ReplicaSet而言,同一ReplicaSet的所有Pod都被分配了相同的PVC和PV。以下是ReplicaSet和StatefulSet的PVC和PV分配比较图。

eck-replicaset-vs-statefulset.png

为了参考,刚刚进行的Elasticsearch集群ecksandbox的部署中,我们部署了master-nodes(3个节点)和data-nodes(1个节点)这两种NodeSets,也就是说部署了两个StatefulSet。每个Pod、PVC和PV的分配情况如下所示。

kubectl get po,sts,pv,pvc -n testeck

NAME                               READY   STATUS    RESTARTS   AGE
pod/ecksandbox-es-data-nodes-0     1/1     Running   0          7h10m
pod/ecksandbox-es-master-nodes-0   1/1     Running   0          7h10m
pod/ecksandbox-es-master-nodes-1   1/1     Running   0          7h10m
pod/ecksandbox-es-master-nodes-2   1/1     Running   0          7h10m

NAME                                          READY   AGE
statefulset.apps/ecksandbox-es-data-nodes     1/1     7h10m
statefulset.apps/ecksandbox-es-master-nodes   3/3     7h10m

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                     STORAGECLASS   REASON   AGE
persistentvolume/pvc-265d9044-5111-4e54-9667-a741c7537043   1Gi        RWO            Delete           Bound    testeck/elasticsearch-data-ecksandbox-es-master-nodes-2   gp2                     7h10m
persistentvolume/pvc-299aff52-cfff-4b5b-a847-5f4bdf528f8f   1Gi        RWO            Delete           Bound    testeck/elasticsearch-data-ecksandbox-es-master-nodes-0   gp2                     7h10m
persistentvolume/pvc-d7ff409d-f731-4f02-b26e-c67fd3662941   2Gi        RWO            Delete           Bound    testeck/elasticsearch-data-ecksandbox-es-data-nodes-0     gp2                     7h10m
persistentvolume/pvc-e40bcf99-0e57-48e7-acc8-d19224b67665   1Gi        RWO            Delete           Bound    testeck/elasticsearch-data-ecksandbox-es-master-nodes-1   gp2                     7h10m

NAME                                                                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/elasticsearch-data-ecksandbox-es-data-nodes-0     Bound    pvc-d7ff409d-f731-4f02-b26e-c67fd3662941   2Gi        RWO            gp2            7h10m
persistentvolumeclaim/elasticsearch-data-ecksandbox-es-master-nodes-0   Bound    pvc-299aff52-cfff-4b5b-a847-5f4bdf528f8f   1Gi        RWO            gp2            7h10m
persistentvolumeclaim/elasticsearch-data-ecksandbox-es-master-nodes-1   Bound    pvc-e40bcf99-0e57-48e7-acc8-d19224b67665   1Gi        RWO            gp2            7h10m
persistentvolumeclaim/elasticsearch-data-ecksandbox-es-master-nodes-2   Bound    pvc-265d9044-5111-4e54-9667-a741c7537043   1Gi        RWO            gp2            7h10m

重点2:Pod执行顺序(创建按低序号先进行,更新和删除按高序号先进行)

在StatefulSet中,每个Pod的名称被分配一个从0到N-1(N为副本数)的整数值。举例来说,刚才部署的Elasticsearch集群ecksandbox的master节点的StatefulSet有3个副本,也就是由3个Pod组成,而每个Pod的名称被分配为0〜2(3-1)的整数值。

kubectl get pods -n testeck

NAME                           READY   STATUS    RESTARTS   AGE
ecksandbox-es-master-nodes-0   1/1     Running   0          6h25m
ecksandbox-es-master-nodes-1   1/1     Running   0          6h25m
ecksandbox-es-master-nodes-2   1/1     Running   0          6h25m
...

在同一个 StatefulSet 中,Pod 的创建将按照较低的编号顺序逐个进行。而更新和删除将按照较高的 Pod 编号顺序逐个进行。

例如,当3个状态集的副本缩减到0时,会进行Pod的更新和删除操作,删除的顺序是从较高的Pod编号开始(2->1->0)。而当Pod进行扩展时,会按照较低的Pod编号顺序进行创建(0->1->2)。

在执行从缩小规模到扩大规模的案例中,有一个重要的要点需要注意,即在分离相同PVC和PV之后,它们仍然保持不变,并且在再次进行扩大规模时被分配给相同编号的Pod。下面的示例说明了一个具有3个副本的有状态集合(StatefulSet)从缩小规模为1个Pod到再次扩大规模为3个Pod的流程。在缩小规模时,1号和2号的Pod的PVC和PV会被分离,但它们仍然保持不变,并且在再次扩大规模时被分配给相同编号的Pod。

eck-scale-in-out.png

這些行為是為了能夠在不丟失數據的情況下修改Pod,即配置變更而進行的基本操作。

构成的变化和其行为

节点的扩展和缩减规模

节点的扩展和收缩基本上是通过更改NodeSets的计数来完成的。这与前述的StatefulSet的扩展和收缩相同。因此,集群将逐个无中断地更新副本。但请注意,在以下条件下,集群的可用性无法得到保证。

    • シングルノードのElasticsearchクラスタ

 

    Elasticsearchクラスタのインデックスにレプリカがない

那么现在我们来应用以下的YAML文件,并且尝试将先前部署的Elasticsearch集群ecksandbox的data-nodes节点扩展到3个副本。


cat <<EOF | kubectl apply -n testeck -f -

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: ecksandbox
spec:
  version: 7.10.0
  nodeSets:
  - name: master-nodes
    count: 3
    config:
      node.store.allow_mmap: false
      node.roles: ["master"]
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
        storageClassName: gp2
  - name: data-nodes
    count: 3
    config:
      node.store.allow_mmap: false
      node.roles: ["data", "ingest"]
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 2Gi
        storageClassName: gp2
EOF

当执行上述操作时,可以看到data-nodes的StatefulSet被扩展为3个副本,并且每个Pod依次分配了PVC和PV。

kubectl get elasticsearch,po,sts,pv,pvc -n testeck

NAME                                                    HEALTH   NODES   VERSION   PHASE   AGE
elasticsearch.elasticsearch.k8s.elastic.co/ecksandbox   yellow   4       7.10.0    Ready   7h38m

NAME                               READY   STATUS    RESTARTS   AGE
pod/ecksandbox-es-data-nodes-0     1/1     Running   0          7h38m
pod/ecksandbox-es-data-nodes-1     0/1     Running   0          29s
pod/ecksandbox-es-data-nodes-2     0/1     Running   0          29s
pod/ecksandbox-es-master-nodes-0   1/1     Running   0          7h38m
pod/ecksandbox-es-master-nodes-1   1/1     Running   0          7h38m
pod/ecksandbox-es-master-nodes-2   1/1     Running   0          7h38m

NAME                                          READY   AGE
statefulset.apps/ecksandbox-es-data-nodes     1/3     7h38m
statefulset.apps/ecksandbox-es-master-nodes   3/3     7h38m

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                     STORAGECLASS   REASON   AGE
persistentvolume/pvc-1acf4843-0563-4d2d-95d3-0332515c985d   2Gi        RWO            Delete           Bound    testeck/elasticsearch-data-ecksandbox-es-data-nodes-2     gp2                     23s
persistentvolume/pvc-265d9044-5111-4e54-9667-a741c7537043   1Gi        RWO            Delete           Bound    testeck/elasticsearch-data-ecksandbox-es-master-nodes-2   gp2                     7h38m
persistentvolume/pvc-299aff52-cfff-4b5b-a847-5f4bdf528f8f   1Gi        RWO            Delete           Bound    testeck/elasticsearch-data-ecksandbox-es-master-nodes-0   gp2                     7h38m
persistentvolume/pvc-31440203-06d5-4d00-947d-3f431b84a381   2Gi        RWO            Delete           Bound    testeck/elasticsearch-data-ecksandbox-es-data-nodes-1     gp2                     23s
persistentvolume/pvc-d7ff409d-f731-4f02-b26e-c67fd3662941   2Gi        RWO            Delete           Bound    testeck/elasticsearch-data-ecksandbox-es-data-nodes-0     gp2                     7h38m
persistentvolume/pvc-e40bcf99-0e57-48e7-acc8-d19224b67665   1Gi        RWO            Delete           Bound    testeck/elasticsearch-data-ecksandbox-es-master-nodes-1   gp2                     7h38m

NAME                                                                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/elasticsearch-data-ecksandbox-es-data-nodes-0     Bound    pvc-d7ff409d-f731-4f02-b26e-c67fd3662941   2Gi        RWO            gp2            7h38m
persistentvolumeclaim/elasticsearch-data-ecksandbox-es-data-nodes-1     Bound    pvc-31440203-06d5-4d00-947d-3f431b84a381   2Gi        RWO            gp2            29s
persistentvolumeclaim/elasticsearch-data-ecksandbox-es-data-nodes-2     Bound    pvc-1acf4843-0563-4d2d-95d3-0332515c985d   2Gi        RWO            gp2            29s
persistentvolumeclaim/elasticsearch-data-ecksandbox-es-master-nodes-0   Bound    pvc-299aff52-cfff-4b5b-a847-5f4bdf528f8f   1Gi        RWO            gp2            7h38m
persistentvolumeclaim/elasticsearch-data-ecksandbox-es-master-nodes-1   Bound    pvc-e40bcf99-0e57-48e7-acc8-d19224b67665   1Gi        RWO            gp2            7h38m
persistentvolumeclaim/elasticsearch-data-ecksandbox-es-master-nodes-2   Bound    pvc-265d9044-5111-4e54-9667-a741c7537043   1Gi        RWO            gp2            7h38m

根据节点的规模变化自动调整副本数量。

根据节点的规模变化,可以自动调整副本数量。副本的自动扩展主要适用于索引只有一个分片的情况,只需要根据节点数量进行线性增加,非常有效。

通过在索引中设置index.auto_expand_replicas,根据集群中的数据节点数量,自动扩展副本的数量。设置应该是一个由破折号分隔的下限值-上限值(例如:0-5),或者使用all表示全部到上限值(例如:0-all)。在这里,我们将设置为0-all,表示根据刚刚创建的bank索引完全根据数据节点数量自动扩展副本的数量。


INDEX_NAME="bank"
curl -u "elastic:$PASSWORD" -k -XPUT "https://localhost:9200/${INDEX_NAME}/_settings" -H 'Content-Type: application/json' -d'
{
 "index" : {
    "auto_expand_replicas": "0-all"
  }
}'

另外,要了解有关索引设置的详细信息,请参阅此页面。

当进行节点的扩展或收缩以改变数据节点数量时,相应地副本的数量将增减为N-1。请使用下一个命令确认副本的数量(不要忘记进行端口转发)。其中rep字段表示副本数量。

curl -u "elastic:$PASSWORD" -k "https://localhost:9200/_cat/indices?v"

health status index uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   bank  TyjMvOOCQDiNZNqwNHSNQA   1   3       1000            0      394kb          394kb

添加NodeSet

在Elasticsearch集群中无需停止即可新增NodeSet。当例如添加名为data-nodes2的新NodeSet到Elasticsearch集群时,Elastic Operator将创建相应的新StatefulSet。此外,它还会自动创建用于TLS证书和Elasticsearch设置的Secrets和ConfigMap。

卷尺寸的扩展

2020年12月時点,由于这个StatefulSet实施的限制,似乎无法动态更改与StatefulSet关联的PVC的Volume大小。换句话说,即使更改volumeClaimTemplates的存储大小,PVC可能不支持存储扩展,即使PVC存储扩展被支持,由于StatefulSet首先占用了Volume,无论如何都不可能做到。

  - name: data-nodes
    count: 2
    config:
      node.store.allow_mmap: false
      node.roles: ["data", "ingest"]
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 3Gi  <<<ここを増やす
        storageClassName: gp2

共享的解决方法是将NodeSet的名称更改为”data-nodes2″,更改存储大小,并应用该YAML。Elastic Operator会为新的NodeSet “data-nodes2” 创建Pod,并自动将旧Pod的数据迁移到新Pod中。一旦数据迁移完成,旧的Pod会自动删除。

  - name: data-nodes2
    count: 2
    config:
      node.store.allow_mmap: false
      node.roles: ["data", "ingest"]
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 3Gi
        storageClassName: gp2

NodeSet.spec的更新

当更新现有的NodeSet规范时,将更新Elasticsearch设置和podTemplate等NodeSet.spec的更新。Elastic Operator将执行相应的Elasticsearch节点的滚动升级。按照Elasticsearch的滚动升级,我们会尽可能地维持Elasticsearch集群的可用性并更新相关的Pod。通常情况下,此过程将逐个重新启动Elasticsearch节点。

节点集合规范更新示例:
– 更新ES配置,例如JVM堆大小。
– 更新Pod模板(虚拟内存设置、插件安装设置)。

另外,请注意以下情况下无法保证集群可用性,就像节点缩放一样:
– Elasticsearch 单节点集群
– Elasticsearch 集群中的索引没有副本。

虚拟内存的设定示例

您可以通过更改podTemplate来设置虚拟内存。有关虚拟内存设置的详细信息,请参阅此处。

  nodeSets:
  - name: master-nodes
    count: 3
    podTemplate:
      spec:
        initContainers:
        - name: sysctl
          securityContext:
            privileged: true
          command: ['sh', '-c', 'sysctl -w vm.max_map_count=262144']

插件安装示例

您可以通过更改podTemplate来安装插件。有关插件安装设置的详细信息,请参阅此处。

  - name: data-nodes
    count: 2
    config:
      node.store.allow_mmap: false
      node.roles: ["data", "ingest"]
    podTemplate:
      spec:
        initContainers:
        - name: install-plugins
          command:
          - sh
          - -c
          - |
            bin/elasticsearch-plugin install --batch analysis-icu

升级Elasticsearch集群。

与节点的横向扩展和纵向扩展类似,可以逐个创建新的Pod,并在无停机的情况下进行升级。但是,无法降低版本。

之前部署的Elasticsearch集群ecksandbox的版本是7.10.0,但只需在spec.version中指定新版本7.10.1,即可启动自动升级进程。

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: ecksandbox
spec:
  version: 7.10.1
  nodeSets:
  - name: master-nodes
    count: 3
    config:
      node.store.allow_mmap: false
      node.roles: ["master"]
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
        storageClassName: gp2

总结

我认为您已经理解了ECK在很大程度上通过弹性操作符自动化了运维管理,从而简化了运维管理。此外,关于自动化处理,StatefulSet扮演着重要角色,所以对于理解它的行为是必不可少的。虽然这次没有涉及到存储方面的行为,但为了进行稳定的运维,我认为对存储方面也需要有足够的理解。

以上就是我对ECK的机制和各配置更改中的行为进行简要说明。非常感谢您的阅读。

祝你过上愉快的ECK生活!

广告
将在 10 秒后关闭
bannerAds