当手动调用 exec 命令返回成功代码时,为什么 kubernetes 就绪性探测会失败?

当手动调用 exec 命令返回成功代码时,为什么 kubernetes 就绪性探测会失败?

我使用 kubeadm 在同一 LAN 上部署了一个裸机集群,该集群包含一个控制平面节点和一个工作节点。初始化集群后(kubeadm init在 cp 和kubeadm join工作节点上),我通过 helm 安装了 calico。calico-node 和 calico-kube-controllers pod 未达到就绪状态。但是,它们似乎运行正常,如果我手动调用存活和就绪探测执行的命令,我会得到预期的成功响应。我可能遇到了 calico 特有的问题,但我的直接问题是,什么可能导致就绪探测出现这种行为?

输出kubectl describe pod -n calico-system calico-node-xxxx

Events:
  Type     Reason     Age                    From     Message
  ----     ------     ----                   ----     -------
  Warning  Unhealthy  5s (x7 over 43s)  kubelet  Readiness probe errored: rpc error: code = Unknown desc = command error: EOF, stdout: , stderr: , exit code -1

calico-node-xxxx pods yaml 中的探测配置:

    readinessProbe:
      exec:
        command:
        - /bin/calico-node
        - -felix-ready
      failureThreshold: 3
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 5
    livenessProbe:
      failureThreshold: 3
      httpGet:
        host: localhost
        path: /liveness
        port: 9099
        scheme: HTTP
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 10

当我尝试时kubectl exec -n calico-system calico-node-xxxx -- /bin/calico-node -felix-ready && echo "$?",我可以看到退出代码为 0,表示成功。同样,curl localhost:9099/liveness它得到了 200 代码和预期响应。即使我在创建 pod 后一秒钟内执行命令,情况也是如此,所以我怀疑它与失败阈值或超时秒等有关。我对命令如何exec实际被调用以进行就绪探测的理解不太清楚,所以也许解释一下它与 有何不同会给kubectl exec我指明正确的方向?

谢谢。

答案1

啊,有点难以追踪,这是 cri-o 中的错误https://github.com/cri-o/cri-o/issues/6184因为我从 ubuntu repo 中下载了过时的 conmon 版本。更新 conmon 解决了这个问题。

相关内容