【问题标题】:How can I restart Elasticsearch K8S deployment如何重新启动 Elasticsearch K8S 部署
【发布时间】:2022-01-23 07:00:04
【问题描述】:

我将 Elasticsearch 集群部署到 EKS,以下是规范

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: elk
spec:
  version: 7.15.2
  serviceAccountName: docker-sa
  http:
    tls:
      selfSignedCertificate:
        disabled: true
  nodeSets:
  - name: node
    count: 3
    config:
  ...

我可以看到它已正确部署并且所有 pod 都在运行。

$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
elk-es-node-0                1/1     Running   0          19h
elk-es-node-1                1/1     Running   0          19h
elk-es-node-2                1/1     Running   0          11h

但是我无法重启部署Elasticsearch

$ kubectl rollout restart Elasticsearch elk-es-node
Error from server (NotFound): elasticsearches.elasticsearch.k8s.elastic.co "elk-es-node" not found

Elasticsearch 正在使用statefulset,所以我尝试重新启动statefulset

$ kubectl rollout restart statefulset elk-es-node
statefulset.apps/elk-es-node restarted

上述命令显示restarted,但实际的 pod 并未重新启动。

在 K8S 中重新启动自定义种类的正确方法是什么?

【问题讨论】:

  • 它将是kubectl rollout restart <statefulset name>,假设它创建了一个有状态集。检查kubectl get statefulset
  • 是的,你是对的,它是有状态的。但是我怎么知道它是 statefulset 还是 deployment?
  • describe pod 输出中的“控制者”。部署将指向一个副本集。
  • 我尝试重新启动 statefulset,命令响应显示成功,但 pod 没有重新启动。我添加了有关问题的详细信息。
  • 检查 statefulset 的升级策略。如果设置为 onDelete: kubernetes.io/docs/concepts/workloads/controllers/statefulset/…,则推出重启可能不起作用

标签: elasticsearch kubernetes


【解决方案1】:

使用 - kubectl get all

要确定创建的资源是部署还是有状态集 - 如果您在特定命名空间中工作,请使用 -n <namespace"> 和上述命令。

假设,您正在使用 statefulset,下面的命令来了解配置它的属性。

kubectl get statefulset <statefulset-name"> -o yaml > statefulsetContent.yaml

  • 这将在同一目录中创建一个名为 statefulsetContent.yaml 的 yaml 文件。
  • 您可以使用它来探索 statefulset 中配置的不同选项。

在 yaml 文件中检查 .spec.updateStrategy。基于此我们可以确定它的更新策略。

以下来自official documentation

有两个可能的值:

  • OnDelete

当 StatefulSet 的 .spec.updateStrategy.type 设置为 OnDelete 时,StatefulSet 控制器不会自动更新 StatefulSet 中的 Pod。用户必须手动删除 Pod 以使控制器创建反映对 StatefulSet 的 .spec.template 所做修改的新 Pod。

  • 滚动更新

RollingUpdate 更新策略实现了 StatefulSet 中 Pod 的自动滚动更新。这是默认的更新策略。

作为一种变通方法,您可以尝试缩小/放大statefulset

kubectl scale sts <statefulset-name"> --replicas=<count">

【讨论】:

    【解决方案2】:

    使用 ECK 作为操作符,您无需使用 rollout restart。应用您更新的 Elasticsearch 规范,操作员将为您执行滚动更新。如果出于任何原因需要重新启动 pod,请使用 kubectl delete pod <es pod> -n <your es namespace> 删除该 pod,操作员将为您启动新的。

    【讨论】:

    • 我尝试更新规范,但它并不总是重新启动。如果我使用delete,它会滚动更新重启吗?
    • 如果它不重新启动意味着您所做的更改不需要一个。删除不是滚动重启。通常,只有当 ES pod 导致 ES 集群出现问题时,您才会删除它。
    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多