使用Kubernetes YAML部署至GCP无Pod创建问题排查
排查Kubernetes YAML部署无Pod/Deployment生成的问题
这种情况我之前踩过不少坑,大概率是YAML文件本身的疏漏或者部署细节没注意到,咱们一步步来定位问题:
1. 先确认部署命令是否正确执行
很多时候问题出在最基础的地方:
- 你是不是用了正确的命令部署整个YAML文件?比如是不是不小心只部署了Service部分?比如执行了
kubectl apply -f service-only.yaml而不是包含Deployment的完整文件? - 检查命令路径:比如你的YAML文件在
./k8s/目录下,你是不是忘记加路径,执行了kubectl apply -f deploy.yaml但当前目录不对? - 试试重新执行部署命令并仔细看输出:
kubectl apply -f your-full-config.yaml,如果有语法或校验错误,这里会直接提示。
2. 检查YAML文件的语法和核心配置
这是最常见的问题根源,Kubernetes对YAML的格式要求非常严格:
- 语法缩进错误:YAML必须用空格缩进(不能用Tab),如果Deployment的嵌套字段(比如
spec.template.spec.containers)缩进不对,会导致资源无法被解析,而Service因为结构简单可能正常创建。可以用yamllint your-file.yaml工具检查语法,或者直接复制到本地YAML校验工具验证。 - 资源类型/API版本错误:
kind字段大小写敏感!必须是kind: Deployment(首字母大写),如果写成kind: deployment会被集群忽略。- API版本不匹配:对于Kubernetes 1.24及以上版本,Deployment的
apiVersion必须是apps/v1,如果你用了旧的extensions/v1beta1或者apps/v1beta1,集群可能不识别这个资源类型,导致Deployment创建失败,但Service的apiVersion: v1是一直兼容的,所以会正常显示。
- 资源定义不完整:比如Deployment的
spec.selector和spec.template.metadata.labels不匹配(虽然这个问题会导致Deployment创建后Pod不启动,但如果你的YAML里完全没写selector,可能导致Deployment无法被创建)。
3. 查看Kubernetes事件和日志
如果部署命令没有明显报错,就去看集群的事件日志:
- 执行
kubectl get events,查看最近的事件记录,有没有类似FailedCreate、InvalidSpec或者ResourceNotFound的错误,这些会直接告诉你Deployment创建失败的原因。 - 如果你有权限查看API Server日志,可以检查有没有关于该Deployment的拒绝或错误记录,但一般
kubectl get events就能找到关键信息。
4. 对比手动生成的Deployment YAML
既然你用kubectl create deployment能正常创建,那把手动生成的YAML和你自己的文件对比,找差异:
- 执行命令生成标准Deployment YAML:
kubectl create deployment test-deploy --image=your-image-name --dry-run=client -o yaml > manual-deploy.yaml - 打开这个
manual-deploy.yaml,和你自己的YAML对比核心字段:apiVersion、kind、metadata、spec.selector、spec.template等,大概率能找到你自己的YAML里缺失或写错的地方。
5. 检查命名空间是否匹配
很容易忽略的一点:
- 你的YAML文件里是不是指定了
metadata.namespace: xxx?而你执行kubectl get all的时候默认看的是default命名空间? - 执行
kubectl get all -A查看所有命名空间的资源,确认Deployment和Pod是不是在其他命名空间里躺着。
6. 排查权限或准入控制器问题(可能性较低)
如果上面的都没问题,再考虑这个:
- 虽然你用手动命令能创建Deployment,但有没有可能你的YAML里包含了某些被集群准入控制器(比如OPA、PodSecurityPolicy)拦截的字段?比如设置了特权模式或者敏感挂载?
- 检查你的用户权限:执行
kubectl auth can-i create deployments,确认你有创建Deployment的权限。
总结
先从部署命令和YAML语法入手,这两个地方90%的概率能找到问题;然后看事件日志和命名空间,最后对比标准YAML,基本就能解决你的问题了。
内容的提问来源于stack exchange,提问作者Ping
相关产品推荐
相关产品推荐

