Kubernetes 主节点宕机恢复记录 MountVolume.SetUp failed for volume "kube-dns-config"

本文记录了一次Kubernetes集群故障的排查过程,包括etcd重启问题的解决和kube-dns挂载卷问题的修复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       今天早上,发现原来运行的好好的Kubernetes集群不能正常工作了,dashboard界面打不开,主节点上 docker ps 不显示任何运行中容器,重启 kubelet 后,短暂恢复,之后再次陷入不可用状态,经过反复重启观察,发现是etcd不断重启,最后失败,导致其它组件相继失败。

        etcd 日志如下:

2018-02-06 02:25:24.564269 I | etcdmain: etcd Version: 3.0.17
2018-02-06 02:25:24.564531 I | etcdmain: Git SHA: cc198e2
2018-02-06 02:25:24.564544 I | etcdmain: Go Version: go1.6.4
2018-02-06 02:25:24.564554 I | etcdmain: Go OS/Arch: linux/amd64
2018-02-06 02:25:24.564563 I | etcdmain: setting maximum number of CPUs to 8, total number of available CPUs is 8
2018-02-06 02:25:24.564636 N | etcdmain: the server is already initialized as member before, starting as etcd member...
2018-02-06 02:25:24.565021 I | etcdmain: listening for peers on http://localhost:2380
2018-02-06 02:25:24.565114 I | etcdmain: listening for client requests on 127.0.0.1:2379
2018-02-06 02:25:24.568360 I | etcdserver: recovered store from snapshot at index 5900621
2018-02-06 02:25:24.568399 I | etcdserver: name = default
2018-02-06 02:25:24.568406 I | etcdserver: data dir = /var/lib/etcd
2018-02-06 02:25:24.568413 I | etcdserver: member dir = /var/lib/etcd/member
2018-02-06 02:25:24.568418 I | etcdserver: heartbeat = 100ms
2018-02-06 02:25:24.568423 I | etcdserver: election = 1000ms
2018-02-06 02:25:24.568428 I | etcdserver: snapshot count = 10000
2018-02-06 02:25:24.568464 I | etcdserver: advertise client URLs = http://127.0.0.1:2379
2018-02-06 02:25:24.760641 I | etcdserver: restarting member 8e9e05c52164694d in cluster cdf818194e3a8c32 at commit index 5904480
2018-02-06 02:25:24.760850 I | raft: 8e9e05c52164694d became follower at term 12
2018-02-06 02:25:24.760904 I | raft: newRaft 8e9e05c52164694d [peers: [8e9e05c52164694d], term: 12, commit: 5904480, applied: 5900621, 

lastindex: 5904480, lastterm: 12]
2018-02-06 02:25:24.761062 I | api: enabled capabilities for version 3.0
2018-02-06 02:25:24.761111 I | membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32 from store
2018-02-06 02:25:24.761125 I | membership: set the cluster version to 3.0 from store
2018-02-06 02:25:24.829180 I | mvcc: restore compact to 2314830
2018-02-06 02:25:24.975979 I | etcdserver: starting server... [version: 3.0.17, cluster version: 3.0]
2018-02-06 02:25:25.661519 I | raft: 8e9e05c52164694d is starting a new election at term 12
2018-02-06 02:25:25.661581 I | raft: 8e9e05c52164694d became candidate at term 13
2018-02-06 02:25:25.661596 I | raft: 8e9e05c52164694d received vote from 8e9e05c52164694d at term 13
2018-02-06 02:25:25.661620 I | raft: 8e9e05c52164694d became leader at term 13
2018-02-06 02:25:25.661645 I | raft: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 13
2018-02-06 02:25:25.663336 I | etcdserver: published {Name:default ClientURLs:[http://127.0.0.1:2379]} to cluster cdf818194e3a8c32
2018-02-06 02:25:25.663379 I | etcdmain: ready to serve client requests
2018-02-06 02:25:25.663797 N | etcdmain: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged!
2018-02-06 02:25:37.403730 W | etcdserver: apply entries took too long [25.315155ms for 1 entries]
2018-02-06 02:25:37.403752 W | etcdserver: avoid queries with large range/delete range!
2018-02-06 02:25:49.930163 N | osutil: received terminated signal, shutting down...

        查找好多资料,大多说是 etcd 版本问题,可是原来是好好的呀!!!明显不是这个问题。


       费了半天劲,最终排查出的问题是:主节点机器磁盘空间不够了,/ 目录使用率达到了92%


       删除部分文件后,磁盘使用率降到70%,重新启动 kubelet,发现etcd不再重启退出了,但是 kube-dns 一直启动不起来


       提示错误:

Events:
  FirstSeen	LastSeen	Count	From				SubObjectPath	Type		Reason			Message
  ---------	--------	-----	----				-------------	--------	------			-------
  1h		35m		36	kubelet, inm-bj-vip-ms04			Warning		FailedMount		Unable to mount volumes for pod "kube-dns-2425271678-bgzzp_kube-system(d7381d67-fb52-11e7-a2f6-0050568b6632)": timeout expired waiting for volumes to attach/mount for pod "kube-system"/"kube-dns-2425271678-bgzzp". list of unattached/unmounted volumes=[kube-dns-config]
  1h		35m		36	kubelet, inm-bj-vip-ms04			Warning		FailedSync		Error syncing pod
  1h		34m		48	kubelet, inm-bj-vip-ms04			Warning		FailedMount		MountVolume.SetUp failed for volume "kube-dns-config" : stat /var/lib/kubelet/pods/d7381d67-fb52-11e7-a2f6-0050568b6632/volumes/kubernetes.io~configmap/kube-dns-config: no such file or directory
  30m		30m		1	kubelet, inm-bj-vip-ms04			Normal		SuccessfulMountVolume	MountVolume.SetUp succeeded for volume "kube-dns-token-3hdnc" 
  28m		10m		9	kubelet, inm-bj-vip-ms04			Warning		FailedMount		Unable to mount volumes for pod "kube-dns-2425271678-bgzzp_kube-system(d7381d67-fb52-11e7-a2f6-0050568b6632)": timeout expired waiting for volumes to attach/mount for pod "kube-system"/"kube-dns-2425271678-bgzzp". list of unattached/unmounted volumes=[kube-dns-config]
  28m		10m		9	kubelet, inm-bj-vip-ms04			Warning		FailedSync		Error syncing pod
  30m		10m		18	kubelet, inm-bj-vip-ms04			Warning		FailedMount		MountVolume.SetUp failed for volume "kube-dns-config" : stat /var/lib/kubelet/pods/d7381d67-fb52-11e7-a2f6-0050568b6632/volumes/kubernetes.io~configmap/kube-dns-config: no such file or directory
  10m		10m		1	kubelet, inm-bj-vip-ms04			Normal		SuccessfulMountVolume	MountVolume.SetUp succeeded for volume "kube-dns-token-3hdnc" 
  10m		9m		6	kubelet, inm-bj-vip-ms04			Warning		FailedMount		MountVolume.SetUp failed for volume "kube-dns-config" : stat /var/lib/kubelet/pods/d7381d67-fb52-11e7-a2f6-0050568b6632/volumes/kubernetes.io~configmap/kube-dns-config: no such file or directory
  9m		9m		1	kubelet, inm-bj-vip-ms04			Normal		SuccessfulMountVolume	MountVolume.SetUp succeeded for volume "kube-dns-token-3hdnc" 
  7m		5m		2	kubelet, inm-bj-vip-ms04			Warning		FailedMount		Unable to mount volumes for pod "kube-dns-2425271678-bgzzp_kube-system(d7381d67-fb52-11e7-a2f6-0050568b6632)": timeout expired waiting for volumes to attach/mount for pod "kube-system"/"kube-dns-2425271678-bgzzp". list of unattached/unmounted volumes=[kube-dns-config]
  7m		5m		2	kubelet, inm-bj-vip-ms04			Warning		FailedSync		Error syncing pod
  9m		3m		11	kubelet, inm-bj-vip-ms04			Warning		FailedMount		MountVolume.SetUp failed for volume "kube-dns-config" : stat /var/lib/kubelet/pods/d7381d67-fb52-11e7-a2f6-0050568b6632/volumes/kubernetes.io~configmap/kube-dns-config: no such file or directory
  1m		1m		1	kubelet, inm-bj-vip-ms04			Normal		SuccessfulMountVolume	MountVolume.SetUp succeeded for volume "kube-dns-token-3hdnc" 
  1m		50s		8	kubelet, inm-bj-vip-ms04			Warning		FailedMount		MountVolume.SetUp failed for volume "kube-dns-config" : stat /var/lib/kubelet/pods/d7381d67-fb52-11e7-a2f6-0050568b6632/volumes/kubernetes.io~configmap/kube-dns-config: no such file or directory


          感觉是挂载卷问题,尝试重新安装网络都没有效果  ^~^|||


        最后,发大招,关闭 kubelet 和 docker 后,删除所有容器, 进入 /var/lib/kubelet/pods ,直接把 kube-dns 的pod 删掉(pod的名字在错误日志里有,这里就是d7381d67-fb52-11e7-a2f6-0050568b6632),再重启docker和 kubelet,dns服务恢复!!!


        末尾附上 dns 恢复依次执行的命令:

# systemctl stop kubelet
# docker kill $(docker ps -a -q)
# docker rm $(docker ps -a -q)
# systemctl stop docker
# cd /var/lib/kubelet/pods
# mv d7381d67-fb52-11e7-a2f6-0050568b6632 /tmp
# systemctl start docker
# systemctl start kubelet


   


        

<think>我们正在处理一个Kubernetes问题:MountVolume.SetUp失败,具体原因是volume "config-volume"在同步secret缓存时超时。根据用户提供的引用和问题描述,我们需要分析可能的原因和解决方案。 引用[1]提到kubelet在准备pod数据目录时需要挂载volume,并拉取pod所需的secrets。引用[2]显示了一个pod处于ContainerCreating状态,这通常与挂载卷失败有关。 可能的原因: 1. Secret未创建或未及时创建:如果pod依赖的secret在pod创建时尚未存在,kubelet将无法挂载卷。 2. Kubelet与API服务器通信问题:kubelet需要从API服务器获取secret,网络问题或API服务器过载可能导致超时。 3. 节点上的kubelet问题:kubelet可能由于资源不足(CPU、内存)或bug而无法及时同步secret。 4. Secret名称或命名空间错误:pod中引用的secret名称或命名空间与实际的secret不匹配。 5. 节点上的时钟不同步:如果节点时钟与API服务器时钟不同步,可能导致证书验证失败,从而影响通信。 解决方案: 1. 检查secret是否存在且名称、命名空间正确: ```bash kubectl get secret <secret-name> -n <namespace> --output=yaml ``` 确保pod的volume定义中引用的secret名称和命名空间正确。 2. 检查pod事件以获取更多信息: ```bash kubectl describe pod <pod-name> -n <namespace> ``` 在事件部分(Events)查找更详细的错误信息。 3. 检查kubelet日志: 在节点上查看kubelet日志,可能包含更详细的错误原因。例如: ```bash journalctl -u kubelet -f ``` 查找与secret同步相关的错误日志。 4. 检查网络连接和API服务器状态: 确保节点可以访问Kubernetes API服务器,且API服务器运行正常。 5. 检查节点资源: 确保节点有足够的CPU和内存资源供kubelet运行。 6. 重启kubelet: 在节点上重启kubelet服务可能解决临时性问题: ```bash systemctl restart kubelet ``` 7. 增加kubelet的同步超时时间(不推荐,临时解决): 在kubelet配置中,可以尝试增加`--sync-frequency`(默认1分钟)或`--kube-api-qps`(默认5)和`--kube-api-burst`(默认10)来调整同步频率和请求速率。但请注意,这可能会增加API服务器负担。 8. 如果问题持续,考虑升级Kubernetes版本,因为可能是一个已知的bug。 由于引用中提到“secret缓存同步超时”,重点应放在secret的可用性和kubelet与API服务器的通信上。 步骤总结: 1. 确认secret存在且正确。 2. 检查pod事件和kubelet日志。 3. 确保网络和API服务器正常。 4. 考虑节点资源或重启kubelet。 如果上述步骤无法解决问题,可能需要更深入地调查kubelet和API服务器之间的交互。 §§相关问题§§ 1. 如何诊断Kubernetes中的Volume挂载失败问题? 2. Kubernetes中Secret的管理和同步机制是怎样的? 3. 如何监控和优化Kubernetes API服务器的性能?</think>### Kubernetes MountVolume.SetUp失败:Secret缓存同步超时解决方案 此问题通常发生在Pod创建过程中,kubelet无法及时获取所需的Secret数据导致卷挂载失败。以下是关键原因和解决方案: #### 主要原因分析 1. **Secret同步延迟** kubelet需要从API服务器同步Secret数据到本地缓存,网络延迟或API服务器过载会导致超时(默认超时时间2分钟)[^1] 2. **资源不足** 节点CPU/内存资源紧张时,kubelet处理同步请求可能超时 3. **命名空间不匹配** Pod与Secret处于不同命名空间但未正确指定 4. **RBAC权限问题** ServiceAccount缺少读取Secret的权限 5. **网络策略限制** 节点到API服务器的通信被NetworkPolicy阻断 #### 解决方案步骤 1. **检查Secret状态** 验证Secret是否存在且内容正确: ```bash kubectl get secret <secret-name> -n <namespace> -o yaml ``` 2. **检查Pod事件日志** 获取详细错误信息: ```bash kubectl describe pod <pod-name> -n <namespace> ``` 在Events部分查找`MountVolume.SetUp failed`相关错误 3. **调整kubelet参数**(需重启kubelet) 在节点上修改kubelet配置: ```bash # 增加API请求超时时间 sudo vi /etc/kubernetes/kubelet.conf ``` 添加参数: ```yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration syncFrequency: 1m0s # 增加同步频率 kubeAPIBurst: 30 # 增加突发请求量 ``` 4. **验证RBAC权限** 确保ServiceAccount有Secret读取权限: ```yaml kubectl create role secret-reader --verb=get,list --resource=secrets kubectl create rolebinding --role=secret-reader --serviceaccount=<namespace>:<sa-name> ``` 5. **检查网络连通性** 在节点上测试API服务器连接: ```bash curl -k https://<api-server>:6443/api/v1/namespaces/<ns>/secrets/<secret-name> ``` 6. **临时解决方案** 重建Pod强制刷新缓存: ```bash kubectl delete pod <pod-name> --grace-period=0 --force ``` #### 预防措施 - 使用`initContainer`提前加载Secret - 为关键Secret添加`immutable: true`属性减少同步需求 - 监控API服务器延迟指标:`apiserver_request_duration_seconds` - 定期清理未使用的Secret减少缓存压力 > **典型错误日志示例**: > `MountVolume.SetUp failed for volume "config-volume" : failed to sync secret cache: timed out waiting for the condition`[^1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值