【问题标题】:How to restart a pod without a deployment in K8S?在 K8S 中如何在没有部署的情况下重启 Pod?
【发布时间】:2020-12-06 17:21:31
【问题描述】:

我使用这个命令helm install elasticsearch elastic/elasticsearch在K8S上部署了一个elasticsearch集群。

我可以看到 pod 正在运行:

$ kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
elasticsearch-master-0           0/1     Running   0          4m30s
kibana-kibana-5697fc485b-qtzzl   0/1     Running   0          130m

服务看起来也不错:

$ kubectl get services
NAME                            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
elasticsearch-master            ClusterIP   10.105.59.248   <none>        9200/TCP,9300/TCP   4m50s
elasticsearch-master-headless   ClusterIP   None            <none>        9200/TCP,9300/TCP   4m50s
kibana-kibana                   ClusterIP   10.104.31.124   <none>        5601/TCP            6d7h
kubernetes                      ClusterIP   10.96.0.1       <none>        443/TCP             10d

但是elasticsearch 没有deployment

$ kubectl get deployments
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
kibana-kibana   0/1     1            0           6d7h

我想重新启动 elasticsearch pod,并且我搜索了人们说要使用 kubectl scale deployment --replicas=0 来终止 pod。但是elasticsearch集群没有部署,这种情况下如何重启elasticsearch pod?

【问题讨论】:

  • 是否有匹配的 StatefulSet 代替? (这将生成像 statefulset-name-0 这样的名称。)由于它拥有 Pod,kubectl delete pod elasticsearch-master-0 将重新创建它,希望使用相同的支持数据。
  • StatefulSet 是什么意思?我怎样才能找到它?
  • StatefulSets 在 Kubernetes 文档中。有点像 Deployment,但可以为每个副本创建一个 PersistentVolumeClaim,并具有可预测的顺序 pod 名称。

标签: elasticsearch kubernetes


【解决方案1】:

elasticsearch-master-0 在 k8s 中使用 statefulsets.apps 资源。

statefulsetsapps 类似于 Deployment 对象,但 pod 的命名不同。 您应该删除 pod,然后 statefulsets 重新创建 pod。

    kubectl delete pods elasticsearch-master-0

【讨论】:

    【解决方案2】:

    我有一个技巧,可能不是正确的方法,但它有效。
    您可以简单地编辑正在运行的 pod 的配置以重新启动它,然后您可以替换旧的配置。
    让我通过一个例子来解释:
    这里我有一个busybox pod正在运行:

    $ kubectl get pods
    NAME    READY  STATUS   RESTARTS  AGE
    busybox  1/1   Running     0      30s
    

    现在,我将尝试编辑正在运行的 pod 的配置:

    kubectl edit pod busybox
    

    此命令将以可编辑模式打开配置数据,我将直接转到规范部分并假设我只是更新图像名称,如下所示:
    之前:

    spec:
      containers:
      - command:
        - sleep 1000
        image: busybox
        imagePullPolicy: Always
    

    将图片名称从busybox更新为busybox:latest :
    只需输入 i 进入插入模式并进行更改,然后 ESC 和 :wq 就像我们使用 vi/vim 编辑器一样。

    spec:
      containers:
      - command:
        - sleep 1000
        image: busybox:latest
        imagePullPolicy: Always
    

    输出应该是:

    $ kubectl edit pod busybox
    pod/busybox edited
    

    现在要查看更改,您只需输入以下命令即可查看事件:

    $ kubectl describe pod busybox
    

    在事件中你可以看到:容器busybox定义改变了, 将重新启动

    您可以查看重启次数:

    $ kubectl get pods
     NAME    READY  STATUS   RESTARTS  AGE
    busybox   1/1   Running     1      14m
    

    您可以看到重启次数为 1,您现在可以通过执行相同的编辑操作替换为原始图像名称。
    希望有所帮助!

    【讨论】:

    • 感谢您的回复。 @SAEED 为此提供了一个简单的解决方案。我对你的回答投了票,因为它非常详细,而且非常友善。再次感谢。
    • @Joey Yi Zhao 感谢您的支持,是的,SAEED 是正确的,如果您有一个用于该 elasticsearch pod 的 statefulset,那么杀死该 pod 最终将重新创建它。但是,我的方法只是在没有运行部署/状态集/复制控制器/副本集时重新启动 pod。
    猜你喜欢
    • 2020-06-02
    • 2019-12-24
    • 2018-12-30
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多