每位工程师都会遇到的 10 个 Kubernetes 问题(及解决方法)【转】

news/2025/11/17 14:54:21/文章来源:https://www.cnblogs.com/paul8339/p/19232792

Kubernetes 看起来简单 - 直到它崩溃。

无论您部署了多少次,Kubernetes 总是能找到方法来考验您的耐心。

Pod 被卡住。容器崩溃。服务消失。

本文梳理了 10 个最常见的 Kubernetes 问题,它们的原因,最重要的是 - 如何快速解决它们。

无论您是新接触 K8s 还是运行生产集群,请收藏这篇文章 - 它将为您节省数小时的调试时间。

问题 1:Pod 处于 Pending 状态

我还记得我的第一个“Pending”Pod - 我认为 Kubernetes 坏了。

原来,我的节点没有足够的资源。

我花了数小时挖掘,才发现只是缺少 CPU 请求。

症状

  • Pod 状态显示“Pending”
  • 应用程序无法启动

可能的原因和解决方案

  1. 资源不足
# 检查节点资源
kubectl describe nodes
kubectl top nodes
# 检查 Pod 事件
kubectl describe pod <pod-name># 查找“Insufficient cpu”或“Insufficient memory”错误# 解决方案:添加更多节点或减少资源请求
  1. PVC 未绑定
# 检查 PVC 状态
kubectl get pvc# 检查 PV 可用性
kubectl get pv# 解决方案:创建 PV 或修复 PVC 配置
  1. 没有匹配的节点
# 检查节点标签
kubectl get nodes --show-labels# 检查 Pod nodeSelector
kubectl get pod <pod-name> -o yaml | grep -A5 nodeSelector# 解决方案:标记节点或删除 nodeSelector
kubectl label nodes <node-name> key=value
  1. Taints 和 Toleration
# 检查节点 Taints
# kubectl describe node <node-name> | grep Taintstolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"

问题 2:Pod 处于 CrashLoopBackOff 状态

我曾经重新部署了一个微服务五次,以为它会神奇地工作。

每次它都崩溃了。

罪魁祸首?一个指向死端点的错误环境变量。

Kubernetes 像忠诚的看门犬一样不断重启它。

症状

  • Pod 不断重启
  • 状态显示“CrashLoopBackOff”

故障排除步骤

# 检查 Pod 日志
kubectl logs <pod-name>
kubectl logs <pod-name> --previous  # 之前实例# 检查 Pod 事件
kubectl describe pod <pod-name># 检查资源限制
kubectl describe pod <pod-name> | grep -A10 Limits# 检查容器退出代码
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].lastState.terminated.exitCode}'

常见原因

1. 应用程序错误

  • 检查日志中的应用程序错误
  • 修复应用程序代码或配置

2. 缺少依赖项

# 添加 init 容器等待依赖项
initContainers:
- name: wait-for-db
  image: busybox
  command: ['sh', '-c', 'until nc -z postgres-service 5432; do sleep 2; done']

3. 命令/参数错误

# 验证 Pod 规范中的命令
kubectl get pod <pod-name> -o yaml | grep -A5 command

4. liveness 探测失败

# 调整探测时间
livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 60  # 增加延迟
  periodSeconds: 10
  failureThreshold: 3

问题 3:服务不可访问

这个问题困扰了我几个小时。

一切看起来都正常 - Pod、服务、端点。

但我的应用无法连接。

原来,我在 Service YAML 中使用了错误的 targetPort

从那以后,我变得对 YAML 进行三重检查。

症状

  • 无法从集群内部或外部访问服务
  • 连接超时或被拒绝

故障排除步骤

# 1. 验证服务存在
kubectl get svc <service-name>
# 2. 检查服务端点

kubectl get endpoints <service-name>
# 如果为空,selector 与任何 Pod 都不匹配
# 3. 验证 Pod 标签

kubectl get pods --show-labels
# 4. 从集群内部测试

kubectl run test-pod --image=busybox --rm -it -- wget -O- <service-name>:<port>
# 5. 检查服务类型

kubectl describe svc <service-name>
# 6. 对于 NodePort,检查节点端口是否可访问

kubectl get svc <service-name> -o jsonpath='{.spec.ports[0].nodePort}'
# 7. 检查 NetworkPolicy

kubectl get networkpolicy
kubectl describe networkpolicy <policy-name>
# 8. 检查 DNS

