k8s外接etcd集群服务异常,使用snapshot恢复etcd集群

这篇具有很好参考价值的文章主要介绍了k8s外接etcd集群服务异常,使用snapshot恢复etcd集群。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境

master节点

主机 IP 版本
master01 192.168.66.50 k8s-1.23.17
master02 192.168.66.55 k8s-1.23.17
master03 192.168.66.56 k8s-1.23.17

etcd集群节点

主机 IP 版本
etcd01 192.168.66.58 3.5.6
etcd02 192.168.66.59 3.5.6
etcd03 192.168.66.57 3.5.6

生产环境中我们为了避免出现误操作或者是服务器硬件出见异常导致宕机,我们的虚拟机或者k8s集群崩溃,所以我们都会创建多节点的高可用集群,包括k8s集群使用外接etcd集群,但有时也可能出现数据丢失,所以经常要备份数据。

etcd备份

etcd集群的备份我们使用snapshot备份etcd集群数据

备份一般会使用脚本备份,三个etcd节点分别备份(虽然每份etcd节点的数据相同,但防止虚拟机宕机起不来,所以最好三个节点都备份,每小时备份一次,创建一个备份计划任务):

#!/bin/bash
#
###etcd cluster backup

time_back=`date +%Y%m%d-%H%M%S`
path='/etc/etcd/snapshot/'
/usr/bin/etcdctl --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --cacert=/etc/kubernetes/pki/etcd/ca.crt --endpoints=https://192.168.66.58:2379 snapshot save ${path}etcd-snapshot-`date +%Y%m%d-%H%M%S`.db


###删除7天之前的文件
/usr/bin/find /etc/etcd/snapshot -name "*.db" -mtime +7 | xargs rm -f

为了防止备份文件过多,占用磁盘空间,删除磁盘中7天之前的备份,一般最早的数据来说,意义不是很大

etcd集群使用snapshot恢复集群

1:使用snapshot恢复etcd集群,我们需要先停掉master节点上的docker和kubelet服务,停止etcd节点上的kubelet服务,确保没有服务调用etcd服务

[root@master01 ~]# systemctl stop kubelet
[root@master01 ~]# systemctl stop docker.socket && systemctl stop docker

[root@master01 ~]# docker ps

k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java

2:etcd的数据计划存储在/var/lib/etcd/目录下,所以删除etcd集群中每个节点/var/lib/etcd/目录下的数据,确保/var/lib/etcd/是空目录,或者/var/lib/etcd/是新创建的目录。如果存放其他目录下也可以,需要修改etcd配置文件,需要修改--data-dir参数。

k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/etcd.advertise-client-urls: https://192.168.66.58:2379
  creationTimestamp: null
  labels:
    component: etcd
    tier: control-plane
  name: etcd
  namespace: kube-system
spec:
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://192.168.66.58:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    - --data-dir=/var/lib/etcd
    - --experimental-initial-corrupt-check=true
    - --initial-advertise-peer-urls=https://192.168.66.58:2380
    - --initial-cluster=infra2=https://192.168.66.59:2380,infra1=https://192.168.66.58:2380,infra0=https://192.168.66.57:2380
    - --initial-cluster-state=new
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --listen-client-urls=https://192.168.66.58:2379,https://127.0.0.1:2379
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://192.168.66.58:2380
    - --name=infra1
    - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
    - --peer-client-cert-auth=true
    - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
    - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    - --snapshot-count=10000
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    image: registry.k8s.io/etcd:3.5.6-0
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /health
        port: 2381
        scheme: HTTP
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    name: etcd
    resources:
      requests:
        cpu: 100m
        memory: 100Mi
    startupProbe:
      failureThreshold: 24
      httpGet:
        host: 128.0.0.1
        path: /health
        port: 2381
        scheme: HTTP
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    volumeMounts:
    - mountPath: /var/lib/etcd
      name: etcd-data
    - mountPath: /etc/kubernetes/pki/etcd
      name: etcd-certs
  hostNetwork: true
  priorityClassName: system-node-critical
  securityContext:
    seccompProfile:
      type: RuntimeDefault
  volumes:
  - hostPath:
      path: /etc/kubernetes/pki/etcd
      type: DirectoryOrCreate
    name: etcd-data
status: {}

 停止相关服务后,使用快照恢复数据,三个节点一次恢复,先恢复etcd01

etcd01恢复命令:

