• 利用 member update 实现 etcd 灾难恢复 [ 也可实现 etcd 集群迁移 ]


    上集回顾

    • etcd 集群出现了故障,节点启动会有如下报错,一般是 member 信息不匹配,导致了集群异常,无法重启 etcd 集群

    member count is unequal

    本集预告

    • 如果 etcd 有做过 snapshot 快照,可以直接新建一套集群,直接还原快照即可,有时候没有快照,或没来的及快照,集群已经出现了问题,此时可以通过保留的 etcd data 数据目录下的文件,配合新 etcd 集群,使用 member update 可以在保留 etcd 数据的情况下初始化集群数据,重新构建 etcd 集群
    • 无论是 kubeadm 还是 二进制 的 k8s ,都可以通过这种方式来灾难恢复 etcd 集群,并且早期发现,在 pod 没有重启的情况下,也不会影响正在运行的 pod [ 会影响 master 组件的运行,因为 etcd 集群宕机,apiserver 服务会挂,也就无法使用 kubectl 命令管理 k8s 集群,当然,也无法使用 api 的方式,毕竟 apiserver 的端口也关了 ]

    L(老)B(b)Z(真)S(帅) - 来吧展示

    备份数据目录

    • kubeadm 安装的,默认 etcd 数据目录在 /var/lib/etcd 目录下,二进制部署的,要查看 service 文件指定的 --data-dir 参数指向的路径
    • 对比一下,哪个目录最大,就备份哪个,目录最大的,数据最新
    cp -r /var/lib/etcd/member /var/lib/member-bak
    
    • 1

    停止所有 etcd 服务

    • 如果是 二进制 部署的,只需要 systemctl stop etcd 即可,当然,以自己实际的环境为准,也许你的 service 文件配置的不是 etcd.service
    • kubeadm 部署的,只需要把 etcd.yaml 从 manifests 目录下移走即可
      • kubeadm 默认部署的路径是 /etc/kubernetes,记得检查自己的环境是否也是这个路径,不要只管 cv,啥也不看
    mv /etc/kubernetes/manifests/etcd.yaml /etc/kubernetes/
    
    • 1

    检查 etcd 是否都已经关闭

    # 这个方法只适合 kubeadm 部署的 k8s 环境,二进制的,需要通过 'ps -ef | grep etcd' 命令查看 etcd 进程是否还存在来验证
    docker ps -a | grep etcd
    
    • 1
    • 2

    创建新 etcd 节点

    • 切记,先配置并启动一个节点的 etcd,要等这个单节点 etcd 启动成功后,再做后面的节点加入操作
      • 如果是修复数据,可以在原节点操作,并且不需要使用 member update 命令
      • 如果是做 etcd 数据迁移,配置好新节点的一个 etcd 节点即可,数据迁移需要使用 member update 命令
    单节点 etcd
    • 如果是 二进制 etcd,需要修改 service 文件
    • 如果是 kubeadm 部署的 k8s ,需要修改前面移走的 etcd.yaml 文件,然后放到 manifests 目录下来启动 etcd

    注意以下配置,修改之前先备份一份, service 文件也记得备份,我的环境是 kubeadm 的,懒得搞一个二进制环境了,理解思路才是最重要的

    cp etcd.yaml{,.bak}
    vim etcd.yaml
    
    • 1
    • 2
    • 增加 --force-new-cluster 参数,这个参数,在 etcd 单节点启动成功后,再删掉,然后重启 etcd
      • 这个参数的意义是强制删除集群中的所有成员,并把自己加入到集群成员中
    • 增加 --initial-cluster-state=new 参数
      • new - 成员设置为 new,而不是加入已有集群
      • existing - 成员加入已有 etcd 集群
    spec:
      containers:
      - command:
        - etcd
        - --advertise-client-urls=https://192.168.11.135:2379
        - --cert-file=/etc/kubernetes/pki/etcd/server.crt
        - --client-cert-auth=true
        - --data-dir=/var/lib/etcd
        - --initial-advertise-peer-urls=https://192.168.11.135:2380
        - --initial-cluster=master-01=https://192.168.11.135:2380
        - --key-file=/etc/kubernetes/pki/etcd/server.key
        - --listen-client-urls=https://127.0.0.1:2379,https://192.168.11.135:2379
        - --listen-metrics-urls=http://127.0.0.1:2381
        - --listen-peer-urls=https://192.168.11.135:2380
        - --name=master-01
        - --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
        # 主要是这两个参数,上面的以自己环境的为准,都配置为当前节点的 ip,和自己的证书路径
        - --initial-cluster-state=new
        - --force-new-cluster
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    启动 etcd 服务,切记,就启动一个节点,其他节点,等这个单节点启动成功后,需要修改配置才可以加入到这个单节点的 etcd ,然后才能组成一套集群

    cp /etc/kubernetes/etcd.yaml /etc/kubernetes/manifests/
    
    • 1

    查看 etcd 是否启动成功

    二进制部署的,可以看进程或者端口,kubeadm 部署的,使用下面的方式

    docker ps -a | grep etcd
    
    • 1

    查看 member 信息

    本地如果没有 etcdctl 命令,可以从容器内复制一个 [ 二进制部署的,一般都自带 etcdctl 命令,如果没有的话,下载一个二进制文件就可以了 ]

    docker cp $(docker ps | awk '/etcd --/ {print $1}'):/usr/local/bin/etcdctl /etc/kubernetes/pki/etcd/etcdctl 
    chmod +x /etc/kubernetes/pki/etcd/etcdctl
    cd /etc/kubernetes/pki/etcd/
    
    • 1
    • 2
    • 3
    # ip 和证书改为自己环境的配置,切莫纯 cv
    ./etcdctl \
    --cacert ./ca.crt \
    --cert ./server.crt \
    --key ./server.key \
    --endpoints https://192.168.11.135:2379 \
    member list
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可以看到,peerurl 的 ip 和 server 的 ip 是不一样的

    cde66358cffbaacf, started, master-01, https://192.168.11.131:2380, https://192.168.11.135:2379, false
    
    • 1

    执行 member update 命令来更新 peerurl 的地址

    # ip 和证书改为自己环境的配置,member id 也已自己上面的命令获取的为准,切莫纯 cv
    ./etcdctl \
    --cacert ./ca.crt \
    --cert ./server.crt \
    --key ./server.key \
    --endpoints https://192.168.11.135:2379 \
    member update cde66358cffbaacf --peer-urls=https://192.168.11.135:2380
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    删除 -force-new-cluster 参数,避免下次 etcd 重启的时候,集群成员被初始化,这里就不留下我的操作足迹了,但是大家一定一定要记得删掉这个参数,然后重启 etcd

    将其他成员加入到 etcd 集群

    下面的操作,还是继续在已经启动的这个单节点的 etcd 机器上操作,也可以在其他节点操作,只要有证书,有 etcdctl 命令,哪里都可以操作

    # ip 和证书改为自己环境的配置,切莫纯 cv
    ./etcdctl \
    --cacert ./ca.crt \
    --cert ./server.crt \
    --key ./server.key \
    --endpoints https://192.168.11.135:2379 \
    member add master-02 --peer-urls=https://192.168.11.133:2380
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    准备加入的节点,记得 etcd 的 data 目录下不要有数据

    下面的操作在 需要加入 etcd 成员的节点操作

    确保 data 目录为空

    rm -rf /var/lib/etcd/member/*
    vim etcd.yaml
    
    • 1
    • 2
    • 增加 --initial-cluster-state=new 参数
      • new - 成员设置为 new,而不是加入已有集群
      • existing - 成员加入已有 etcd 集群
    spec:
      containers:
      - command:
        - etcd
        - --advertise-client-urls=https://192.168.11.133:2379
        - --cert-file=/etc/kubernetes/pki/etcd/server.crt
        - --client-cert-auth=true
        - --data-dir=/var/lib/etcd
        - --initial-advertise-peer-urls=https://192.168.11.133:2380
        - --initial-cluster=master-02=https://192.168.11.133:2380,master-01=https://192.168.11.135:2380
        # 需要增加这个参数,切记,不能是 new,要是 existing,不然 etcd 会起不来
        - --initial-cluster-state=existing
        - --key-file=/etc/kubernetes/pki/etcd/server.key
        - --listen-client-urls=https://127.0.0.1:2379,https://192.168.11.133:2379
        - --listen-metrics-urls=http://127.0.0.1:2381
        - --listen-peer-urls=https://192.168.11.133:2380
        - --name=master-02
        - --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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    重启 etcd ,查看 etcd 是否正常

    # ip 和证书改为自己环境的配置,切莫纯 cv
    ./etcdctl \
    --cacert ./ca.crt \
    --cert ./server.crt \
    --key ./server.key \
    --endpoints https://192.168.11.135:2379 \
    member list
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可看到,两个节点都是 started 状态了,如果还有节点需要加入,重复执行成员加入 etcd 集群的操作即可

    47785658ea2ca7f0, started, master-02, https://192.168.11.133:2380, https://192.168.11.133:2379, false
    cde66358cffbaacf, started, master-01, https://192.168.11.135:2380, https://192.168.11.135:2379, false
    
    • 1
    • 2
  • 相关阅读:
    【机器学习科学库】全md文档笔记:Jupyter Notebook和Matplotlib使用(已分享,附代码)
    C++ 内存池
    得帆云iPaaS白皮书|WMS集成,打造高效规范的仓储管理业务生态
    python之排序
    IPC protocol for local host
    Java亿级流量架构之网关设计思路
    真实感受:是智能家居在选择合适的技术!
    神经网络计算棒怎么用,神经网络教学视频
    普通人怎么在一年内赚到100万?
    CSP-J第二轮试题-2019年-3题
  • 原文地址:https://blog.csdn.net/u010383467/article/details/126439342