kubectl run test-dns --image=busybox --rm -it -- nslookup <service-name>

解决方案

  1. 修复标签选择器
# 确保服务选择器与 Pod 标签匹配
selector:
  app: myapp  # 必须匹配 Pod 标签
  1. 检查目标端口
ports:
- port: 80          # 服务端口
  targetPort: 8080  # 必须匹配容器端口
  1. 验证防火墙规则(对于 NodePort/LoadBalancer):
# 检查安全组/防火墙规则是否允许流量

问题 4:高内存/CPU 使用率

我还记得我们早期的生产部署,一半的 Pod 不断被 OOMKilled。仪表盘上一切看起来都正常,但日志却讲述了另一个故事 - 我们的 Node.js 应用程序在吞噬内存。

原来,我们从未设置资源限制。集群在呼救,但我们没有倾听。

通过 kubectl top pods 设置适当的 requests 和 limits,启用 Vertical Pod Autoscaler (VPA),情况发生了翻天覆地的变化。

症状

  • Pod 被 OOMKilled
  • 性能下降
  • 节点压力大

故障排除

# 检查资源使用情况
kubectl top pods
kubectl top nodes# 检查 Pod 资源限制
kubectl describe pod <pod-name> | grep -A10 Limits# 检查 OOMKilled 事件
kubectl get events --field-selector reason=OOMKilled# 查看详细的 Pod 指标
kubectl describe node <node-name>

解决方案

  1. 增加资源限制
resources:
  requests:
    memory: "256Mi"
    cpu: "500m"
  limits:
    memory: "512Mi"
    cpu: "1000m"
  1. 实施资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-quota
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
  1. 设置限制范围
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
      cpu: 500m
    defaultRequest:
      memory: 256Mi
      cpu: 250m
    type: Container
  1. 启用垂直 Pod 自动扩展器 (VPA)
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: myapp-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  updatePolicy:
    updateMode: "Auto"

问题 5:ImagePullBackOff / ErrImagePull

这个在我周末部署期间咬了我一口(当然)。新的镜像,新的标签,一切看起来都准备好了 - 除了 Pod 从未启动。

“ImagePullBackOff” 状态像地狱般的错误信息一样盯着我。

20 分钟的恐慌后,我发现罪魁祸首是标签名称错误 - 有人在构建推送时打错了。

一旦修复,一切就立即启动起来。

现在,我总是运行 kubectl describe pod <pod-name> 并仔细检查注册表凭据和标签。因为没有什么比镜像标签中的冒号错误更能破坏部署信心。

症状

  • Pod 处于 ImagePullBackOff 状态
  • 无法拉取容器镜像

故障排除

# 检查 Pod 事件
kubectl describe pod <pod-name># 常见错误消息:
# - "image not found"
# - "unauthorized"
# - "manifest unknown"

解决方案

  1. 验证镜像名称
# 检查镜像名称和标签
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[0].image}'
  1. 检查镜像拉取密钥(对于私有注册表):
# 创建密钥
kubectl create secret docker-registry regcred \
  --docker-server=<registry-url> \
  --docker-username=<username> \
  --docker-password=<password># 添加到 Pod 规范
imagePullSecrets:
- name: regcred
  1. 检查镜像拉取策略
containers:
- name: app
  image: myapp:latest
  imagePullPolicy: Always  # 或 IfNotPresent, Never

问题 6:DNS 解析失败

一个阳光明媚的早晨,服务开始神秘地失败。API 无法访问数据库,日志充满了“未知主机”错误 - 混乱不堪。

起初,我怀疑是应用程序的问题,但一切正常。然后我突然想到,CoreDNS 可能崩溃了。

果然,kubectl logs -n kube-system -l k8s-app=kube-dns 显示了一个崩溃循环。重启 CoreDNS 并修复了一个小的配置错误,集群恢复了生机。

那天我学到:当一切都同时崩溃时,从 DNS 开始 - 它总是 DNS。

症状

  • Pod 无法解析服务名称
  • “nslookup: 无法解析”错误

故障排除

# 1. 检查 CoreDNS Pod
kubectl get pods -n kube-system -l k8s-app=kube-dns# 2. 检查 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns# 3. 测试 DNS 解析
kubectl run test-dns --image=busybox --rm -it -- nslookup kubernetes.default# 4. 检查 DNS 服务
kubectl get svc -n kube-system kube-dns# 5. 检查 Pod DNS 配置
kubectl get pod <pod-name> -o yaml | grep -A10 dnsPolicy

