kubeadm 部署的 k8s ,etcd 是封装在 pod 中
从 pod 中拿到 etcdctl,先查看在 pod 中 etcdctl 的位置
获取 etcdctl 并放入/usr/bin下
- kubectl -n kube-system cp etcd-k8s-master:/usr/local/bin/etcdctl /usr/bin/etcdctl
-
- chmod +x /usr/bin/etcdctl
输入 etcdctl 提示需要指定版本,etcdctl 的 v2 跟 v3 版本差异很大,k8s 默认使用 v3 版本
直接输入 etcdctl ,提示需要证书认证才能使用,所以需要指定 ETCDCTL_API=3
export 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 member list -w table
endpoints 执行要操作那个etcd
--cacert --cert -key 都是指定证书
member list 显示集群的信息
其中etcd 签发了很多证书,用哪套都行。peer 是etcd集群通信用的。-w table 使用table表格显示
etcdctl 加入别名
[root@k8s-master nginx]# alias etcdctl='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' [root@k8s-master nginx]# etcdctl member list -w table +------------------+---------+------------+---------------------------+---------------------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | +------------------+---------+------------+---------------------------+---------------------------+ | b7501a7e3ce53d2b | started | k8s-master | https://192.168.18.7:2380 | https://192.168.18.7:2379 | +------------------+---------+------------+---------------------------+---------------------------+ [root@k8s-master nginx]#
etcdctl endpoint status -w table # 当前节点为leader (IS LEADER ) DB_SIZE 数据库大小 RAFT TERM 做了几轮选举
etcd 是一个key=value类型的数据库,如下写入一个key,查看value
etcd 数据库可以按照目录层次存储,也可以按照目录查看数值
如下在 /admin目录下存储一个key1,并 key1 的数值等于 value1。在 /admin目录下存储一个key2,并 key2 的数值等于value2。查看 /admin目录下的key和对应的 value。--prefix=true
检索前缀的意思,意思是检索 /admin目录下的所有
etcdctl 的 watch 命令,意思是时刻观察事件,就跟tail -f 一样,一致在检测变化
etcdctl watch /admin/key1 时刻观察/admin/key1的时间,一旦发生改变立马检测到
watch 可以按照目录的形式监控目录下的文件
k8s 资源存储在etcd哪里呢?etcd 数据都是从 / 开始的,我们查看 / 都有啥, --keys-only 只看key不看value
etcdctl get / --prefix=true --keys-only
通过上图可以看到,k8s资源都是在 / 下创建的各种资源,其中 pod 资源在 /registry/pods/下
所以,我们得出,kubectl 通过yaml 形式、或者kubectl edit 的形式,将需要调度的信息告知apiserver,apiserver 在将信息存储到 etcd 中,kubelet 通过 apiserver 监听发现 etcd 数据变化了,立马拉取新的策略进行构建。
etcd中的目录,是按照什么形式创建的k8s数据
kubectl api-resources
方式一、直接备份 etcd 目录
cp /var/lib/etcd/ /tmp/hostname-etcd_$(date +"%Y-%m-%d_%H:%M").db
方式二:etcd 快照
etcdctl snapshot save "hostname-etcd_$(date +"%Y-%m-%d_%H:%M").db"
简单查看备份是否正确,两个对比差不多大
1、停止etcd 和 apiserver
2、移走当前数据目录(注意,需要所有的集群节点)
mv /var/lib/etcd/ tmp
3、恢复快照(集群所有节点都需要操作,而且必须用一个.db)
etcdctl snapshot restore hostname-etcd_2022-08-29_20:27.db --data-dir=/var/lib/etcd/
如果etcd的数据库很大,一般都是 event 很大,默认都是1h后自动清除,如果etcd数据库很大,需要查看