用 KubeBlocks 管理 Elasticsearch
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。
本文档展示了如何通过 kbcli、kubectl 或 YAML 文件等当时创建和管理 Elasticsearch 集群。您可以在 GitHub 仓库查看 YAML 示例。
开始之前
- 如果您想通过
kbcli
创建并连接 Elasticsearch 集群,请先安装 kbcli。 - 安装 KubeBlocks。
- 安装并启用 elasticsearch 引擎。
创建集群
步骤
- kubectl
- kbcli
KubeBlocks 通过 Cluster
定义集群。以下是创建 Elasticsearch 集群的示例。KubeBlocks 还支持创建Pod 默认分布在不同节点。如果您只有一个节点可用于部署集群,可设置 spec.schedulingPolicy
或 spec.componentSpecs.schedulingPolicy
,具体可参考 API 文档。但生产环境中,不建议将所有副本部署在同一个节点上,因为这可能会降低集群的可用性。
cat <<EOF | kubectl apply -f -
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
name: mycluster
namespace: demo
annotations:
kubeblocks.io/extra-env: '{"master-roles":"master", "data-roles": "data", "ingest-roles": "ingest", "transform-roles": "transform"}'
spec:
terminationPolicy: Delete
componentSpecs:
- name: master
componentDef: elasticsearch-8-1.0.0
replicas: 3
resources:
limits:
cpu: '0.5'
memory: 2Gi
requests:
cpu: '0.5'
memory: 2Gi
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
- name: data
componentDef: elasticsearch-8-1.0.0
replicas: 3
resources:
limits:
cpu: '0.5'
memory: 2Gi
requests:
cpu: '0.5'
memory: 2Gi
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
- name: ingest
componentDef: elasticsearch-8-1.0.0
replicas: 1
resources:
limits:
cpu: '0.5'
memory: 2Gi
requests:
cpu: '0.5'
memory: 2Gi
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
- name: transform
componentDef: elasticsearch-8-1.0.0
replicas: 1
resources:
limits:
cpu: '0.5'
memory: 2Gi
requests:
cpu: '0.5'
memory: 2Gi
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
EOF
字段 | 定义 |
---|---|
metadata.annotations | 定义了 Elasticsearch 集群类型。 |
spec.terminationPolicy | 集群终止策略,有效值为 DoNotTerminate 、Delete 和 WipeOut 。具体定义可参考 终止策略。 |
spec.componentSpecs | 集群 component 列表,定义了集群 components。该字段支持自定义配置集群中每个 component。 |
spec.componentSpecs.componentDef | 指定了用于定义 component 特性和行为的 ComponentDefinition 自定义资源(CR)。 |
spec.componentSpecs.serviceVersion | 定义了 component 部署的服务版本。 |
spec.componentSpecs.replicas | 定义了 component 中 replicas 的数量。 |
spec.componentSpecs.resources | 定义了 component 的资源要求。 |
spec.componentSpecs.volumeClaimTemplates | PersistentVolumeClaim 模板列表,定义 component 的存储需求。 |
spec.componentSpecs.volumeClaimTemplates.name | 引用了在 componentDefinition.spec.runtime.containers[*].volumeMounts 中定义的 volumeMount 名称。 |
spec.componentSpecs.volumeClaimTemplates.spec.storageClassName | 定义了 StorageClass 的名称。如果未指定,系统将默认使用带有 storageclass.kubernetes.io/is-default-class=true 注释的 StorageClass。 |
spec.componentSpecs.volumeClaimTemplates.spec.resources.storage | 可按需配置存储容量。 |
您可参考 API 文档,查看更多 API 字段及说明。
KubeBlocks operator 监控 Cluster
CRD 并创建集群和全部依赖资源。您可执行以下命令获取集群创建的所有资源信息。
kubectl get all,secret,rolebinding,serviceaccount -l app.kubernetes.io/instance=mycluster -n demo
执行以下命令,查看已创建的 Elasticsearch 集群:
kubectl get cluster mycluster -n demo -o yaml
-
创建集群。
kbcli cluster create elasticsearch mycluster -n demo
如果您需要自定义集群规格,kbcli 也提供了诸多参数,如支持设置引擎版本、终止策略、CPU、内存规格。您可通过在命令结尾添加 --help 或 -h 来查看具体说明。比如,
kbcli cluster create elasticsearch --help
kbcli cluster create elasticsearch -h如果您只有一个节点用于部署多副本集群,可在创建集群时配置集群亲和性,配置
--pod-anti-affinity
,--tolerations
和--topology-keys
。但需要注意的是,生产环境中,不建议将所有副本部署在同一个节点上,因为这可能会降低集群的可用性。例如,kbcli cluster create elasticsearch mycluster \
--pod-anti-affinity='Preferred' \
--tolerations='node-role.kubeblocks.io/data-plane:NoSchedule' \
--topology-keys='null' \
--namespace demo -
查看集群是否已创建。
kbcli cluster list -n demo
>
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mycluster demo Delete Creating Sep 27,2024 11:42 UTC+0800 -
查看集群信息。
kbcli cluster describe mycluster -n demo
连接集群
Elasticsearch 提供 HTTP 访问协议,使用端口 9200 进行通信。您可通过本地主机访问集群。
curl http://127.0.0.1:9200/_cat/nodes?v
扩缩容
水平扩缩容
水平扩展改变 Pod 的数量。例如,您可以将副本从三个扩展到五个。
从 v0.9.0 开始,KubeBlocks 还支持了指定实例扩缩容。可通过 水平扩缩容文档 文档了解更多细节和示例。
开始之前
确认集群状态是否为 Running
。否则,后续相关操作可能会失败。
- kubectl
- kbcli
kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster Delete Running 4m29s
kbcli cluster list mycluster -n demo
>
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mycluster demo Delete Running Sep 27,2024 11:42 UTC+0800
步骤
- OpsRequest
- 编辑集群 YAML 文件
- kbcli
-
对指定的集群应用 OpsRequest,可根据您的需求配置参数。
以下示例演示了增加 2 个副本。
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-horizontal-scaling
namespace: demo
spec:
clusterName: mycluster
type: HorizontalScaling
horizontalScaling:
- componentName: elasticsearch
scaleOut:
replicaChanges: 2
EOF如果您想要缩容,可将
scaleOut
替换为scaleIn
。以下示例演示了删除 2 个副本。
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-horizontal-scaling
namespace: demo
spec:
clusterName: mycluster
type: HorizontalScaling
horizontalScaling:
- componentName: elasticsearch
scaleIn:
replicaChanges: 2
EOF -
查看运维操作状态,验证水平扩缩容是否成功。
kubectl get ops -n demo
>
NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
demo ops-horizontal-scaling HorizontalScaling mycluster Succeed 3/3 6m如果有报错,可执行
kubectl describe ops -n demo
命令查看该运维操作的相关事件,协助排障。 -
当 OpsRequest 状态为
Succeed
或集群状态再次回到Running
后,查看相应资源是否变更。kubectl describe cluster mycluster -n demo
-
修改 YAML 文件中
spec.componentSpecs.replicas
的配置。spec.componentSpecs.replicas
定义了 pod 数量,修改该参数将触发集群水平扩缩容。kubectl edit cluster mycluster -n demo
在编辑器中修改
spec.componentSpecs.replicas
的参数值。...
spec:
clusterDefinitionRef: elasticsearch
clusterVersionRef: elasticsearch-8.8.2
componentSpecs:
- name: elasticsearch
componentDefRef: elasticsearch
replicas: 1 # 修改该参数值
... -
当集群状态再次回到
Running
后,查看相关资源是否变更。kubectl describe cluster mycluster -n demo
-
更改配置。
配置参数
--components
和--replicas
,并执行以下命令。kbcli cluster hscale elasticsearch --replicas=2 --components=elasticsearch -n demo
--components
表示准备进行水平扩容的组件名称。--replicas
表示指定组件的副本数。 根据需要设定数值,进行扩缩容。
-
通过以下任意一种方式验证水平扩容是否完成。
-
查看 OpsRequest 进度。
执行命令后,KubeBlocks 会自动输出查看 OpsRequest 进度的命令,可通过该命令查看 OpsRequest 进度的细节,包括 OpsRequest 的状态、Pod 状态等。当 OpsRequest 的状态为 Succeed 时,表明这一任务已完成。
kbcli cluster describe-ops mycluster-horizontalscaling-xpdwz -n demo
-
查看集群状态。
kbcli cluster list mycluster -n demo
- STATUS=Updating 表示正在进行水平扩容。
- STATUS=Running 表示水平扩容已完成。
-
-
当 OpsRequest 状态为
Succeed
或集群状态再次回到Running
后,查看相应资源是否变更。kbcli cluster describe mycluster -n demo
垂直扩缩容
开始之前
确认集群状态是否为 Running
。否则,后续相关操作可能会失败。
- kubectl
- kbcli
kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster Delete Running 4m29s
kbcli cluster list mycluster -n demo
>
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mycluster demo Delete Running Sep 27,2024 11:42 UTC+0800
步骤
- OpsRequest
- 修改集群 YAML 文件
- kbcli
-
对指定的集群应用 OpsRequest,可根据您的需求配置参数。
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-vertical-scaling
namespace: demo
spec:
clusterName: mycluster
type: VerticalScaling
verticalScaling:
- componentName: elasticsearch
requests:
memory: "2Gi"
cpu: "1"
limits:
memory: "4Gi"
cpu: "2"
EOF -
查看运维任务状态,验证垂直扩缩容操作是否成功。
kubectl get ops -n demo
>
NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
demo ops-vertical-scaling VerticalScaling mycluster Succeed 3/3 6m如果有报错,可执行
kubectl describe ops -n demo
命令查看该运维操作的相关事件,协助排障。 -
当 OpsRequest 状态为
Succeed
或集群状态再次回到Running
后,查看相应资源是否变更。kubectl describe cluster mycluster -n demo
-
修改 YAML 文件中
spec.componentSpecs.resources
的配置。spec.componentSpecs.resources
控制资源的请求值和限制值,修改参数值将触发垂直扩缩容。apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: mycluster
namespace: demo
spec:
clusterDefinitionRef: elasticsearch
clusterVersionRef: elasticsearch-8.8.2
componentSpecs:
- name: elasticsearch
componentDefRef: elasticsearch
replicas: 1
resources: # 修改 resources 下的参数值
requests:
memory: "2Gi"
cpu: "1"
limits:
memory: "4Gi"
cpu: "2"
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
terminationPolicy: Delete -
当集群状态再次回到
Running
后,查看相应资源是否变更。kubectl describe cluster mycluster -n demo
-
更改配置。
配置参数
--components
、--memory
和--cpu
,并执行以下命令。kbcli cluster vscale mycluster --cpu=2 --memory=3Gi --components=elasticsearch -n demo
-
通过以下任意一种方式验证垂直扩容是否完成。
-
查看 OpsRequest 进度。
执行命令后,KubeBlocks 会自动输出查看 OpsRequest 进度的命令,可通过该命令查看 OpsRequest 进度的细节,包括 OpsRequest 的状态、Pod 状态等。当 OpsRequest 的状态为 Succeed 时,表明这一任务已完成。
kbcli cluster describe-ops mycluster-verticalscaling-rpw2l -n demo
-
查看集群状态。
kbcli cluster list mycluster -n demo
- STATUS=Updating 表示正在进行垂直扩容。
- STATUS=Running 表示垂直扩容已完成。
- STATUS=Abnormal 表示垂直扩容异常。原因可能是正常实例的数量少于总实例数,或者 Leader 实例正常运行而其他实例异常。
您可以手动检查是否由于资源不足而导致报错。如果 Kubernetes 集群支持 AutoScaling,系统在资源充足的情况下会执行自动恢复。或者您也可以创建足够的资源,并使用
kubectl describe
命令进行故障排除。
-
-
当 OpsRequest 状态为
Succeed
或集群状态再次回到Running
后,检查资源规格是否已变更。kbcli cluster describe mycluster -n demo
磁盘扩容
开始之前
确认集群状态是否为 Running
。否则,后续相关操作可能会失败。
- kubectl
- kbcli
kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster Delete Running 49m
kbcli cluster list mycluster -n demo
>
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mycluster demo Delete Running Sep 27,2024 11:42 UTC+0800
步骤
- OpsRequest
- 编辑集群 YAML 文件
- kbcli
-
对指定的集群应用 OpsRequest,可根据您的需求配置参数。
以下示例演示了增加 2 个副本。
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-horizontal-scaling
namespace: demo
spec:
clusterName: mycluster
type: HorizontalScaling
horizontalScaling:
- componentName: elasticsearch
scaleOut:
replicaChanges: 2
EOF如果您想要缩容,可将
scaleOut
替换为scaleIn
。以下示例演示了删除 2 个副本。
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-horizontal-scaling
namespace: demo
spec:
clusterName: mycluster
type: HorizontalScaling
horizontalScaling:
- componentName: elasticsearch
scaleIn:
replicaChanges: 2
EOF -
查看运维操作状态,验证水平扩缩容是否成功。
kubectl get ops -n demo
>
NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
demo ops-horizontal-scaling HorizontalScaling mycluster Succeed 3/3 6m如果有报错,可执行
kubectl describe ops -n demo
命令查看该运维操作的相关事件,协助排障。 -
当 OpsRequest 状态为
Succeed
或集群状态再次回到Running
后,查看相应资源是否变更。kubectl describe cluster mycluster -n demo
-
修改 YAML 文件中
spec.componentSpecs.replicas
的配置。spec.componentSpecs.replicas
定义了 pod 数量,修改该参数将触发集群水平扩缩容。kubectl edit cluster mycluster -n demo
在编辑器中修改
spec.componentSpecs.replicas
的参数值。...
spec:
clusterDefinitionRef: elasticsearch
clusterVersionRef: elasticsearch-8.8.2
componentSpecs:
- name: elasticsearch
componentDefRef: elasticsearch
replicas: 1 # 修改该参数值
... -
当集群状态再次回到
Running
后,查看相关资源是否变更。kubectl describe cluster mycluster -n demo
-
更改配置。
配置参数
--components
、--volume-claim-templates
和--storage
,并执行以下命令。kbcli cluster volume-expand elasticsearch --storage=40Gi --components=elasticsearch -t data -n demo
--components
表示需扩容的组件名称。--volume-claim-templates
表示组件中的 VolumeClaimTemplate 名称。--storage
表示磁盘需扩容至的大小。
-
可通过以下任意一种方式验证扩容操作是否完成。
-
查看 OpsRequest 进度。
执行磁盘扩容命令后,KubeBlocks 会自动输出查看 OpsRequest 进度的命令,可通过该命令查看 OpsRequest 进度的细节,包括 OpsRequest 的状态、PVC 状态等。当 OpsRequest 的状态为
Succeed
时,表明这一任务已完成。kbcli cluster describe-ops elasticsearch-volumeexpansion-5pbd2 -n demo
-
查看集群状态。
kbcli cluster list mycluster -n demo
>
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mycluster demo Delete Updating Sep 27,2024 11:42 UTC+0800- STATUS=Updating 表示扩容正在进行中。
- STATUS=Running 表示扩容已完成。
-
-
当 OpsRequest 状态为
Succeed
或集群状态再次回到Running
后,检查资源规格是否已按要求变更。kbcli cluster describe mycluster -n demo
停止/启动集群
您可以停止/启动集群以释放计算资源。当集群停止时,其计算资源将被释放,也就是说 Kubernetes 的 Pod 将被释放,但其存储资源仍将被保留。您也可以重新启动该集群,使其恢复到停止集群前的状态。
停止集群
-
配置集群名称,并执行以下命令来停止该集群。
- OpsRequest
- 修改集群 YAML 文件
- kbcli
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-stop
namespace: demo
spec:
clusterName: mycluster
type: Stop
EOF将 replicas 的值修改为 0,删除 pod。
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: mycluster
namespace: demo
spec:
clusterDefinitionRef: elasticsearch
clusterVersionRef: elasticsearch-8.8.2
terminationPolicy: Delete
componentSpecs:
- name: elasticsearch
componentDefRef: elasticsearch
disableExporter: true
replicas: 0
volumeClaimTemplates:
- name: data
spec:
storageClassName: standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gikbcli cluster stop mycluster -n demo
-
查看集群状态,确认集群是否已停止。
- kubectl
- kbcli
kubectl get cluster mycluster -n demo
kbcli cluster list mycluster -n demo
启动集群
-
配置集群名称,并执行以下命令来启动该集群。
- OpsRequest
- 修改集群 YAML 文件
- kbcli
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-start
namespace: demo
spec:
clusterName: mycluster
type: Start
EOF将 replicas 数值修改为初始值,启动集群。
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: mycluster
namespace: demo
spec:
clusterDefinitionRef: elasticsearch
clusterVersionRef: elasticsearch-8.8.2
terminationPolicy: Delete
componentSpecs:
- name: elasticsearch
componentDefRef: elasticsearch
disableExporter: true
replicas: 1
volumeClaimTemplates:
- name: data
spec:
storageClassName: standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gikbcli cluster start mycluster -n demo
-
查看集群状态,确认集群是否再次启动。
- kubectl
- kbcli
kubectl get cluster mycluster -n demo
kbcli cluster list mycluster -n demo
重启集群
KubeBlocks 支持重启集群中的所有 Pod。当数据库出现异常时,也可以尝试重启集群。
集群重启后,主节点可能会发生变化。
- kubectl
- kbcli
-
执行以下命令,重启集群。
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-restart
namespace: demo
spec:
clusterName: mycluster
type: Restart
restart:
- componentName: elasticsearch
EOF -
查看 pod 和运维操作状态,验证重启操作是否成功。
kubectl get pod -n demo
kubectl get ops ops-restart -n demo重启过程中,Pod 有如下两种状态:
- STATUS=Terminating:表示集群正在重启。
- STATUS=Running:表示集群已重启。
如果操作过程中出现报错,可通过
kubectl describe ops -n demo
查看该操作的事件,协助排障。
-
执行以下命令,重启集群。
配置
components
和ttlSecondsAfterSucceed
的值,执行以下命令来重启指定集群。kbcli cluster restart elasticsearch --components="elasticsearch" \
--ttlSecondsAfterSucceed=30components
表示需要重启的组件名称。ttlSecondsAfterSucceed
表示重启成功后 OpsRequest 作业的生存时间。
-
验证重启是否成功。
检查集群状态,验证重启操作是否成功。
kbcli cluster list elasticsearch
>
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
elasticsearch default elasticsearch elasticsearch-8.8.2 Delete Running Jul 05,2024 17:51 UTC+0800- STATUS=Updating 表示集群正在重启中。
- STATUS=Running 表示集群已重启。
删除集群
终止策略
终止策略决定了删除集群的方式。
终止策略 | 删除操作 |
---|---|
DoNotTerminate | DoNotTerminate 禁止删除操作。 |
Delete | Delete 删除 Pod、服务、PVC 等集群资源,删除所有持久数据。 |
WipeOut | WipeOut 删除所有集群资源,包括外部存储中的卷快照和备份。使用该策略将会删除全部数据,特别是在非生产环境,该策略将会带来不可逆的数据丢失。请谨慎使用。 |
执行以下命令查看终止策略。
- kubectl
- kbcli
kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster Delete Running 4m29s
kbcli cluster list mycluster -n demo
>
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mycluster demo Delete Running Sep 27,2024 11:42 UTC+0800
步骤
执行以下命令,删除集群。
- kubectl
- kbcli
kubectl delete cluster mycluster -n demo
如果想删除集群和所有相关资源,可以将终止策略修改为 WipeOut
,然后再删除该集群。
kubectl patch -n demo cluster mycluster -p '{"spec":{"terminationPolicy":"WipeOut"}}' --type="merge"
kubectl delete -n demo cluster mycluster
kbcli cluster delete mycluster -n demo