解决方案

  1. 重启 CoreDNS
kubectl rollout restart deployment/coredns -n kube-system
  1. 检查 CoreDNS ConfigMap
kubectl get configmap coredns -n kube-system -o yaml
  1. 设置 DNS 策略
spec:
  dnsPolicy: ClusterFirst  # 或 Default, ClusterFirstWithHostNet
  dnsConfig:
    nameservers:
    - 8.8.8.8
    searches:
    - default.svc.cluster.local
    - svc.cluster.local
    - cluster.local

问题 7:持久卷问题

一个周五部署,我的 PVC 被卡在 Pending 状态。数小时后,我发现罪魁祸首 - 存储类不匹配

快速修复 PVC 和 PV 名称的匹配问题,一切立即挂载。

从那以后,我在每次部署前都会仔细检查存储配置。是细节破坏大事。

症状

  • PVC 处于 Pending 状态
  • Pod 无法挂载卷
  • Pod 重新启动后数据丢失

故障排除

# 检查 PVC 状态
kubectl get pvc# 检查 PV 状态
kubectl get pv# 描述 PVC
kubectl describe pvc <pvc-name># 检查存储类
kubectl get storageclass# 检查 Pod 事件
kubectl describe pod <pod-name>

解决方案

  1. PVC 未绑定
# 确保匹配存储类
kubectl get pvc <pvc-name> -o yaml | grep storageClassName
kubectl get pv -o yaml | grep storageClassName# 检查访问模式匹配
# PVC: ReadWriteOnce, ReadOnlyMany, ReadWriteMany
# PV 必须支持相同的访问模式
  1. 手动 PV 绑定
apiVersion: v1
kind: PersistentVolume
metadata:
  name: manual-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  claimRef:
    name: my-pvc
    namespace: default
  1. 修复卷挂载错误
# 检查挂载路径冲突
# 确保容器用户有权限
# 验证节点上的卷存在(对于 hostPath)

问题 8:网络连接问题

Pod 健康但无法相互通信 — 纯粹的沉默。原来有人应用了一个 NetworkPolicy 阻断了所有流量。

临时允许入站流量后,事情又恢复了正常。

学到的教训:当 Pod 互相“消失”时,归咎于网络。

症状

  • Pod 无法相互通信
  • 外部流量无法到达 Pod

故障排除

# 1. 检查 Pod IP
kubectl get pod <pod-name> -o wide# 2. 测试 Pod 到 Pod 连接性
kubectl exec <source-pod> -- ping <destination-pod-ip># 3. 检查 NetworkPolicy
kubectl get networkpolicy# 4. 检查 CNI 插件
kubectl get pods -n kube-system | grep -E 'calico|flannel|weave|cilium'# 5. 检查 kube-proxy
kubectl get pods -n kube-system | grep kube-proxy
kubectl logs -n kube-system <kube-proxy-pod>

解决方案

  1. 修复 NetworkPolicy
# 允许所有入站流量(用于测试)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - {}
  1. 重启 CNI 插件
# 示例:Calico
kubectl rollout restart daemonset/calico-node -n kube-system

问题 9:证书/TLS 问题

我们的 HTTPS 突然毫无预兆地停止工作了。原因?过期的 TLS 证书在一个被遗忘的密钥中。

重新创建证书并使用 cert-manager 自动续订。永远不会再手动追逐到期日期。

症状

  • HTTPS 无法工作
  • 证书验证错误
  • Ingress TLS 失败

故障排除

# 检查密钥
kubectl get secret <tls-secret> -o yaml# 验证证书
kubectl get secret <tls-secret> -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text# 检查 Ingress TLS 配置
kubectl describe ingress <ingress-name>

解决方案

  1. 创建正确的 TLS 密钥
kubectl create secret tls <secret-name> --cert=path/to/cert.crt --key=path/to/key.key
  1. 使用 Cert-Manager(自动证书管理):
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml

问题 10:节点问题

在高流量期间,一个 Node NotReady 警报突然出现。kubelet 因 磁盘压力 而崩溃。

释放空间,重启 kubelet,解除节点的封锁。现在我像日常卫生一样对待节点清理 - 如果跳过一次,就会带来混乱。

症状

  • 节点状态 NotReady
  • Pod 无法调度
  • 节点压力条件

故障排除

