问题

etcd集群中某个etcd出现故障,使用docker ps -a | grep etcd | grep -v POD查看etcd节点,发现它异常退出。

1
2
3
$ docker logs -f <etcd-container-id>
....
etcdserver : open wal error: wal: file not found

恢复步骤

大方向步骤:
一、将问题etcd节点从etcd集群剥离;
二、将恢复的新的etcd节点添加到etcd集群。
具体步骤如下:

  1. 查看etcd状态

    1
    2
    3
    4
    $ etcdctl2 cluster-health
    $ ## 获取问题节点的member ID
    $ etcdctl2 member remove <member ID>
    $ ## 将问题etcd服务从etcd集群中删除
  2. 停止问题节点上的etcd服务

    1
    2
    $ mkdir -p /etc/origin/node/pods-stopped
    $ mv /etc/origin/node/pods/* /etc/origin/node/pods-stopped/
  3. 删除问题节点上的etcd数据

    1
    $ rm -rf /var/lib/etcd/*

    4.更新ansible中的inventory hosts内容,设置new_etcd配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    [OSEv3:children]
    masters
    etcd
    nodes
    new_etcd

    [OSEv3:vars]
    openshift_is_atomic=false

    [masters]
    master-1
    master-2
    master-3

    [nodes]
    master-1
    master-2
    master-3
    ...
    [etcd]
    master-1
    #master-2
    master-3

    [new_etcd]
    master-2

    需要注意:将问题节点从masters/nodes中注释掉,否则执行etcd扩容会报如下错误。
    TASK [Run variable sanity checks]
    fatal: [master-1]: FAILED! => {"msg": "last_checked_host: master-2, last_checked_var: ansible_python;'NoneType' object has no attribute '__getitem__'"}

  4. 更新节点的node group配置

    1
    $ ansible-playbook playbooks/openshift-master/openshift_node_group.yml
  5. 执行etcd扩容脚本

    1
    $ ansible-playbook playbooks/openshift-etcd/scaleup.yml
  6. 执行完成扩容后,进行验证。
    注意:如果在hosts中将masters对应的节点注释掉,在etcd安装时会使用本地服务的方式安装运行,这个适合独立的节点部署etcd。

etcd命令

etcd压测脚本

1
$ etcdctl --write-out=table check perf

参考文章

Adding etcd Hosts to existing cluster `