etcdctl snapshot restore  etcd-snapshot-20231213-121501.db\
    --data-dir=/var/lib/etcd/ --initial-cluster-token="etcd-cluster" \
    --name=infra1 --initial-advertise-peer-urls=https://192.168.66.58:2380 \
    --initial-cluster="infra0=https://192.168.66.57:2380,infra1=https://192.168.66.58:2380,infra2=https://192.168.66.59:2380"

k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java

etcd02和etcd03节点恢复:

etcdctl snapshot restore  etcd-snapshot-20231213-121501.db\
    --data-dir=/var/lib/etcd/ --initial-cluster-token="etcd-cluster" \
    --name=infra2 --initial-advertise-peer-urls=https://192.168.66.59:2380 \
    --initial-cluster="infra0=https://192.168.66.57:2380,infra1=https://192.168.66.58:2380,infra2=https://192.168.66.59:2380"
etcdctl snapshot restore  etcd-snapshot-20231213-121501.db\
    --data-dir=/var/lib/etcd/ --initial-cluster-token="etcd-cluster" \
    --name=infra0 --initial-advertise-peer-urls=https://192.168.66.57:2380 \
    --initial-cluster="infra0=https://192.168.66.57:2380,infra1=https://192.168.66.58:2380,infra2=https://192.168.66.59:2380"

注意使用最新的快照文件,和快照文件路径。

k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java

k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java

3:数据恢复后,启动docker和kubelet服务 ,需要近最快时间启动。

[root@etcd01 snapshot]# systemctl start docker && systemctl start kubelet

[root@etcd02 snapshot]# systemctl start docker && systemctl start kubelet

[root@etcd03 snapshot]# systemctl start docker && systemctl start kubelet

4:查看服务状态,以及etcd服务是否启动,集群是否正常

[root@etcd01 snapshot]# systemctl status docker && systemctl status kubelet

[root@etcd02 snapshot]# systemctl status docker && systemctl status kubelet

[root@etcd03 snapshot]# systemctl status docker && systemctl status kubelet

k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java

需要在三个节点上分别查看,docker ps,etcd容器是否起来

[root@etcd01 snapshot]# docker ps

k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java

[root@etcd02 snapshot]# docker ps

k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java[root@etcd03 snapshot]# docker ps

k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java

使用member list查看集群节点状态,或使用脚本查看集群状态:

#!/bin/bash
#
###etcd cluster status check

####检查集群节点的健康状态
echo "etcd集群节点的健康状态检查"
/usr/bin/etcdctl --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --cacert=/etc/kubernetes/pki/etcd/ca.crt --endpoints=https://192.168.66.58:2379,https://192.168.66.59:2379,https://192.168.66.57:2379 endpoint health -w table

####检查集群的状态
echo "etcd=`hostname`:集群的节点详细状态包括leader or flower"
/usr/bin/etcdctl   --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --cacert=/etc/kubernetes/pki/etcd/ca.crt --endpoints=https://192.168.66.58:2379,https://192.168.66.59:2379,https://192.168.66.57:2379 endpoint status  --write-out=table

 k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java

在第二章表格中的IS LEADER字段中,可以看到etcd01是true,etcd02和etcd03是false,所以集群没有出现脑裂,集群状态正常

恢复master节点服务,查看k8s集群状态

[root@master01 ~]# systemctl start docker && systemctl start kubelet

[root@master02 ~]# systemctl start docker && systemctl start kubelet

[root@master03 ~]# systemctl start docker && systemctl start kubelet

查看服务状态

[root@master01 ~]# systemctl status docker && systemctl status kubelet

[root@master02 ~]# systemctl status docker && systemctl status kubelet

[root@master03 ~]# systemctl status docker && systemctl status kubelet

查看k8s集群是否恢复

[root@master01 ~]# kubectl get nodes

k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java

k8s外接etcd集群服务异常,使用snapshot恢复etcd集群,kubernetes,etcd,java

可以看到我们的k8s集群已经恢复,之前创建的pods也都存在,其中谢谢pods状态不正常,再继续排查。文章来源地址https://www.toymoban.com/news/detail-798352.html

