惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
The Register - Security
The Register - Security
G
Google Developers Blog
罗磊的独立博客
WordPress大学
WordPress大学
L
LangChain Blog
博客园 - 三生石上(FineUI控件)
Recorded Future
Recorded Future
Microsoft Azure Blog
Microsoft Azure Blog
Google DeepMind News
Google DeepMind News
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
Recent Announcements
Recent Announcements
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
云风的 BLOG
云风的 BLOG
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
F
Full Disclosure
The Cloudflare Blog
B
Blog RSS Feed
S
Schneier on Security
T
Tenable Blog
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
T
Tor Project blog
N
Netflix TechBlog - Medium
T
Threatpost
NISL@THU
NISL@THU
Stack Overflow Blog
Stack Overflow Blog
N
News | PayPal Newsroom
N
News and Events Feed by Topic
aimingoo的专栏
aimingoo的专栏
博客园 - 叶小钗
P
Privacy & Cybersecurity Law Blog
C
CERT Recently Published Vulnerability Notes
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Privacy International News Feed
博客园 - 【当耐特】
Help Net Security
Help Net Security
The Hacker News
The Hacker News
Hugging Face - Blog
Hugging Face - Blog
TaoSecurity Blog
TaoSecurity Blog
S
Secure Thoughts
C
Cisco Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events

博客园 - lswweb

Drone概念与答疑 Drone基于K8S的Secrets管理 Centos8通过X11使用GUI应用 Linux自己常用命令记录(待续) K8S Master节点灾备与恢复 - Host文件Copy Rook Ceph出现daemons have recently crashed异常 Ceph rbd删除image遭遇watchers异常处理 Ceph OSD更换硬盘后遭遇PG Inconsistent异常与处理 Rook Ceph OSD异常,格式化osd硬盘重新挂载 进入K8S Pod执行操作,遭遇Operation not permitted错误 K8S Pod挂载rook ceph pv报not found in the list of registered CSI drivers异常处理 Vs中调试MVC源代码步骤 手动创建vsct文件 快速查找找VS菜单信息(Guid、GuidId、CmdId等) 在多排序条件下SQL获文章上一条、下一条记录 Knockout中ViewModel与Model的互转 Asp.Net MVC 表单验证 AjaxOptions.OnSuccess回调方法返回的参数信息 一次自定义Configuration的悲惨经历。
K8S Master节点灾备与恢复 - ETCD
lswweb · 2020-11-27 · via 博客园 - lswweb

       上次搞了个Host文件Copy的方式来对Master节点进行备份和恢复,但是它个严重的问题就在备份前需要将etcd容器停止掉,否则会出现etcd恢复异常。今天我们就来看看另外一种不需要停止的备份方式etcd snapshot。

如何备份?

       ETCD不停机备份就需要使用etcdctl命令生成snapshot,我们就需要进入到ETCD容器当中去执行命令。备份需要定时执行,那么我们就通过K8S的CronJob定时任务。

1、构建CronJob,定义每3分钟执行一次

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: etcd-backup
  namespace: kube-system
spec:
  schedule: "*/3 * * * *"
  jobTemplate:
    spec:

2、备份前我们先通过Init Pod做一些预处理操作

      注:这些操作更适合执行etcd备份后操作。但是etcd的镜像采用的是阉割的bash系统,连最基的ls,data等命令都没有,所以只能通过Init Pod在下次执行备份时处理上次备份遗留的问题。

template: spec: initContainers: - name: init image: busybox imagePullPolicy: IfNotPresent command: ["sh"] args: - "-c"
#保留最新的十个文件,删除其它历史备份
#如果目录存在snapshot.db文件,则根据它的创建日期重命名(如:202011251831.db) - "cd /backups;ls -t | tail -n +11 | xargs rm -rf;file=$(ls -l snapshot.db --full-time | awk '{print $6,substr($7,0,5);}' | sed 's/[ :-]//g');if [ -n \"$file\" ]; then mv snapshot.db ${file}.db;fi;" volumeMounts: - mountPath: /backups name: backup

3、k8s master etcd是静态pod形式运行,从/etc/kubernetes/manifests/etcd.yaml文件中找到k8s集群使用的etcd镜像版本

          containers:
          - name: backup
            image: k8s.gcr.io/etcd:3.4.13-0
            imagePullPolicy: IfNotPresent
            env:
            - name: ETCDCTL_API
              value: "3

4、使用pod command执行shell,连接master节点etcd,并使用etcdctl执行备份

     这里备份名字固定命名用snapshot.db,下次备份时通过init pod来进行改名。网上很多文章中直接用date函数生成日期形式的备份文件名,那很可能是没作用的,因为etcd采用的bash基础镜像已经删除了date函数

            command: ["/bin/sh"]
            args: ["-c", "etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save /backups/snapshot.db;"]

5、在备份etcd时需要使用到连接master etcd server的证书信息,和备份目录,我们需要把Host目录挂载进pod

            volumeMounts:
            - mountPath: /etc/kubernetes/pki/etcd
              name: etcd-certs
              readOnly: true
            - mountPath: /backups
              name: backup

6、为了可以使用127.0.0.1:2379访问到etcd服务端,我们需要将Pod调度到master节点并且使用hostNetwork

          restartPolicy: OnFailure
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: "node-role.kubernetes.io/master"
                    operator: Exists
          tolerations:
          - effect: NoSchedule
            operator: Exists
          hostNetwork: true

7、定义volumeMounts

          volumes:
          - name: etcd-certs
            hostPath:
              path: /etc/kubernetes/pki/etcd
              type: DirectoryOrCreate
          - name: backup
            hostPath:
              path: /home/shendu/backups/etcd
              type: DirectoryOrCreate

如何恢复?

1、恢复/etc/kubernetes/pki/etcd/目录下的证书信息

2、恢复备份至 /var/lib/etcd目录

mkdir -p /var/lib/etcd
docker run --rm \
    -v '/home/shendu/backups/etcd:/backups' \
    -v '/var/lib/etcd:/var/lib/etcd' \
    --env ETCDCTL_API=3 \
    'k8s.gcr.io/etcd:3.4.13-0' \
    /bin/sh -c "etcdctl snapshot restore '/backups/202011271604.db' ; mv /default.etcd/member/ /var/lib/etcd/"

3、根据现有etcd构建master节点

kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd