文档章节

Kubernetes探秘—etcd状态数据及其备份

openthings
 openthings
发布于 2018/12/05 16:08
字数 1685
阅读 1422
收藏 3

Kubernetes使用etcd来存储集群的实时运行数据(如节点状态信息),而其它pod都是无状态的、可以根据负载调度,在多个节点(node)间进行漂移。etcd本身是可以部署为无中心的多节点互备集群,从而消除整个集群的单一故障点。在kubeadm的缺省部署下,只在master上运行一个etcd实例(etcd-xxx),可以使用kubectl get pod -n kube-system 查看运行状态。

1、查看etcd服务容器信息

下面我们来探索一下kubernetes的etcd实例到底是如何实现和管理的。在kubernetes的master节点上输入:

kubectl describe pod/etcd-podc01 -n kube-system > etcd.txt

输出如下:

Name:               etcd-podc01
Namespace:          kube-system
Priority:           2000000000
PriorityClassName:  system-cluster-critical
Node:               podc01/10.1.1.181
Start Time:         Mon, 03 Dec 2018 10:42:05 +0800
Labels:             component=etcd
                    tier=control-plane
Annotations:        kubernetes.io/config.hash: bcc0eea4c53f3b70d13b771ad88e31b7
                    kubernetes.io/config.mirror: bcc0eea4c53f3b70d13b771ad88e31b7
                    kubernetes.io/config.seen: 2018-12-05T11:05:31.8690622+08:00
                    kubernetes.io/config.source: file
                    scheduler.alpha.kubernetes.io/critical-pod: 
Status:             Running
IP:                 10.1.1.181
Containers:
  etcd:
    Container ID:  docker://8f301c91902a9399f144943013166a09dd0766a9b96c26fe2d8e335418a55cab
    Image:         k8s.gcr.io/etcd:3.2.24
    Image ID:      docker-pullable://registry.cn-hangzhou.aliyuncs.com/openthings/k8s-gcr-io-etcd@sha256:7b073bdab8c52dc23dfb3e2101597d30304437869ad8c0b425301e96a066c408
    Port:          <none>
    Host Port:     <none>
    Command:
      etcd
      --advertise-client-urls=https://127.0.0.1:2379
      --cert-file=/etc/kubernetes/pki/etcd/server.crt
      --client-cert-auth=true
      --data-dir=/var/lib/etcd
      --initial-advertise-peer-urls=https://127.0.0.1:2380
      --initial-cluster=podc01=https://127.0.0.1:2380
      --key-file=/etc/kubernetes/pki/etcd/server.key
      --listen-client-urls=https://127.0.0.1:2379
      --listen-peer-urls=https://127.0.0.1:2380
      --name=podc01
      --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
    State:          Running
      Started:      Wed, 05 Dec 2018 11:05:35 +0800
    Ready:          True
    Restart Count:  0
    Liveness:       exec [/bin/sh -ec ETCDCTL_API=3 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 get foo] delay=15s timeout=15s period=10s #success=1 #failure=8
    Environment:    <none>
    Mounts:
      /etc/kubernetes/pki/etcd from etcd-certs (rw)
      /var/lib/etcd from etcd-data (rw)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  etcd-data:
    Type:          HostPath (bare host directory volume)
    Path:          /var/lib/etcd
    HostPathType:  DirectoryOrCreate
  etcd-certs:
    Type:          HostPath (bare host directory volume)
    Path:          /etc/kubernetes/pki/etcd
    HostPathType:  DirectoryOrCreate
QoS Class:         BestEffort
Node-Selectors:    <none>
Tolerations:       :NoExecute
Events:            <none>

可以看到,etcd是使用的host-network网络,然后把系统参数和数据等都映射到了宿主机的目录(配置参数位于宿主机的/var/lib/etcd,证书文件位于/etc/kubernetes/pki/etcd)。

2、查看etcd配置参数文件

在宿主机下输入  sudo ls -l /var/lib/etcd/member/snap 可以看到etcd服务所产生的快照文件,如下所示:

supermap@podc01:~/openthings/kubernetes-tools/jupyter$ sudo ls -l /var/lib/etcd/member/snap
总用量 8924
-rw-r--r-- 1 root root     8160 12月  5 09:19 0000000000000005-00000000001fbdd0.snap
-rw-r--r-- 1 root root     8160 12月  5 10:37 0000000000000005-00000000001fe4e1.snap
-rw-r--r-- 1 root root     8508 12月  5 11:42 0000000000000006-0000000000200bf2.snap
-rw-r--r-- 1 root root     8509 12月  5 12:49 0000000000000006-0000000000203303.snap
-rw-r--r-- 1 root root     8509 12月  5 13:56 0000000000000006-0000000000205a14.snap
-rw------- 1 root root 24977408 12月  5 14:13 db

查看etcd的证书文件:

supermap@podc01:~/openthings/kubernetes-tools/jupyter$ ls -l /etc/kubernetes/pki/etcd
总用量 32
-rw-r--r-- 1 root root 1017 11月 23 10:08 ca.crt
-rw------- 1 root root 1679 11月 23 10:08 ca.key
-rw-r--r-- 1 root root 1094 11月 23 10:08 healthcheck-client.crt
-rw------- 1 root root 1679 11月 23 10:08 healthcheck-client.key
-rw-r--r-- 1 root root 1127 11月 23 10:08 peer.crt
-rw------- 1 root root 1679 11月 23 10:08 peer.key
-rw-r--r-- 1 root root 1119 11月 23 10:08 server.crt
-rw------- 1 root root 1675 11月 23 10:08 server.key

这些文件和从Kubernetes的pod命令行进去看到的是完全一样的(本来就是同一个目录)。

3、直接访问etcd的服务

下一步,我们来连接到这个实例,查看具体的运行信息。

首先,安装etcd-client,这是etcd的独立客户端。

sudo apt  install etcd-client

然后,连接到etcd实例(endpoints为上面所显示的地址参数:advertise-client-urls):

sudo etcdctl --endpoints https://127.0.0.1:2379 --cert-file=/etc/kubernetes/pki/etcd/server.crt --key-file=/etc/kubernetes/pki/etcd/server.key --ca-file=/etc/kubernetes/pki/etcd/ca.crt member list
  • 注意:因为kubernetes集群使用https,因此需要指定--cert-file、--key-file和--ca-file三个参数,参数文件都位于 /etc/kubernetes/pki/etcd目录下。

我这里的输出为:

a874c87fd42044f: name=podc01 peerURLs=https://127.0.0.1:2380 clientURLs=https://127.0.0.1:2379 isLeader=true

可以照此输入其他命令,来访问由kubernetes所启动的实例(实际运行时由kubelet服务控制)。

4、备份与恢复

知道了上面的秘密,备份etcd 就不难了。有三个办法:

  • 可以直接备份/etc/kubernetes/pki/etcd/var/lib/etcd下的文件内容
    • 对于多节点的etcd服务,不能使用直接备份和恢复目录文件的方法。
    • 备份之前先使用docker stop停止相应的服务,然后再启动即可。
      • 如果停止etcd服务,备份过程中服务会中断。
    • 缺省配置情况下,每隔10000次改变,etcd将会产生一个snap。
      • 如果只备份/var/lib/etcd/member/snap下的文件,不需要停止服务。
  • 通过etcd-client客户端备份。如下(注意,snapshot是在API3里支持的,cert/key/cacert 三个参数名称与API2的命令不同):
sudo ETCDCTL_API=3 etcdctl snapshot save "/home/supermap/k8s-backup/data/etcd-snapshot/$(date +%Y%m%d_%H%M%S)_snapshot.db" --endpoints=127.0.0.1:2379 --cert="/etc/kubernetes/pki/etcd/server.crt" --key="/etc/kubernetes/pki/etcd/server.key" --cacert="/etc/kubernetes/pki/etcd/ca.crt"

使用kubernetes的cronjob实现定期自动化备份需要对images和启动参数有一些调整,我修改后的yaml文件如下:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: etcd-disaster-recovery
  namespace: cronjob
