共计 7016 个字符,预计需要花费 18 分钟才能阅读完成。
本篇内容介绍了“Kubernetes 的 etcd 状态数据及其备份是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
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 下的文件内容。
如果只备份 /var/lib/etcd/member/snap 下的文件,不需要停止服务。
如果停止 etcd 服务,备份过程中服务会中断。
对于多节点的 etcd 服务,不能使用直接备份和恢复目录文件的方法。
备份之前先使用 docker stop 停止相应的服务,然后再启动即可。
缺省配置情况下,每隔 10000 次改变,etcd 将会产生一个 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 实现定期自动化备份。
使用 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 集群还需要一些其它的操作,对于每一个运行的应用都还需要执行单独的备份操作。
“Kubernetes 的 etcd 状态数据及其备份是怎样的”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!