# 检查节点状态
kubectl get nodes# 描述节点
kubectl describe node <node-name># 检查 kubelet 状态(在节点上)
systemctl status kubelet# 检查 kubelet 日志(在节点上)
journalctl -u kubelet -f

常见节点条件

  • MemoryPressure:节点内存不足
  • DiskPressure:节点磁盘空间不足
  • PIDPressure:进程过多
  • NetworkUnavailable:网络未配置

解决方案

  1. MemoryPressure
# 驱逐 Pod,添加内存或添加节点
kubectl drain <node-name> --ignore-daemonsets
  1. DiskPressure
# 在节点上清理
docker system prune -a  # 如果使用 Docker
crictl rmi --prune      # 如果使用 containerd
  1. 重启 Kubelet
systemctl restart kubelet
  1. 解除节点封锁
kubectl uncordon <node-name>

 

转自

https://mp.weixin.qq.com/s/xVD9qbKwvpkqbac7qUogqw

Kubernetes 看起来简单 - 直到它崩溃。

无论您部署了多少次,Kubernetes 总是能找到方法来考验您的耐心。

Pod 被卡住。容器崩溃。服务消失。

本文梳理了 10 个最常见的 Kubernetes 问题,它们的原因,最重要的是 - 如何快速解决它们。

无论您是新接触 K8s 还是运行生产集群,请收藏这篇文章 - 它将为您节省数小时的调试时间。

问题 1:Pod 处于 Pending 状态

我还记得我的第一个“Pending”Pod - 我认为 Kubernetes 坏了。

原来,我的节点没有足够的资源。

我花了数小时挖掘,才发现只是缺少 CPU 请求。

症状

  • Pod 状态显示“Pending”
  • 应用程序无法启动

可能的原因和解决方案

  1. 资源不足
# 检查节点资源
kubectl describe nodes
kubectl top nodes
# 检查 Pod 事件
kubectl describe pod <pod-name># 查找“Insufficient cpu”或“Insufficient memory”错误# 解决方案:添加更多节点或减少资源请求
  1. PVC 未绑定
# 检查 PVC 状态
kubectl get pvc# 检查 PV 可用性
kubectl get pv# 解决方案:创建 PV 或修复 PVC 配置
  1. 没有匹配的节点
# 检查节点标签
kubectl get nodes --show-labels# 检查 Pod nodeSelector
kubectl get pod <pod-name> -o yaml | grep -A5 nodeSelector# 解决方案:标记节点或删除 nodeSelector
kubectl label nodes <node-name> key=value
  1. Taints 和 Toleration
# 检查节点 Taints
# kubectl describe node <node-name> | grep Taintstolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"

问题 2:Pod 处于 CrashLoopBackOff 状态

我曾经重新部署了一个微服务五次,以为它会神奇地工作。

每次它都崩溃了。

罪魁祸首?一个指向死端点的错误环境变量。

Kubernetes 像忠诚的看门犬一样不断重启它。

症状

  • Pod 不断重启
  • 状态显示“CrashLoopBackOff”

故障排除步骤

# 检查 Pod 日志
kubectl logs <pod-name>
kubectl logs <pod-name> --previous  # 之前实例# 检查 Pod 事件
kubectl describe pod <pod-name># 检查资源限制
kubectl describe pod <pod-name> | grep -A10 Limits# 检查容器退出代码
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].lastState.terminated.exitCode}'

常见原因

1. 应用程序错误

  • 检查日志中的应用程序错误
  • 修复应用程序代码或配置

2. 缺少依赖项

# 添加 init 容器等待依赖项
initContainers:
- name: wait-for-db
  image: busybox
  command: ['sh', '-c', 'until nc -z postgres-service 5432; do sleep 2; done']

3. 命令/参数错误

# 验证 Pod 规范中的命令
kubectl get pod <pod-name> -o yaml | grep -A5 command

4. liveness 探测失败

# 调整探测时间
livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 60  # 增加延迟
  periodSeconds: 10
  failureThreshold: 3

问题 3:服务不可访问

这个问题困扰了我几个小时。

一切看起来都正常 - Pod、服务、端点。

但我的应用无法连接。

原来,我在 Service YAML 中使用了错误的 targetPort

从那以后,我变得对 YAML 进行三重检查。

症状

  • 无法从集群内部或外部访问服务
  • 连接超时或被拒绝

故障排除步骤