到了这里,关于k8s外接etcd集群服务异常,使用snapshot恢复etcd集群的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s集群中etcd的备份与恢复

    创建备份目录mkdir /var/lib/etcd_backup 从etcd中的一个正常节点上备份etcd数据 停止所节点的kube-apiserver和etcd 备份原始etcd的路径中的文件 所有节点恢复etcd数据库 master01执行{etcd01节点} work01执行{etcd02节点} work02执行{etcd03节点} 为目录赋予权限 每个节点启动etcd 查看状态 启动kubeapi

    2024年02月11日
    浏览(37)
  • k8s-1.22.3集群etcd备份与恢复

    kubeadm-1.22.3-0.x86_64 kubelet-1.22.3-0.x86_64 kubectl-1.22.3-0.x86_64 kubernetes-cni-0.8.7-0.x86_64 主机名 IP VIP k8s-master01 192.168.10.61 192.168.10.70 k8s-master02 192.168.10.62 k8s-master03 192.168.10.63 k8s-node01 192.168.10.64 k8s-node02 192.168.10.65 注:etcd最新的API版本是v3,与v2相比,v3更高效更清晰。k8s默认使用的etcd

    2024年02月13日
    浏览(28)
  • 二进制搭建k8s集群 master和etcd

    etcd作为服务发现系统,有以下的特点: 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单。 安全:支持SSL证书验证。 快速:单实例支持每秒2k+读操作。 可靠:采用raft算法,实现分布式系统数据的可用性和一致性。 etcd目前默认使用2379端口提供HTTP API服务,

    2024年02月12日
    浏览(34)
  • K8S集群etcd 某个节点数据不一致如何修复 —— 筑梦之路

      二进制方式安装的k8s集群,etcd集群有3个节点,某天有一台机器hang住了,无法远程ssh登陆,于是被管理员直接重启了,重启后发现k8s集群删除一个deployment应用,多次刷新一会有,一会没有,于是在3个节点上执行etcd命令去查询该数据,发现被重启的节点上仍存在删除的该应

    2024年02月05日
    浏览(26)
  • k8s mysql集群 & 分布式锁 & apiserver & etcd 的关系

    在 Kubernetes (k8s) 中,MySQL 集群可以使用分布式锁来确保在多个实例之间对共享资源的互斥访问。这是通过结合 Kubernetes API Server 和 etcd 来实现的。 Kubernetes API Server 是 k8s 集群中的核心组件之一,它充当了集群的控制平面,提供了对集群资源的管理和操作接口。API Server 是一个

    2024年02月07日
    浏览(39)
  • k8s集群异常恢复

    前提、我自己的k8s采用的是单master节点+两个从节点部署,我针对单master情况进行恢复说明 场景一:正常开关虚拟机,可直接重启kubelet进行恢复 1、1、一般重启后三个节点都需要检查,输入命令检查kubelet: 2、状态不正常,输入命令启动kubelet: 3、正常情况下,启动kubelet后,

    2024年01月23日
    浏览(33)
  • etcd在高磁盘IO的情况下会导致K8S集群不可用的解决思路

    etcd是Kubernetes中用于存储集群状态信息的关键组件。高磁盘IO可能导致etcd性能下降,从而影响整个Kubernetes集群的稳定性。解决这个问题可以从多个方面入手: 优化etcd配置 :检查etcd的配置参数,确保其与您的硬件配置和集群规模相适应。可以调整etcd的并发限制、缓存大小等

    2024年02月15日
    浏览(26)
  • k8s集群使用ingress转发grafana服务

    在k8s集群中,使用ingress服务转发grafana的页面。 ingress方面增加路由规则和跨命名空间的service即可 grafana增加configmap挂载grafana.ini文件,增加匿名登陆配置和root_url配置 grafana.ini文件的yaml文件 grafana启动服务的yaml文件 我这里使用的pvc的存储类型是rook-ceph,使用其他存储类型的修

    2024年02月09日
    浏览(26)
  • k8s无法正常启动使用,排查:etcd损坏

    问题: 在跑项目的时候,机器意外断电了,重启后发现kubectl无法使用,报错如下: 排查: 1、 Unable to register node with API server\\\" err=“Post “https://192.168.18.101:6443/api/v1/nodes”: dial tcp 192.168.18.101:6443: connect: connection refused” node=\\\"k8s-master01 发现连接不到apiserver 2、然后我到docker容器

    2024年02月07日
    浏览(30)
  • 搭建NFS服务器,部署k8s集群,并在k8s中使用NFS作为持久化储存

    🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、k8s概述 2、NFS简介 二、NFS服务器搭建 1、准备NFS 服务器 2、搭建NFS服务 三、安装k8s集群 1、环境准备 2、禁用防火墙和SELinux 3、设置时间同步

    2024年04月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包