如何打patch使pod阶段进入Succeeded或Failed?

How to apply patch to make pod phase go to Succeeded or Failed?

这是我上一个问题的后续问题 - 之后我意识到,您只能从部署清单中修补容器规范,让控制器无缝地将补丁更改应用到 pods 通过它创建的 ReplicaSet。

现在我的问题是如何应用补丁使Pod阶段进入SucceededFailed。我知道例如要让 pod 阶段进入 Succeeded,所有容器都需要成功终止并且不应重新启动。我的意图是不修改容器镜像中的原始命令和参数,而是应用补丁来引入自定义命令,该命令将覆盖容器镜像中的命令。

所以我尝试对 运行 exit 0 做如下

kubectl -n foo-ns patch deployment foo-manager -p '
{
  "spec": {
    "template": {
      "spec": {
        "containers": [
          {
            "name": "container1",
            "command": [
              "exit",
              "0"
            ]
          },
          {
            "name": "container2",
            "command": [
              "exit",
              "0"
            ]
          }
        ]
      }
    }
  }
}'

但是由于我的容器文件系统层是从 FROM scratch 构建的,因此除了应该 运行 即 exit 作为构建的原始可执行文件之外,没有任何可用的本机命令-in 甚至不可用。

最好的方法是什么?通过修补 pod 使其过渡到这些 Pod 阶段中的任何一个。

how to apply patch to make the Pod phase to go to Succeeded or Failed

Pods 旨在 不可变 - 不要尝试更改它们 - 相反,将它们替换为新的 Pods。您可以创建 ReplicaSet directly, but mostly, you want to work with Deployment 来替换 Pod 模板上的每个更改的当前 ReplicaSet。

Basically I'm testing one of my custom controllers can catch a pod's phase (and act on it) when it is stuck in a certain state e.g. Pending

所有 Pods 都会经历这些状态。为了进行测试,您可以使用不同的二进制文件或参数直接创建 Pods

要测试 Pod 阶段 Pending,您可以在观看 Pod 时在控制器中记录 阶段?或者您可以模拟 pod - 使其处于 Pending 阶段?

我不知道 kubernetes-python-clientclient-go 确实有 Fake-clients 可以与 Pods, 包括 UpdateStatus.

func (c *FakePods) UpdateStatus(ctx context.Context, pod *corev1.Pod, opts v1.UpdateOptions) (*corev1.Pod, error)

现在,查看 Python 客户端,它似乎缺少此功能:Issue #524 fake client for unit testing