# 1. 验证服务存在
kubectl get svc <service-name># 2. 检查服务端点
kubectl get endpoints <service-name>
# 如果为空,selector 与任何 Pod 都不匹配# 3. 验证 Pod 标签
kubectl get pods --show-labels# 4. 从集群内部测试
kubectl run test-pod --image=busybox --rm -it -- wget -O- <service-name>:<port># 5. 检查服务类型
kubectl describe svc <service-name># 6. 对于 NodePort,检查节点端口是否可访问
kubectl get svc <service-name> -o jsonpath='{.spec.ports[0].nodePort}'# 7. 检查 NetworkPolicy
kubectl get networkpolicy
kubectl describe networkpolicy <policy-name># 8. 检查 DNS
kubectl run test-dns --image=busybox --rm -it -- nslookup <service-name>

解决方案

  1. 修复标签选择器
# 确保服务选择器与 Pod 标签匹配
selector:
  app: myapp  # 必须匹配 Pod 标签
  1. 检查目标端口
ports:
- port: 80          # 服务端口
  targetPort: 8080  # 必须匹配容器端口
  1. 验证防火墙规则(对于 NodePort/LoadBalancer):
# 检查安全组/防火墙规则是否允许流量

问题 4:高内存/CPU 使用率

我还记得我们早期的生产部署,一半的 Pod 不断被 OOMKilled。仪表盘上一切看起来都正常,但日志却讲述了另一个故事 - 我们的 Node.js 应用程序在吞噬内存。

原来,我们从未设置资源限制。集群在呼救,但我们没有倾听。

通过 kubectl top pods 设置适当的 requests 和 limits,启用 Vertical Pod Autoscaler (VPA),情况发生了翻天覆地的变化。

症状

  • Pod 被 OOMKilled
  • 性能下降
  • 节点压力大

故障排除

# 检查资源使用情况
kubectl top pods
kubectl top nodes# 检查 Pod 资源限制
kubectl describe pod <pod-name> | grep -A10 Limits# 检查 OOMKilled 事件
kubectl get events --field-selector reason=OOMKilled# 查看详细的 Pod 指标
kubectl describe node <node-name>

解决方案

  1. 增加资源限制
resources:
  requests:
    memory: "256Mi"
    cpu: "500m"
  limits:
    memory: "512Mi"
    cpu: "1000m"
  1. 实施资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-quota
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
  1. 设置限制范围
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
      cpu: 500m
    defaultRequest:
      memory: 256Mi
      cpu: 250m
    type: Container
  1. 启用垂直 Pod 自动扩展器 (VPA)
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: myapp-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  updatePolicy:
    updateMode: "Auto"

问题 5:ImagePullBackOff / ErrImagePull

这个在我周末部署期间咬了我一口(当然)。新的镜像,新的标签,一切看起来都准备好了 - 除了 Pod 从未启动。

“ImagePullBackOff” 状态像地狱般的错误信息一样盯着我。

20 分钟的恐慌后,我发现罪魁祸首是标签名称错误 - 有人在构建推送时打错了。

一旦修复,一切就立即启动起来。

现在,我总是运行 kubectl describe pod <pod-name> 并仔细检查注册表凭据和标签。因为没有什么比镜像标签中的冒号错误更能破坏部署信心。

症状

  • Pod 处于 ImagePullBackOff 状态
  • 无法拉取容器镜像

故障排除

# 检查 Pod 事件
kubectl describe pod <pod-name># 常见错误消息:
# - "image not found"
# - "unauthorized"
# - "manifest unknown"

解决方案

  1. 验证镜像名称
# 检查镜像名称和标签
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[0].image}'
  1. 检查镜像拉取密钥(对于私有注册表):
# 创建密钥
kubectl create secret docker-registry regcred \
  --docker-server=<registry-url> \
  --docker-username=<username> \
  --docker-password=<password># 添加到 Pod 规范
imagePullSecrets:
- name: regcred
  1. 检查镜像拉取策略
containers:
- name: app
  image: myapp:latest
  imagePullPolicy: Always  # 或 IfNotPresent, Never

问题 6:DNS 解析失败

一个阳光明媚的早晨,服务开始神秘地失败。API 无法访问数据库,日志充满了“未知主机”错误 - 混乱不堪。

起初,我怀疑是应用程序的问题,但一切正常。然后我突然想到,CoreDNS 可能崩溃了。

果然,kubectl logs -n kube-system -l k8s-app=kube-dns 显示了一个崩溃循环。重启 CoreDNS 并修复了一个小的配置错误,集群恢复了生机。

