关于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)的部署也是按照这个流程进行的。
关于 NodeSets 和 StatefulSet
弹性操作员通过使用表示集群内相同Elasticsearch配置的节点组NodeSets来进行Elasticsearch集群的拓扑配置。这些NodeSets的实体是StatefulSet。通常,会为Elasticsearch的主节点和数据节点分别设置独立的NodeSets,每个Pod会在不同的StatefulSet中管理。以下是NodeSets的定义以及为每个定义创建独立的StatefulSet的示例图。更多关于NodeSets的详细信息,请参考官方页面上的节点编排部分。
由于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分配比较图。
为了参考,刚刚进行的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。
這些行為是為了能夠在不丟失數據的情況下修改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生活!