【发布时间】:2020-04-15 23:52:43
【问题描述】:
我有一个奇怪的环境,我目前无法将 k8s pod 日志写入日志服务(loggly、相扑等)。有时,其中一个 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 进行部署,因此没有像示例中那样的运行标签,但我确实有服务选择器部分和 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。
【问题讨论】:
-
不完全是。我使用 HELM 分发,因此实际上没有运行标签。更新帖子。
-
如果您使用的是StatefulSet,则需要更改
statefulset.kubernetes.io/pod-name: pod-name