那天我学到:当一切都同时崩溃时,从 DNS 开始 - 它总是 DNS。

症状

  • Pod 无法解析服务名称
  • “nslookup: 无法解析”错误

故障排除

# 1. 检查 CoreDNS Pod
kubectl get pods -n kube-system -l k8s-app=kube-dns# 2. 检查 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns# 3. 测试 DNS 解析
kubectl run test-dns --image=busybox --rm -it -- nslookup kubernetes.default# 4. 检查 DNS 服务
kubectl get svc -n kube-system kube-dns# 5. 检查 Pod DNS 配置
kubectl get pod <pod-name> -o yaml | grep -A10 dnsPolicy

解决方案

  1. 重启 CoreDNS
kubectl rollout restart deployment/coredns -n kube-system
  1. 检查 CoreDNS ConfigMap
kubectl get configmap coredns -n kube-system -o yaml
  1. 设置 DNS 策略
spec:
  dnsPolicy: ClusterFirst  # 或 Default, ClusterFirstWithHostNet
  dnsConfig:
    nameservers:
    - 8.8.8.8
    searches:
    - default.svc.cluster.local
    - svc.cluster.local
    - cluster.local

问题 7:持久卷问题

一个周五部署,我的 PVC 被卡在 Pending 状态。数小时后,我发现罪魁祸首 - 存储类不匹配

快速修复 PVC 和 PV 名称的匹配问题,一切立即挂载。

从那以后,我在每次部署前都会仔细检查存储配置。是细节破坏大事。

症状

  • PVC 处于 Pending 状态
  • Pod 无法挂载卷
  • Pod 重新启动后数据丢失

故障排除

# 检查 PVC 状态
kubectl get pvc# 检查 PV 状态
kubectl get pv# 描述 PVC
kubectl describe pvc <pvc-name># 检查存储类
kubectl get storageclass# 检查 Pod 事件
kubectl describe pod <pod-name>

解决方案

  1. PVC 未绑定
# 确保匹配存储类
kubectl get pvc <pvc-name> -o yaml | grep storageClassName
kubectl get pv -o yaml | grep storageClassName# 检查访问模式匹配
# PVC: ReadWriteOnce, ReadOnlyMany, ReadWriteMany
# PV 必须支持相同的访问模式
  1. 手动 PV 绑定
apiVersion: v1
kind: PersistentVolume
metadata:
  name: manual-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  claimRef:
    name: my-pvc
    namespace: default
  1. 修复卷挂载错误
# 检查挂载路径冲突
# 确保容器用户有权限
# 验证节点上的卷存在(对于 hostPath)

问题 8:网络连接问题

Pod 健康但无法相互通信 — 纯粹的沉默。原来有人应用了一个 NetworkPolicy 阻断了所有流量。

临时允许入站流量后,事情又恢复了正常。

学到的教训:当 Pod 互相“消失”时,归咎于网络。

症状

  • Pod 无法相互通信
  • 外部流量无法到达 Pod

故障排除

# 1. 检查 Pod IP
kubectl get pod <pod-name> -o wide# 2. 测试 Pod 到 Pod 连接性
kubectl exec <source-pod> -- ping <destination-pod-ip># 3. 检查 NetworkPolicy
kubectl get networkpolicy# 4. 检查 CNI 插件
kubectl get pods -n kube-system | grep -E 'calico|flannel|weave|cilium'# 5. 检查 kube-proxy
kubectl get pods -n kube-system | grep kube-proxy
kubectl logs -n kube-system <kube-proxy-pod>

解决方案

  1. 修复 NetworkPolicy
# 允许所有入站流量(用于测试)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - {}
  1. 重启 CNI 插件
# 示例:Calico
kubectl rollout restart daemonset/calico-node -n kube-system

问题 9:证书/TLS 问题

我们的 HTTPS 突然毫无预兆地停止工作了。原因?过期的 TLS 证书在一个被遗忘的密钥中。

重新创建证书并使用 cert-manager 自动续订。永远不会再手动追逐到期日期。

症状

  • HTTPS 无法工作
  • 证书验证错误
  • Ingress TLS 失败

故障排除

# 检查密钥
kubectl get secret <tls-secret> -o yaml# 验证证书
kubectl get secret <tls-secret> -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text# 检查 Ingress TLS 配置
kubectl describe ingress <ingress-name>

解决方案

  1. 创建正确的 TLS 密钥
