Openshift:可靠的Kubernetes发行版k8s-openshift-okd

Openshift集群全环境恢复

2019-03-05  本文已影响193人  潘晓华Michael
敏捷自动化

阅读前说明

Openshift集群平台能够使用备份完整恢复集群。Openshift集群全环境备份

在恢复集群之前,请确保对集群做过完成的备份,并重新安装Openshift集群。

恢复Master节点

创建Master主机文件的备份后,如果它们被损坏或意外删除,就可以通过这些文件复制回Master主机来恢复文件,然后重新启动受影响的服务。

恢复过程

  1. 恢复/etc/origin/master/master-config.yaml文件

    $ MYBACKUPDIR=*/backup/$(hostname)/$(date +%Y%m%d)*
    $ cp /etc/origin/master/master-config.yaml /etc/origin/master/master-config.yaml.old
    $ cp /backup/$(hostname)/$(date +%Y%m%d)/origin/master/master-config.yaml /etc/origin/master/master-config.yaml
    $ master-restart api
    $ master-restart controllers
    

    重启master服务可能会导致停机,此时可以将该主机从负载均衡池中删除,再恢复主机,待恢复完成后,Master服务也起来了,再将它添加到负载均衡池中。

  2. 如果因为缺少一些二进制包,而导致无法启动Master服务,那么重新安装缺少的包

    • 获得当前已有的包

      $ rpm -qa | sort > /tmp/current_packages.txt
      
    • 与之前备份的包列表作比较,得到缺少的包

      $ diff /tmp/current_packages.txt ${MYBACKUPDIR}/packages.txt
      > ansible-2.4.0.0-5.el7.noarch
      
    • 安装缺少的包

      $ yum reinstall -y <packages>
      
  3. 恢复系统信任的证书

    $ MYBACKUPDIR=*/backup/$(hostname)/$(date +%Y%m%d)*
    $ sudo cp ${MYBACKUPDIR}/external_certificates/my_company.crt /etc/pki/ca-trust/source/anchors/
    $ sudo update-ca-trust
    

恢复计算节点

一般计算节点不需要做恢复,但是如果有特殊的重要节点需要恢复的话,与Master节点恢复过程类似。

恢复过程

  1. 恢复/etc/origin/node/node-config.yaml文件

    $ MYBACKUPDIR=/backup/$(hostname)/$(date +%Y%m%d)
    $ cp /etc/origin/node/node-config.yaml /etc/origin/node/node-config.yaml.old
    $ cp /backup/$(hostname)/$(date +%Y%m%d)/etc/origin/node/node-config.yaml /etc/origin/node/node-config.yaml
    $ reboot
    
    
  2. 如果因为缺少一些二进制包,而导致无法启动Master服务,那么重新安装缺少的包

    • 获得当前已有的包

      $ rpm -qa | sort > /tmp/current_packages.txt
      
    • 与之前备份的包列表作比较,得到缺少的包

      $ diff /tmp/current_packages.txt ${MYBACKUPDIR}/packages.txt
      > ansible-2.4.0.0-5.el7.noarch
      
    • 安装缺少的包

      $ yum reinstall -y <packages>
      
  3. 恢复系统信任的证书

    $ MYBACKUPDIR=*/backup/$(hostname)/$(date +%Y%m%d)*
    $ sudo cp ${MYBACKUPDIR}/external_certificates/my_company.crt /etc/pki/ca-trust/source/anchors/
    $ sudo update-ca-trust
    

恢复etcd数据

恢复过程

使用Ansible添加etcd节点

还原etcd数据后,可以使用ansible或者手动的方式对etcd进行扩容。

添加过程

  1. 在inventory的hosts中添加[new_etcd]服务器组

    [OSEv3:children]
    masters
    nodes
    etcd
    new_etcd 
    
    ... [OUTPUT ABBREVIATED] ...
    
    [etcd]
    master-0.example.com
    master-1.example.com
    master-2.example.com
    
    [new_etcd] 
    etcd0.example.com 
    
  2. 执行ansible扩容ansible脚本

    $ cd /usr/share/ansible/openshift-ansible
    $ ansible-playbook  playbooks/openshift-etcd/scaleup.yml
    
  3. 将[new_etcd]服务器组的主机移到[etcd]组

    [OSEv3:children]
    masters
    nodes
    etcd
    new_etcd
    
    ... [OUTPUT ABBREVIATED] ...
    
    [etcd]
    master-0.example.com
    master-1.example.com
    master-2.example.com
    etcd0.example.com
    

恢复Openshift集群节点上的服务

