• k8s | 重启Kubernetes Pod的几种方式


    前言

    在使用 docker 的过程中,我们可以使用docker restart {container_id}来重启容器,但是在 kubernetes 中并没有重启命令(没有 kubectl restart {podname}),有时候我们的 Pod 出现 Bug意外终止,导致我们需要重启 Pod ,却没有一个很好的方式,特别是没有 yaml 文件的情况下,所以本文总结了以下几种重启 Pod 的方式。

    方法 1

    有最新的 yaml 文件。

    在有 yaml 文件的情况下可以直接使用kubectl replace --force -f xxxx.yaml来强制替换Pod 的 API 对象,从而达到重启的目的。

    方法 2

    没有 yaml 文件,但是使用的是 Deployment 对象。

    kubectl scale deployment esb-admin --replicas=0 -n {namespace}
    kubectl scale deployment esb-admin --replicas=1 -n {namespace}
    

    由于 Deployment 对象并不是直接操控的 Pod 对象,而是操控的 ReplicaSet 对象,而 ReplicaSet 对象就是由副本的数目的定义和Pod 模板组成的。所以这条命令分别是将ReplicaSet 的数量 scale 到 0,然后又 scale 到 1,那么 Pod 也就重启了。

    方法 3

    同样没有 yaml 文件,但是使用的是 Deployment 对象。

    使用命令kubectl delete pod {podname} -n {namespace}

    这个方法就很简单粗暴了,直接把 Pod 删除,因为 Kubernetes 是声明式 API,所以删掉了之后,Pod API 对象就与预期的不一致了,所以会自动重新创建 Pod 保持与预期一致,但是如果ReplicaSet 管理的 Pod 对象很多的话,那么要一个个手动删除,会很麻烦,所以可以使用kubectl delete replicaset {rs_name} -n {namespace}命令来删除 ReplicaSet

    方法 4

    没有 yaml 文件,直接使用的 Pod 对象。

    使用命令kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -

    在这种情况下,由于没有 yaml 文件,且启动的是 Pod 对象,那么是无法直接删除或者 scale 到 0 的,但可以通过上面这条命令重启。这条命令的意思是 get 当前运行的 pod 的 yaml声明,并管道重定向输出到 kubectl replace命令的标准输入,从而达到重启的目的。

    总结

    我们可以通过多种方式来重启对象,总的来说,最推荐的方式是使用kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -这种方式,因为适用于多种对象。此外,重启 Pod 并不会修复运行程序的 bug,想要解决程序的意外终止,最终还是得要修复 bug。

    Top
    收藏
    关注
    评论
  • 相关阅读:
    C#知识点总结系列:5、CLR的组成和运转
    SQL知识整理三:变量、全局变量、视图、事务、异常
    SQL知识整理二:锁、游标、索引
    SQL知识整理一:触发器、存储过程、表变量、临时表
    TFS二次开发系列:六、TFS的版本控制
    TFS二次开发系列:五、工作项查询
    TFS二次开发系列:四、TFS二次开发WorkItem添加和修改、保存
    TFS二次开发系列:三、TFS二次开发的第一个实例
    TFS二次开发系列:二、TFS的安装
    TFS二次开发系列:一、TFS体系结构和概念
  • 原文地址:https://www.cnblogs.com/JasonCeng/p/15747477.html
Copyright © 2020-2023  润新知