kubectl create secret tls <secret-name> --cert=path/to/cert.crt --key=path/to/key.key
  1. 使用 Cert-Manager(自动证书管理):
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml

问题 10:节点问题

在高流量期间,一个 Node NotReady 警报突然出现。kubelet 因 磁盘压力 而崩溃。

释放空间,重启 kubelet,解除节点的封锁。现在我像日常卫生一样对待节点清理 - 如果跳过一次,就会带来混乱。

症状

  • 节点状态 NotReady
  • Pod 无法调度
  • 节点压力条件

故障排除

# 检查节点状态
kubectl get nodes# 描述节点
kubectl describe node <node-name># 检查 kubelet 状态(在节点上)
systemctl status kubelet# 检查 kubelet 日志(在节点上)
journalctl -u kubelet -f

常见节点条件

  • MemoryPressure:节点内存不足
  • DiskPressure:节点磁盘空间不足
  • PIDPressure:进程过多
  • NetworkUnavailable:网络未配置

解决方案

  1. MemoryPressure
# 驱逐 Pod,添加内存或添加节点
kubectl drain <node-name> --ignore-daemonsets
  1. DiskPressure
# 在节点上清理
docker system prune -a  # 如果使用 Docker
crictl rmi --prune      # 如果使用 containerd
  1. 重启 Kubelet
systemctl restart kubelet
  1. 解除节点封锁
kubectl uncordon <node-name>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/967959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025出国留学机构怎么样

2025出国留学机构怎么样一、2025出国留学机构怎么样:五大高频问题解析作为一位拥有12年经验的国际教育规划师,我经常被学生和家长问及如何选择留学中介。在2025年10月24日的今天,留学市场愈发复杂,许多人在搜索引擎…

本年度靠谱的运动场馆装修设计公司推荐

摘要 运动场馆装修行业在2025年迎来快速发展,随着全民健身意识的提升和体育产业的扩张,专业装修需求日益增长。本榜单基于市场调研、用户口碑和行业数据,为您推荐前十名运动场馆装修服务提供商,旨在帮助用户选择可…

2025成都正规的出国留学中介

2025成都正规的出国留学中介一、成都留学中介怎么选?这五类问题帮你理清思路作为一名拥有十二年国际教育规划经验的从业者,我每天都会接触到大量成都学生和家长的咨询。在2025年10月24日的今天,留学市场的信息愈发复…

二十四、企业落地异地多活、异地容灾架构

二十四、企业落地异地多活、异地容灾架构 目录二十四、企业落地异地多活、异地容灾架构1、K8s企业级两地三中心、异地多活、智能DNS落地1.1 两地三中心架构解析1.2 什么是异地多活?1.3 异地多活架构1.4 异地多活、两地…

AI 十大论文精讲(四):0.01% 参数实现全量大模型微调效果?LoRA 的低秩适配之谜

