个人名片
作者简介:java领域优质创作者
个人主页:码农阿豪
工作室:新空间代码工作室(提供各种软件服务)
个人邮箱:[[email protected]]
个人微信:15279484656
个人导航网站:www.forff.top
座右铭:总有人要赢。为什么不能是我呢?
码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用
Redis专栏:Redis从零到一学习分享,经验总结,案例实战
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有
Kubernetes(k8s)作为容器编排的事实标准,广泛应用于云原生场景。然而,在实际运维中,我们经常会遇到各种Pod创建失败的问题,其中“Failed to create pod sandbox”是一个典型的错误。
本文将以一个实际的错误案例为基础,深入分析其根本原因,并提供详细的排查思路和解决方案。同时,我们也会结合Java代码示例,展示如何在应用程序中优雅地处理类似的Kubernetes API错误。
以下是用户遇到的错误日志:
Failed to create pod sandbox in underlay (will retry): pod:eks-m6ytl31y EKSError,Code : -120000 , Msg : TRADE_COMMON_ERROR, err : RequestInvokeError,Code : 500119 , Msg : order center logic error[call order-center error:get redis error][seqId:ye4jtmp9-zo1q-nhlk-r5jo-nwrhi
我们可以拆解关键信息:
Failed to create pod sandbox in underlay
EKSError, Code: -120000
order center logic error
和 get redis error
seqId: ye4jtmp9-zo1q-nhlk-r5jo-nwrhi
kubelet
、containerd
或dockershim
崩溃。Kubernetes会自动重试,但可以手动触发:
kubectl delete pod <pod-name> --force --grace-period=0
查看网络插件是否正常:
kubectl logs -n kube-system <cni-pod-name>
在问题节点上执行:
# 检查kubelet状态
systemctl status kubelet
# 检查容器运行时(containerd/docker)
systemctl status containerd
提供完整的错误日志(包括seqId
),要求排查订单系统和Redis问题。
如果你的应用通过Kubernetes Java Client(如io.fabric8:kubernetes-client
)管理Pod,可以捕获并处理类似错误:
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.PodBuilder;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientException;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
public class K8sPodManager {
public static void createPodWithRetry(String namespace, String podName) {
KubernetesClient client = new DefaultKubernetesClient();
int maxRetries = 3;
int retryCount = 0;
while (retryCount < maxRetries) {
try {
Pod pod = new PodBuilder()
.withNewMetadata()
.withName(podName)
.endMetadata()
.withNewSpec()
.addNewContainer()
.withName("nginx")
.withImage("nginx:latest")
.endContainer()
.endSpec()
.build();
client.pods().inNamespace(namespace).create(pod);
System.out.println("Pod created successfully!");
break;
} catch (KubernetesClientException e) {
retryCount++;
System.err.println("Failed to create pod (Attempt " + retryCount + "): " + e.getMessage());
if (retryCount >= maxRetries) {
System.err.println("Max retries reached. Giving up.");
throw e;
}
// Exponential backoff
try {
Thread.sleep(1000 * retryCount);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
}
client.close();
}
public static void main(String[] args) {
createPodWithRetry("default", "test-pod");
}
}
KubernetesClientException
时进行重试。✅ 监控云平台服务状态:如AWS CloudWatch、阿里云ARMS。
✅ 设置合理的Pod资源配额:避免IP或计算资源耗尽。
✅ 在代码中实现重试逻辑:如Java示例所示,提高容错能力。
✅ 定期检查Kubernetes组件健康状态:如kubelet
、containerd
、CNI插件。
Kubernetes Pod创建失败可能由多种因素导致,从云平台内部错误到本地网络配置问题。本文通过一个具体案例,详细介绍了排查思路和解决方案,并提供了Java代码示例,帮助开发者更好地管理Kubernetes资源。
如果你遇到类似问题,建议:
kubelet
、CNI插件)。希望本文对你有所帮助!欢迎在评论区分享你的Kubernetes故障排查经验。