恢复过程

  1. 在每一个Master节点恢复配置文件及重启相关服务

    $ cp ${MYBACKUPDIR}/etc/origin/node/pods/* /etc/origin/node/pods/
    $ cp ${MYBACKUPDIR}/etc/origin/master/master.env /etc/origin/master/master.env
    $ cp ${MYBACKUPDIR}/etc/origin/master/master-config.yaml.<timestamp> /etc/origin/master/master-config.yaml
    $ cp ${MYBACKUPDIR}/etc/origin/node/node-config.yaml.<timestamp> /etc/origin/node/node-config.yaml
    $ cp ${MYBACKUPDIR}/etc/origin/master/scheduler.json.<timestamp> /etc/origin/master/scheduler.json
    $ master-restart api
    $ master-restart controllers
    
  2. 在每一个Node节点,恢复配置文件,并重启origin-node服务

    $ cp /etc/origin/node/node-config.yaml.<timestamp> /etc/origin/node/node-config.yaml
    $ systemctl enable atomic-openshift-node
    $ systemctl start atomic-openshift-node
    

恢复项目Project

恢复项目前,先创建项目,再通过oc create -f命令将项目中的对象恢复。恢复项目时要注意对象的依赖关系,比如说pod依赖configmap资源,就需要先创建configmap。

恢复过程

$ oc new-project <projectname>
$ oc create -f project.yaml
$ oc create -f secret.yaml
$ oc create -f serviceaccount.yaml
$ oc create -f pvc.yaml
$ oc create -f rolebindings.yaml

恢复应用数据

与备份应用数据类似,可以使用oc rsync命令来恢复应用数据。

以下是一个利用jenkins应用的备份数据恢复应用的例子。

恢复过程

  1. 检查备份数据

    $ ls -la /tmp/jenkins-backup/
    total 8
    drwxrwxr-x.  3 user     user   20 Sep  6 11:14 .
    drwxrwxrwt. 17 root     root 4096 Sep  6 11:16 ..
    drwxrwsrwx. 12 user     user 4096 Sep  6 11:14 jenkins
    
  2. 使用oc rsync恢复应用数据

    $ oc rsync /tmp/jenkins-backup/jenkins jenkins-1-37nux:/var/lib
    
  3. 重启应用

    $ oc delete pod jenkins-1-37nux
    

    或者使用oc scale命令将pod数调整为0,再调整为1,实现应用的重启

    $ oc scale --replicas=0 dc/jenkins
    $ oc scale --replicas=1 dc/jenkins
    

恢复持久化卷数据

如果应用已挂载了新的PV,那就将该PV原来的数据删除,之后将备份的数据拷贝到对应的目录;如果应用没有挂载PV,那就先挂载一个PV,再恢复数据。

恢复过程

  1. 如果没有挂载PV执行创建新的挂载

    $ oc set volume dc/demo --add --name=persistent-volume \
         --type=persistentVolumeClaim --claim-name=filestore \ --mount-path=/opt/app-root/src/uploaded --overwrite
    
  2. 删除当前PV挂载目录下的数据

    $ oc rsh demo-2-fxx6d
    sh-4.2$ ls */opt/app-root/src/uploaded/*
    lost+found  ocp_sop.txt
    sh-4.2$ *rm -rf /opt/app-root/src/uploaded/ocp_sop.txt*
    sh-4.2$ *ls /opt/app-root/src/uploaded/*
    lost+found
    
  3. 将之前备份的数据拷贝到对应的目录下

    $ oc rsync uploaded demo-2-fxx6d:/opt/app-root/src/
    
  4. 验证应用数据

    $ oc rsh demo-2-fxx6d
    sh-4.2$ *ls /opt/app-root/src/uploaded/*
    lost+found  ocp_sop.txt
    

实战演练步骤

  1. 部署安装3Master 1etcd及2个Node节点的Openshift集群
  2. 使用恢复etcd数据中的根据v3的快照snapshot恢复恢复etcd数据
  3. 按照使用Ansible添加etcd节点中的步骤将1个etcd节点扩容为3个etcd节点
  4. 清理恢复中的Openshift集群中的token,并重启相关pod,实现Openshift集群的完整恢复。

一键恢复与解决证书问题的脚本

一键恢复etcd

[root@master01 ~]# cat restore_etcd.sh 
#!/bin/bash
snapshot_file_dir=$1
if [ $# -lt 1 ]
then
    echo "Please input snapshot file path"
    exit 2
fi

export ETCD_POD_MANIFEST="/etc/origin/node/pods/etcd.yaml"
mv ${ETCD_POD_MANIFEST} .
rm -rf /var/lib/etcd

## 获取etcd相关初始化配置项
ETCD_CONFIG_FILE="/etc/etcd/etcd.conf"
etcd_data_dir=$(grep ^ETCD_DATA_DIR= $ETCD_CONFIG_FILE|cut -d= -f2)
etcd_name=$(grep ^ETCD_NAME= $ETCD_CONFIG_FILE|cut -d= -f2)
etcd_initial_cluster=$(grep ^ETCD_INITIAL_CLUSTER= $ETCD_CONFIG_FILE|awk -F'ETCD_INITIAL_CLUSTER=' '{print $2}')
etcd_initial_cluster_token=$(grep ^ETCD_INITIAL_CLUSTER_TOKEN= $ETCD_CONFIG_FILE|cut -d= -f2)
etcd_initial_advertise_peer_urls=$(grep ^ETCD_INITIAL_ADVERTISE_PEER_URLS= $ETCD_CONFIG_FILE|cut -d= -f2)

## 恢复etcd数据
export ETCDCTL_API=3
etcdctl snapshot restore $snapshot_file_dir --data-dir $etcd_data_dir --name $etcd_name --initial-cluster "$etcd_initial_cluster" --initial-cluster-token "$etcd_initial_cluster_token" --initial-advertise-peer-urls $etcd_initial_advertise_peer_urls --skip-hash-check=true

chown -R etcd.etcd /var/lib/etcd/
restorecon -Rv /var/lib/etcd

mv etcd.yaml $ETCD_POD_MANIFEST

一键整理etcd数据,解决证书问题

[root@master01 ~]# cat reset.sh 
#!/bin/bash
oc login -u system:admin

projects=$(oc get projects | awk '{print $1}' | grep -v kube-system|grep -v NAME)

for project in $(echo $projects)
do
  oc delete secret $(oc get secret -n $project | grep token | awk '{print $1}') -n $project
  oc delete pod $(oc get pod -n $project | grep -v NAME | awk '{print $1}') -n $project --force --grace-period=0
done

参考文章

Openshift官方文档之恢复集群

上一篇 下一篇

猜你喜欢

热点阅读