摘要: 论文《LoRA: Low-Rank Adaptation of Large Language Models》提出了一种高效的大模型微调方法,通过冻结预训练权重并插入可训练的低秩矩阵($\Delta W = B \cdot A$),显著降低参数规模(仅为原模型的0.01%-…

2025 最新铣头厂家推荐!直角 / 双向 / 万向 / 万能 / 加工中心侧 / 加长 / CNC 侧 / BT50 侧 / 90 度铣头优质厂家品牌排行榜及选型指南

在金属切削加工领域,铣头作为核心配套工具,其性能直接决定加工精度、生产效率与产品合格率。当前高端领域对工件加工精度要求已达微米级,大型工件多面切削效率低下、企业成本受限等行业痛点突出,而市场品牌鱼龙混杂…

uni-app 无法实现全局 Toast?这个方法做到了!

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣大家好,我是不如摸鱼去,wot-ui的主要维护者,欢迎来到我的 uni-app 分享专栏。 在 uni-app 开发中,我们经常遇到需要在任何地方(如网络请求拦截器、>路由…

权重矩阵初始化

权重矩阵初始化 是神经网络训练中至关重要的一步,它直接影响模型的收敛速度和性能。不恰当的初始化可能导致梯度消失、梯度爆炸或训练停滞。 以下是常见的几种权重矩阵初始化方法: 零初始化 (Zero Initialization):…

2025较好的留学机构排名前十

2025较好的留学机构排名前十一、2025年留学中介选择:五大高频问题解析作为一名拥有15年经验的国际教育规划师,我经常接触到学生和家长的咨询,尤其是关于如何筛选可靠的留学中介。随着2025年留学季的临近,许多人在搜…

2025杭州最大留学中介公司在哪里

2025杭州最大留学中介公司在哪里一、杭州留学中介如何选?这些高频搜索问题你遇到过吗?作为一位在留学咨询行业耕耘超过十二年的国际教育规划师,我每天都会接触到大量来自杭州学生和家长的咨询。在2025年10月25日的今…

2025出国留学机构大全排名榜

2025出国留学机构大全排名榜一、2025出国留学机构大全排名榜作为拥有八年经验的国际教育规划师,我经常被学生和家长问到这样的问题:到底哪家留学中介更靠谱?选择机构时应该看重哪些方面?听说有些机构专门做研究生申…

2025成都有哪些留学中介机构比较好

2025成都有哪些留学中介机构比较好一、成都留学中介怎么选?这些高频问题帮你理清思路作为一位拥有12年经验的国际教育全案规划师,我经常被成都的学生和家长问及选择留学中介的种种困惑。在2025年的今天,成都的留学市…

使用 x11vnc 与 systemd 实现持久化 VNC 远程桌面服务

背景由于办公电脑系统重装,顺便就使用 Wireguard 异地组网的方案替代了原先的 ssh 隧道进行远程连接等一系列操作的方案。因此需要将服务端 x11vnc 作为一个持久服务,最好能通过 systemd 自动管理。方案先测试网络连…

上海外贸独立站公司十大推荐排行榜,谷歌独立站制作公司,谷歌独立站制作公司推荐,谷歌SEO公司排名前十,上海谷歌SEO公司十大排名:华企博网推荐榜

上海外贸独立站公司十大推荐排行榜,谷歌独立站制作公司,谷歌独立站制作公司推荐,谷歌SEO公司排名前十,上海谷歌SEO公司十大排名:华企博网推荐榜上海外贸独立站公司十大推荐排行榜,谷歌独立站制作公司,谷歌独立站…

2025 最新珩磨管厂家推荐!珩磨管 / 活塞杆 / 合金管 / 精密无缝管优质品牌排行榜,含 20#45#/304 材质数控珩磨工艺企业权威推荐

作为液压系统与传动部件的核心基础材料,珩磨管的精度、耐磨性与稳定性直接决定终端设备的运行效率与使用寿命。据国际流体动力协会(IFPS)最新测评数据显示,全球范围内仅 32% 的珩磨管企业能达到 Ra0.4 微米以下内壁…

2025上海外贸快车公司十大排名,上海外贸独立站制作公司排行,谷歌SEO公司十大排名,独立站源头公司口碑推荐榜,谷歌独立站公司推荐榜:华企博网评选十大优质服务商

2025上海外贸快车公司十大排名,上海外贸独立站制作公司排行,谷歌SEO公司十大排名,独立站源头公司口碑推荐榜,谷歌独立站公司推荐榜:华企博网评选十大优质服务商2025上海外贸快车公司十大排名,上海外贸独立站制作…

2025年口碑炸裂的湿敷水有哪些?抗初老+匀净透亮,成分党认准这几款

2025年口碑炸裂的湿敷水有哪些?抗初老+匀净透亮,成分党认准这几款随着美妆护肤理念的精细化发展,湿敷水作为高效护肤的核心单品,其市场需求呈现爆发式增长态势。专业的湿敷水通过密集补水、定向修护的特性,不仅能…

4、进程信号

1、信号 是软件中断,用于通知进程发生了某种事件。每个信号都有一个名字,以 SIG 开头。// 查看所有信号 kill -l// 输出示例:1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGAB…

说说Redis的集群方案?主从复制、哨兵、Cluster集群的区别和适用场景【转】

在现代分布式系统中,Redis 作为高性能的内存数据存储,其集群方案的选型直接决定了系统的稳定性、可用性和扩展性。本文将深入剖析 Redis 的三种核心集群方案:主从复制、哨兵模式和 Cluster 集群,结合实际应用案例厘…

2025年消波块钢模厂家推荐榜单Top10:行业权威解析与选择指南

摘要 随着海洋工程和港口建设的快速发展,消波块钢模作为防波堤核心组件,市场需求持续增长。2025年,行业预计增长率达8.5%,主要受益于沿海基础设施投资增加和环保政策推动。本文基于权威数据、用户口碑和技术指标,…