[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数据备份与恢复

相关推荐
小扳13 分钟前
Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
运维·spring boot·后端·mysql·spring cloud·docker·容器
politeboy1 小时前
关于k8s中镜像的服务端口被拒绝的问题
云原生·容器·kubernetes
weixin_438197381 小时前
K8S创建云主机配置docker仓库
linux·云原生·容器·eureka·kubernetes
皮锤打乌龟8 小时前
(干货)Jenkins使用kubernetes插件连接k8s的认证方式
运维·kubernetes·jenkins
南猿北者9 小时前
docker Network(网络)
网络·docker·容器
ggaofeng12 小时前
通过命令学习k8s
云原生·容器·kubernetes
death bell12 小时前
Docker基础概念
运维·docker·容器
想学习java初学者15 小时前
Docker Compose部署Kafka(非Zookeeper)
docker·容器·kafka
qq_道可道15 小时前
K8S升级到1.24后,切换运行时导致 dind 构建镜像慢根因定位与解决
云原生·容器·kubernetes
SONGW201815 小时前
k8s拓扑域 :topologyKey
kubernetes