首页 > 解决方案 > 隔离 pod 并创建替换

问题描述

我有一个奇怪的环境,我目前无法将 k8s pod 日志写入日志服务(loggly、sumo 等)。有时,其中一个 pod 开始在 prod 中出现问题,解决方法是删除该 pod 并替换它,由运营团队管理(我没有直接访问权限)。

我想做的是保存有问题的 pod,不再有流量路由到它并被控制器替换。这样我就可以挖掘 pod 和日志来确定发生了什么。

我在这里查看了标签:https ://kubernetes.io/docs/concepts/configuration/overview/

重要的部分是这个

您可以操纵标签进行调试。因为 Kubernetes 控制器(例如 ReplicaSet)和服务使用选择器标签与 Pod 匹配,所以从 Pod 中删除相关标签将阻止它被控制器考虑或被服务提供流量。如果您删除现有 Pod 的标签,其控制器将创建一个新 Pod 来代替它。这是在“隔离”环境中调试以前“活动”Pod 的有用方法。要以交互方式删除或添加标签,请使用 kubectl label。

我已经进入并直接使用以下方法编辑了 pod:

kubectl edit <pod> 

然后完全删除标签部分并保存。

当我这样做时,尽管似乎什么也没发生。据我检查,吊舱仍然存在并且没有被更换:

kubectl get pods

它是否移动到我没有看到的地方?删除标签是否应该像我期望的那样工作(控制器创建一个新的 pod 来代替它)?

任何帮助,将不胜感激。谢谢。

编辑1:

按照 mdaniel 的帖子中的建议从 pod 中移除或更改标签不会移除 pod 并启动替换。

我正在使用 Helm 进行部署,因此没有像示例中那样的 Run 标签,但我确实有服务选择器部分和 pod 标签设置,如下所示:

服务选择器 yaml 部分:

 selector:
    app.kubernetes.io/instance: foo
    app.kubernetes.io/name: bar

Pod 标签部分:

  labels:
    app.kubernetes.io/instance: foo
    app.kubernetes.io/name: bar
    controller-revision-hash: some-hash
    statefulset.kubernetes.io/pod-name: pod-name

我将 Pod Label 部分更改为:

  labels:
    app.kubernetes.io/instance: i-am-debugging-this-pod
    app.kubernetes.io/name: i-am-debugging-this-pod
    controller-revision-hash: some-hash
    statefulset.kubernetes.io/pod-name: pod-name

然后……什么都没有发生。吊舱只是不停地咕咕叫。看起来它应该工作,但是nada。

标签: kuberneteskubernetes-pod

解决方案


两个答案。一个是你可以用你的准备探测来做到这一点。二,删除的 pod 日志无论如何都会保留一段时间,所以也许只使用那些?对 kubectl 日志使用 -p 选项。


推荐阅读