注:以下为k8s 1.16版本,并且是新加节点,无备份的操作

  • 备份

    • 配置etcd 3
      1
      2
      docker cp `docker ps |grep etcd |grep -v pause |awk '{print $1}'`:/usr/local/bin/etcdctl /tmp/
      export `cat /etc/kubernetes/manifests/etcd.yaml |grep ETCDCTL_API -A1 |xargs |sed 's/^.//g' |awk '{print $1 }'` ;echo $ETCDCTL_API
    • 获取etcd指令:
      1
      export etcdctl=`cat /etc/kubernetes/manifests/etcd.yaml |grep ETCDCTL_API -A1 |xargs  |sed  's/^.//g' |sed 's/ETCDCTL_API=3 /\/tmp\//g'`
    • 备份etcd:(最好/etc/kubernetes目录)
      1
      mkdir /back ; cd  /back ; $etcdctl snapshot save snapshot.db  
  • 根据ID删除坏的etcd节点:

    1
    2
    $etcdctl member list
    $etcdctl member remove <ID>
  • 删除坏掉的node节点:

    1
    kubectl delete nodes <node>
  • 使用ake将这个节点重新加回来

    1
    2
    ake addnodes
    ake join --apiserver 192.168.16.40:6443 --pkg-repo http://192.168.16.40:7000 --registry 192.168.16.40:60080 --debug
  • 给加入进来的node打上master的标签

    1
    kubectl label no <node> node-role.kubernetes.io/master= 

    如果/etc/kubernetes/有备份,以下步骤不需要 将其他节点的/etc/kubernetes/整个目录拷贝过来,并修改/etc/kubernetes/manifests/下yaml文件,将其中的相关的ip换成本机的ip

  • 重新添加etcd节点

    1
    $etcdctl member add 10.0.129.124 --peer-urls=https://10.0.129.124:2380
  • 重启kubelet

  • 重新签发etcd证书看文档,在执行脚本前添加当前机器的IP ,请看文档k8s 1.13证书升级(包含etcd证书)

    添加节点IP

  • 旧版本k8s可用:
    • 把其他 master 节点的 /etc/kubeadm/etcdcfg.yaml 拷贝过来,然后把其中的 ip 信息改成本机的 ip
    • 把其他 master 节点的 /etc/kubernetes/pki/etcd/ca.crt 和 /etc/kubernetes/pki/etcd/ca.key 拷贝过来
    • 然后使用 kubeadm init phase certs etcd-server etcd-peer apiserver-etcd-client –config /etc/kubeadm/etcdcfg.yaml 生成新的证书
    • 最后用 kubeadm init phase etcd local –config /etc/kubeadm/etcdcfg.yaml 生成新的 etcd manifest 就可以了