[k8s生产系列]:k8s集群故障恢复,etcd数据不一致,kubernetes集群异常

文章目录

  • 摘要
  • [1 背景说明](#1 背景说明)
  • [2 故障排查](#2 故障排查)
    • [2.1 查询docker与kubelet状态](#2.1 查询docker与kubelet状态)
    • [2.2 查看kubelet服务日志](#2.2 查看kubelet服务日志)
    • [2.3 重启docker与kubelet服务](#2.3 重启docker与kubelet服务)
      • [2.3.1 首先kubelet启动起来了,但是报错master节点找不到](#2.3.1 首先kubelet启动起来了,但是报错master节点找不到)
      • [2.3.2 查询kubernetes集群服务,发现etcd与kube-apiserver均启动异常](#2.3.2 查询kubernetes集群服务,发现etcd与kube-apiserver均启动异常)
    • [2.4 etcd与kube-apiserver](#2.4 etcd与kube-apiserver)
      • [2.4.1 etcd简介](#2.4.1 etcd简介)
      • [2.4.2 kube-apiserver简介](#2.4.2 kube-apiserver简介)
      • [2.4.3 关系](#2.4.3 关系)
  • [3 解决方案](#3 解决方案)
  • [4 解决实践](#4 解决实践)
    • [4.1 查看etcd本地持久化数据目录地址](#4.1 查看etcd本地持久化数据目录地址)
    • [4.2 查看当前节点的数据存放地址](#4.2 查看当前节点的数据存放地址)
  • [4.3 实景](#4.3 实景)
  • [5 总结](#5 总结)
  • [6 参考文献](#6 参考文献)

摘要

摘要:kubernetes,etcd,数据恢复,kube-apiserver

1 背景说明

二级生产环境(灰度环境),kubernetes测试环境,采用1master+2node架构,某次,公司突然断电,导致服务器突然宕机,来电后,重启服务器,在任何节点执行命令,都报如下错误:

bash 复制代码
[root@master kube-apiserver]# kubectl get ns
The connection to the server 192.168.150.100:6443 was refused - did you specify the right host or port?

2 故障排查

2.1 查询docker与kubelet状态

bash 复制代码
systemctl status docker #如下docker运行正常
bash 复制代码
systemctl status kubelet #如下kubelet一直在重启中

2.2 查看kubelet服务日志

bash 复制代码
journalctl -u kubelet #查询到日志如下,不能连接到docker
bash 复制代码
7月 04 10:15:14 master kubelet[687]: E0704 10:15:14.863276     687 reflector.go:153] k8s.io/kubernetes/pkg/kubelet/kubelet.go:458: Failed to list *v1.Node: Get https://192
7月 04 10:15:14 master kubelet[687]: I0704 10:15:14.864218     687 client.go:75] Connecting to docker on unix:///var/run/docker.sock
7月 04 10:15:14 master kubelet[687]: I0704 10:15:14.864271     687 client.go:104] Start docker client with request timeout=2m0s
7月 04 10:15:14 master kubelet[687]: F0704 10:15:14.865651     687 server.go:273] failed to run Kubelet: failed to create kubelet: failed to get docker version: Cannot con
7月 04 10:15:14 master systemd[1]: kubelet.service: main process exited, code=exited, status=255/n/a

2.3 重启docker与kubelet服务

2.3.1 首先kubelet启动起来了,但是报错master节点找不到

2.3.2 查询kubernetes集群服务,发现etcd与kube-apiserver均启动异常

bash 复制代码
docker ps -a| grep kube-apiserver
bash 复制代码
docker ps -a| grep etcd

2.4 etcd与kube-apiserver

2.4.1 etcd简介

kubernetes集群中担任的角色:etcd是kubernetes集群数据存储后端,用于存储所有集群数据,l例如:集群状态、配置信息、服务发现信息等。

  • 数据存储:所有集群数据,例如:pod状态、节点信息、service信息都被存储于etcd中。
  • 一致性保证:etcd通过Raft协议保证数据强一致性和高可用性。

2.4.2 kube-apiserver简介

kubernetes集群中担任角色:kube-apiserver是kubernetes的API服务端点,提供整个系统的API入口。

  • 功能:kube-apiserver接收来自kubectl(kubernetes的命令行工具)或其他kubernetes组件的API请求,随后,通过认证、授权和验证后,讲这些请求转发给ectd读取或更新数据
  • 数据操作:所有kubernetes资源(如pod、service、deployment等)的操作都通过kube-apiserver进行,通过kube-apiserver将操作映射到etcd中相应数据存储位置。

2.4.3 关系

etcd与kube-apiserver关系:

kube-apiserver作为集群的api服务器,通过etcd来持久化存储和管理整个集群状态和配置信息。那就显然,不出意外,master节点的etcd数据损坏了,为啥这么说呢

  • etcd 成员(Member) :在 etcd 集群中,每个 etcd 实例被称为一个"成员"(Member)。这些成员共同协作,通过 etcd的Raft 一致性算法来确保数据的强一致性和高可用性。

3 解决方案

因此,经2.4的分析,首先打开etcd的日志存放地址(默认保存地址:/var/log/pods/kube-system_etcd XXX XXX),查看日志发现报错信息,查阅官方资料这种情况是由于 etcd 数据损坏,有两种解决方式。

  • 方案1:在故障节点上停止etcd服务并删除损坏的 etcd 数据,现在etcd服务本来就没有启动,删除前先备份数据,最后启动etcd服务。
  • 方案2:重置kubernetes集群(代价太大,放弃)。

4 解决实践

4.1 查看etcd本地持久化数据目录地址

bash 复制代码
cat /etc/kubernetes/manifests/etcd.yaml  #etcd配置yaml默认存放路径

4.2 查看当前节点的数据存放地址

bash 复制代码
 find ./ -type d -name member

4.3 实景

如下,kubernetes集群成功拉起

5 总结

首先,在kubernetes中存在etcd集群,该集群由多个节点组成,其次,kubernetes集群通过 kubectl和kube-apiserver与etcd集群进行交互,在此次事故中,由于master节点的etcd数据损坏,导致etcd集群数据无法做到一致性,进而导致kubernetes集群不可访问,当把master节点的损坏的etcd数据移除后,kubernetes会自动同步etcd集群中其他节点数据,使得集群数据一直,最终故障修复成功。

6 参考文献

1 etcd和apiserver无法正常启动
2 K8S篇之etcd数据备份与恢复

相关推荐
运维开发故事3 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson5 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生5 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭5 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美6 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵7 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
武子康10 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
2601_9618752413 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj13 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes