kubernetes - 隔离 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。
解决方案
两个答案。一个是你可以用你的准备探测来做到这一点。二,删除的 pod 日志无论如何都会保留一段时间,所以也许只使用那些?对 kubectl 日志使用 -p 选项。
推荐阅读
- error-handling - 带有未定义索引的 php 文件中的错误,我已经尝试了一切
- angular - 重置 Angular 表单的更简洁方法
- node.js - 如何在 Gitlab CI 中使用用户名和密码将 Mongo 服务 URI 设置为变量?
- java - Java Crypto AES/GCM/NoPadding 适用于 Windows 但不适用于 Docker (AEADBadTagException)
- monad-transformers - 如何调用依赖于 Kotlin/Arrow 中多个类型类的多态函数
- python - 如何编辑列表的整数?
- clojure - 有没有办法从 clojure 映射创建 java 对象?
- python - 我们可以用纯 Python urllib 登录一个网站,修改一些表单值,然后提交吗?(没有 Selenium 浏览器自动化)
- algorithm - 错误 void 无法转换为 java.lang.Integer[]
- ruby - Docker 撰写文件共享 MacOS Catalina - Docker 不知道卷