用 KubeBlocks 管理 Elasticsearch
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。
KubeBlocks 支持管理 Elasticsearch。本教程将演示如何通过 kubectl
或 YAML 文件创建并管理 Elasticsearch 集群。您可在 GitHub 仓库中查看相关 YAML 文件示例和指南。
开始之前
查看可用于创建集群的数据库类型和版本。
确保
elasticsearch
cluster definition 已安装。如果该 cluster definition 不可用,可参考相关文档启用。kubectl get clusterdefinition elasticsearch
>
NAME TOPOLOGIES SERVICEREFS STATUS AGE
elasticsearch Available 30m查看可用于创建集群的引擎版本。
kubectl get clusterversions -l clusterdefinition.kubeblocks.io/name=elasticsearch
为保证资源隔离,本教程将创建一个名为
demo
的独立命名空间。kubectl create namespace demo
创建集群
KubeBlocks 通过 Cluster
定义集群。以下是创建 Elasticsearch 集群的示例。Pod 默认分布在不同节点。但如果您只有一个节点可用于部署集群,可将 spec.affinity.topologyKeys
设置为 null
。
生产环境中,不建议将所有副本部署在同一个节点上,因为这可能会降低集群的可用性。
cat <<EOF | kubectl apply -f -
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
annotations:
kubeblocks.io/extra-env: '{"mdit-roles":"master,data,ingest,transform","mode":"multi-node"}'
labels:
app.kubernetes.io/instance: mycluster
app.kubernetes.io/version: 8.8.2
helm.sh/chart: elasticsearch-cluster-0.9.0
name: test
namespace: kubeblocks-cloud-ns
spec:
affinity:
podAntiAffinity: Required
topologyKeys:
- kubernetes.io/hostname
componentSpecs:
- componentDef: elasticsearch-8.8
disableExporter: true
name: mdit
replicas: 3
resources:
limits:
cpu: "1"
memory: 2Gi
requests:
cpu: "1"
memory: 2Gi
serviceAccountName: kb-mycluster
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
terminationPolicy: Delete
EOF
字段 | 定义 |
---|---|
spec.clusterDefinitionRef | 集群定义 CRD 的名称,用来定义集群组件。 |
spec.clusterVersionRef | 集群版本 CRD 的名称,用来定义集群版本。 |
spec.terminationPolicy | 集群的终止策略,默认值为 Delete ,有效值为 DoNotTerminate 、Halt 、Delete 和 WipeOut 。 - - - - |
spec.affinity | 为集群的 Pods 定义了一组节点亲和性调度规则。该字段可控制 Pods 在集群中节点上的分布。 |
spec.affinity.podAntiAffinity | 定义了不在同一 component 中的 Pods 的反亲和性水平。该字段决定了 Pods 以何种方式跨节点分布,以提升可用性和性能。 |
spec.affinity.topologyKeys | 用于定义 Pod 反亲和性和 Pod 分布约束的拓扑域的节点标签值。 |
spec.tolerations | 该字段为数组,用于定义集群中 Pods 的容忍,确保 Pod 可被调度到具有匹配污点的节点上。 |
spec.componentSpecs | 集群 components 列表,定义了集群 components。该字段允许对集群中的每个 component 进行自定义配置。 |
spec.componentSpecs.componentDefRef | 表示 cluster definition 中定义的 component definition 的名称,可通过执行 kubectl get clusterdefinition elasticsearch -o json \| jq '.spec.componentDefs[].name' 命令获取 component definition 名称。 |
spec.componentSpecs.name | 定义了 component 的名称。 |
spec.componentSpecs.disableExporter | 定义了是否开启监控功能。 |
spec.componentSpecs.replicas | 定义了 component 中 replicas 的数量。 |
spec.componentSpecs.resources | 定义了 component 的资源要求。 |
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
连接集群
Elasticsearch 通过 9200 端口提供 HTTP 协议供客户端访问,您可以通过本地主机访问集群。
curl http://127.0.0.1:9200/_cat/nodes?v
扩缩容
水平扩缩容
水平扩展改变 Pod 的数量。例如,您可以将副本从三个扩展到五个。
从 v0.9.0 开始,除了支持副本(replica)的扩缩容外,KubeBlocks 还支持了实例(instance)的扩缩容。可通过 水平扩缩容 文档了解更多细节和示例。
开始之前
确认集群状态是否为 Running
。否则,后续相关操作可能会失败。
kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster elasticsearch elasticsearch-8.8.2 Delete Running 47m
步骤
可通过以下两种方式实现水平扩缩容。
- OpsRequest
- 编辑集群 YAML 文件
对指定的集群应用 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
命令查看该运维操作的相关事件,协助排障。查看相应资源是否变更。
kubectl describe cluster mycluster -n demo
修改 YAML 文件中
spec.componentSpecs.replicas
的配置。spec.componentSpecs.replicas
定义了 pod 数量,修改该参数将触发集群水平扩缩容。kubectl edit cluster mycluster -n demo
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 # Change the amount
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
terminationPolicy: Delete查看相关资源是否变更。
kubectl describe cluster mycluster -n demo
处理快照异常
如果在水平扩容过程中出现 STATUS=ConditionsError
,你可以从 cluster.status.condition.message
中找到原因并进行故障排除。如下所示,该例子中发生了快照异常。
Status:
conditions:
- lastTransitionTime: "2024-04-25T17:40:26Z"
message: VolumeSnapshot/mycluster-elasticsearch-scaling-dbqgp: Failed to set default snapshot
class with error cannot find default snapshot class
reason: ApplyResourcesFailed
status: "False"
type: ApplyResources
原因
此异常发生的原因是未配置 VolumeSnapshotClass
。可以通过配置 VolumeSnapshotClass
解决问题。
但此时,水平扩容仍然无法继续运行。这是因为错误的备份(volumesnapshot 由备份生成)和之前生成的 volumesnapshot 仍然存在。需删除这两个错误的资源,KubeBlocks 才能重新生成新的资源。
步骤:
配置 VolumeSnapshotClass。
kubectl create -f - <<EOF
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-aws-vsc
annotations:
snapshot.storage.kubernetes.io/is-default-class: "true"
driver: ebs.csi.aws.com
deletionPolicy: Delete
EOF删除错误的备份和 volumesnapshot 资源。
kubectl delete backup -l app.kubernetes.io/instance=mycluster
kubectl delete volumesnapshot -l app.kubernetes.io/instance=mycluster
结果
删除备份和 volumesnapshot 后,水平扩容继续进行,集群恢复到 Running
状态。
垂直扩缩容
您可以通过更改资源需求和限制(例如 CPU 和存储)来实现集群垂直扩缩容。例如,您可以通过垂直扩缩容将资源类别从 1C2G 更改为 2C4G。
开始之前
检查集群状态是否为 Running
。否则,后续操作可能会失败。
kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster elasticsearch elasticsearch-8.8.2 Delete Running 47m
步骤
可通过以下两种方式实现垂直扩缩容。
- OpsRequest
- 修改集群 YAML 文件
对指定的集群应用 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
命令查看该运维操作的相关事件,协助排障。查看相应资源是否变更。
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: # Change the values of resources.
requests:
memory: "2Gi"
cpu: "1"
limits:
memory: "4Gi"
cpu: "2"
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
terminationPolicy: Delete查看相应资源是否变更。
kubectl describe cluster mycluster -n demo
磁盘扩容
开始之前
检查集群状态是否为 Running
。否则,后续操作可能会失败。
kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster elasticsearch elasticsearch-8.8.2 Delete Running 4m29s
步骤
可通过以下两种方式实现垂直扩缩容。
- OpsRequest
- 修改集群 YAML 文件
按需修改参数值,并执行以下命令。
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-volume-expansion
namespace: demo
spec:
clusterName: mycluster
type: VolumeExpansion
volumeExpansion:
- componentName: elasticsearch
volumeClaimTemplates:
- name: data
storage: "40Gi"
EOF查看磁盘扩容操作是否成功。
kubectl get ops -n demo
>
NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
demo ops-volume-expansion VolumeExpansion mycluster Succeed 3/3 6m如果有报错,可执行
kubectl describe ops -n demo
命令查看该运维操作的相关事件,协助排障。查看相应资源是否变更。
kubectl describe cluster mycluster -n demo
修改集群 YAML 文件中
spec.componentSpecs.volumeClaimTemplates.spec.resources
的值。spec.componentSpecs.volumeClaimTemplates.spec.resources
定义了 Pod 存储资源信息,修改该数值将触发集群磁盘扩容。kubectl edit cluster mycluster -n demo
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: 2
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi # Change the volume storage size.
terminationPolicy: Delete查看相应资源是否变更。
kubectl describe cluster mycluster -n demo
停止/启动集群
您可以停止/启动集群以释放计算资源。当集群停止时,其计算资源将被释放,也就是说 Kubernetes 的 Pod 将被释放,但其存储资源仍将被保留。如果你想恢复集群资源,可通过快照重新启动集群。
停止集群
- OpsRequest
- 修改集群 YAML 文件
执行以下命令,停止集群。
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: 20Gi
启动集群
- OpsRequest
- 修改集群 YAML 文件
执行以下命令启动集群。
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: 20Gi
重启集群
执行以下命令,重启集群。
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
查看该操作的事件,协助排障。