spec:
 schedule: "0 22 * * *"
 jobTemplate:
  spec:
    template:
      metadata:
       labels:
        app: etcd-disaster-recovery
      spec:
        affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                  nodeSelectorTerms:
                  - matchExpressions:
                    - key: kubernetes.io/hostname
                      operator: In
                      values:
                      - podc01
        containers:
        - name: etcd
          image: k8s.gcr.io/etcd:3.2.24
          imagePullPolicy: "IfNotPresent"
          command:
          - sh
          - -c
          - "export ETCDCTL_API=3; \
             etcdctl --endpoints=$ENDPOINT \
             --cert=/etc/kubernetes/pki/etcd/server.crt \
             --key=/etc/kubernetes/pki/etcd/server.key \
             --cacert=/etc/kubernetes/pki/etcd/ca.crt \
             snapshot save /snapshot/$(date +%Y%m%d_%H%M%S)_snapshot.db; \
             echo etcd backup success"
          env:
          - name: ENDPOINT
            value: "https://127.0.0.1:2379"
          volumeMounts:
            - mountPath: "/etc/kubernetes/pki/etcd"
              name: etcd-certs
            - mountPath: "/var/lib/etcd"
              name: etcd-data
            - mountPath: "/snapshot"
              name: snapshot
              subPath: data/etcd-snapshot
            - mountPath: /etc/localtime
              name: lt-config
            - mountPath: /etc/timezone
              name: tz-config
        restartPolicy: OnFailure
        volumes:
          - name: etcd-certs
            hostPath:
              path: /etc/kubernetes/pki/etcd
          - name: etcd-data
            hostPath:
              path: /var/lib/etcd
          - name: snapshot
            hostPath:
              path: /home/supermap/k8s-backup
          - name: lt-config
            hostPath:
              path: /etc/localtime
          - name: tz-config
            hostPath:
              path: /etc/timezone
        hostNetwork: true

除此之外,这样Kubernetes的etcd主数据库就备份完成了。

不过,完整地备份和恢复kubernetes集群还需要一些其它的操作,对于每一个运行的应用都还需要执行单独的备份操作。

5、更多参考内容

 

© 著作权归作者所有

openthings
粉丝 323
博文 1140
码字总数 689435
作品 1
东城
架构师
私信 提问
Kubernetes的etcd数据查看和迁移

Kubernetes的集群元数据都保存在etcd中,我们可以直接访问来查看数据。 1、查看etcd数据 kubeadm默认安装 方法如下: 因为Kubernetes中的etcd 实例使用了https,需要指定证书等信息,即cacer...

openthings
2018/12/11
1K
0
Keepalived快速使用(Ubuntu18.04)

Keepalived是一个用于虚拟IP自动切换的软件,可以在多个节点指定一个虚拟IP地址,遇到主节点故障时将该虚拟IP漂移到其它可用的节点,从而保障服务可以持续,用于k8s中master节点的服务IP(即...

openthings
2018/12/13
448
0
Kubernetes集群的主节点备份与恢复

通常安装模式下(如使用kubeadm)的Kubernetes集群,主节点(Master)只有一个,而且集群数据存储服务etcd也只运行了一个实例。如果遇到极端情况(如整机故障、主硬盘损坏、数据误删除等)导...

openthings
2018/12/06
504
0
Kubernetes中使用CronJob定时备份etcd集群数据

Kubernetes中使用CronJob定时备份etcd集群数据 注意:这里的内容已经过时! 使用kubernetes1.12.3和etcd3.2.24请参考 Kubernetes的etcd探秘-状态数据备份 。 kubernetes中部署的应用的信息都...

openthings
2018/09/09
403
3
Kubernetes探秘—配置文件目录结构

Kubernetes的配置目录包括/etc/kubernetes、/home/supermap/.kube和/var/lib/kubelet目录。 下面我们来看一看,这些目录里到底有些什么文件(操作系统使用Ubuntu 18.04LTS desktop)。 安装t...

openthings
2018/12/06
256
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
5
0
前端技术之:webpack热模块替换(HMR)

第一步:安装HMR中间件: npm install --save-dev webpack-hot-middleware 第二步:webpack配置中引入webpack对象 const webpack = require('webpack’); 第三步:增加devServer配置项: ho......

popgis
昨天
5
0
死磕 java线程系列之线程池深入解析——体系结构

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 Java的线程池是块硬骨头,对线程池的源码做深入研究不仅能提高对Java整个并发编程的理解,也能提高自己...

彤哥读源码
昨天
6
0
虚函数表 图解

虚函数表 图解 p504

天王盖地虎626
昨天
5
0
java反射

学习目标  什么是反射  反射运行原理  了解反射机制的相关类  获取 class 对象的 3 种方式  通过反射获取构造方法并使用  通过反射获取成员变量并调用  通过反射获取成员方法并...

流川偑
昨天
5
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部