Kubernetes创建Deployment后始终不可用,Available值一直为0
嘿,我来帮你搞定这个头疼的问题~你的Deployment显示Available: 0,说明Pod已经被成功创建了(Current和Up-to-date都是1),但容器要么没通过健康检查,要么没法正常对外提供服务。结合你给出的yaml片段,我整理了几个最常见的排查方向和解决办法:
一、先查Pod的详细状态,找到核心问题
先跑这条命令看看Pod的具体情况,这是最快定位问题的方式:
kubectl describe pod <你的Pod名称>
重点盯这两个部分:
- Events区域:有没有报错?比如镜像拉不下来、启动命令错了、端口被占用之类的
- Containers区域:容器的
Ready状态是不是False?还有State是啥——是CrashLoopBackOff(反复崩溃重启),还是Running但没就绪?
二、检查就绪探针(Readiness Probe)配置
如果你的Deployment里没定义就绪探针,K8s默认觉得容器启动就就绪,但nginx有时候需要几秒初始化,或者内部服务没起来,就会导致Available一直是0。要是你定义了探针,得检查配置对不对:
比如正确的nginx就绪探针应该是这样的:
readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 # 给容器5秒初始化时间 periodSeconds: 5 # 每5秒检查一次
要是探针的路径写错了(比如你的nginx根目录不是/),或者端口填错,就会导致探针失败,Pod永远不会被标记为可用。
三、钻进容器看看nginx到底跑没跑
直接进到容器内部,手动验证nginx服务状态:
kubectl exec -it <Pod名称> -- /bin/bash
然后执行nginx -t检查配置文件有没有错,或者curl localhost:80看看能不能访问页面。要是nginx启动失败(比如配置文件语法错误),容器可能显示Running但实际服务没起来,自然没法就绪。
四、确认Service和Deployment的标签完全匹配
你的Service selector是app: website, tier: frontend,得确保Deployment的Pod模板里的labels和这个完全一致:
Deployment的spec.template.metadata.labels应该长这样:
labels: app: website tier: frontend
不过你说Service和Deployment创建都正常,这个问题概率不高,但还是确认一下更稳妥。
五、检查镜像是否靠谱
试试用官方的nginx:latest镜像测试,要是你用的是自定义镜像,得确认集群的节点能拉到这个镜像——要么镜像已经推到集群能访问的仓库,要么节点本地已经有这个镜像了。
给你一个完整的Deployment参考示例
要是你的Deployment缺了关键配置,这里给一个可以直接用的示例:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: frontend spec: replicas: 1 template: metadata: labels: app: website tier: frontend spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 # 就绪探针:确保容器能正常提供服务才标记为可用 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 3 periodSeconds: 5 # 存活探针:如果容器挂了就重启 livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 10 periodSeconds: 10
先从查Pod的describe输出开始,里面肯定会明确告诉你为什么Pod没被标记为可用,大概率是探针配置或者容器启动的问题~
内容的提问来源于stack exchange,提问作者davidb

