K8S核心组件etcd详解(下)

1 k8s如何使用etcd

在k8s中所有对象的manifest都需要保存到某个地方,这样他们的manifest在api server重启和失败的时候才不会丢失。

只有api server能访问etcd,其它组件只能间接访问etcd的好处是

  • 增强乐观锁系统及验证系统的健壮性

  • 方便后续存储的替换,只需修改api server组件的相关接口。

etcd是一个响应快、分布式、一致的K-V存储,也是k8s存储集群状态和元数据的唯一地方。

2 如何更方便地使用etcdctl命令

https://github.com/etcd-io/etcd/tree/main/etcdctl#readme

etcd接口有V2和V3两个版本,从Kubernetes1.6开始默认etcd版本都为v3,v2和v3接口不兼容,因此使用etcdctl操作我们要确认好api版本。

复制代码

root@k8s-master01 \~\]# yum install etcd -y ##安装etcd服务,下载后会自带客户端工具etcdctl \[root@k8s-master01 \~\]# etcdctl --version etcdctl version: 3.3.11 API version: 2 \[root@k8s-master01 \~\]# export ETCDCTL_API=3 ##设置api版本为v3 \[root@k8s-master01 \~\]# etcdctl version ##不同接口使用的命令也有差异 etcdctl version: 3.3.11 API version: 3.3 ![图片](https://file.jishuzhan.net/article/1692444268947312642/66762d606275462dba4985dc35e8b06c.png) 另外在k8s中使用etcdctl连接etcd中要用到ca证书进行认证,而且还需要指定etcd节点ip和端口信息,这就使得整个命令执行起来非常的冗长。 我们可以把相应的信息通过变量定义,这样在etcdctl命令在执行时可以根据相关的变量获取需要的信息。 ``` [root@k8s-master01 ~]# cat /etc/profile.d/etcd export ETCDCTL_API=3 export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key export ETCDCTL_ENDPOINTS=https://10.0.107.77:2379,https://10.0.113.204:2379,https://10.0.87.66:2379 [root@k8s-master01 ~]# source /etc/profile.d/etcd [root@k8s-master01 ~]# etcdctl member list 15c808b23512a31a, started, k8s-master02, https://10.0.107.77:2380, https://10.0.107.77:2379 5ca9692dbcd57e55, started, k8s-master03, https://10.0.113.204:2380, https://10.0.113.204:2379 f8b45063ae1a7dfa, started, k8s-master01, https://10.0.87.66:2380, https://10.0.87.66:2379 ``` ![图片](https://file.jishuzhan.net/article/1692444268947312642/05da43a769e943fd8db4c5b61b81ff14.png) ##### 3 查看k8s储存在etcd中的数据 资源都存储在/registry下 ``` [root@k8s-master01 ~]# etcdctl get --prefix / --keys-only|head -10 ##--keys-only表示只看key,相对应的--print-value-only表示只看value ``` ![图片](https://file.jishuzhan.net/article/1692444268947312642/890fdea062fd41eca10b0952de019094.png) 查看/registry/pods下的内容,通过输出结果可以看出。key的命名规则为/registry/pods/namespace_name/pod_name ``` [root@k8s-master01 ~]# etcdctl get --prefix /registry/pods --keys-only|head -10 ``` ![图片](https://file.jishuzhan.net/article/1692444268947312642/3cb73e01edb1446fbd3f7b3afaf00609.png) 查看kube-system命名空间下的条目 ``` [root@k8s-master01 ~]# etcdctl get --prefix /registry/pods/kube-system --keys-only|head -10 ``` ![图片](https://file.jishuzhan.net/article/1692444268947312642/88e7ccc32b5345c795d8677a3c98762e.png) ##### 4 查看某个pod的值 在k8s中,pod等资源的value是以protobuf格式存储的,因此我们无法直接使用etcdctl命令去查询,会出现乱码现象。 ![图片](https://file.jishuzhan.net/article/1692444268947312642/d4abffbdc15740ee81e7de51817aad46.png) 对此OpenShift提供了一个工具etcdhelper来解码proto格式的内容。下面链接提供了OpenShift官方的go源码文件,需要编译成可执行文件,放到/usr/local/bin目录后就可以直接使用。 您也可以直接微信公众号后台回复 **etcd**,下载我已编译好的etcdhelper命令文件。 > https://github.com/openshift/origin/tree/master/tools/etcdhelper etcdhelper编译 ``` [root@k8s-master01 ~]# wget https://github.com/openshift/origin/archive/refs/heads/master.zip [root@k8s-master01 ~]# unzip master.zip [root@k8s-master01 ~]# cd origin-master/tools/etcdhelper/ [root@k8s-master01 etcdhelper]# ls etcdhelper.go OWNERS README.md [root@k8s-master01 etcdhelper]# go build etcdhelper.go [root@k8s-master01 etcdhelper]# ls etcdhelper etcdhelper.go OWNERS README.md [root@k8s-master01 etcdhelper]# cp etcdhelper /usr/local/bin/ ``` ![图片](https://file.jishuzhan.net/article/1692444268947312642/ba0d0031f09549999f18492ece464ef5.png) etcdhelper使用方法与etcdctl类似,也需要指定k8s的ca文件路径,默认直接连接本机的2789端口进行查询。 另外要注意具体的get查询命令要放到最后,否则命令无法正常执行 ``` [root@k8s-master01 ~]# etcdhelper -cacert /etc/kubernetes/pki/etcd/ca.crt -cert /etc/kubernetes/pki/etcd/server.crt -key /etc/kubernetes/pki/etcd/server.key get /registry/pods/kube-system/etcd-k8s-master01 ``` 通过查询结果我们可以看到,etcd中存储了pod etcd-k8s-master01的元数据信息,包括类型、api版本、名字、命名空间等信息。 ![图片](https://file.jishuzhan.net/article/1692444268947312642/6a1bd2c16a7e4bfd9d90d51996e49af5.png)

相关推荐
skyeeeeee1 小时前
kubeadm安装k8s集群
后端·kubernetes
虚伪的空想家1 小时前
记录次etcd故障,fatal error: bus error
服务器·数据库·k8s·etcd
高旭博3 小时前
7. kubernetes资源——service服务
云原生·容器·kubernetes
斯普信专业组3 小时前
Docker 常用命令与时区配置指南
docker·容器·eureka
Ryan ZX16 小时前
etcd 高可用分布式键值存储
数据库·分布式·etcd
研究司马懿16 小时前
【ETCD】ETCD——confd配置管理
数据库·golang·自动化·运维开发·etcd·argocd·gitops
..Cherry..16 小时前
Etcd详解(raft算法保证强一致性)
数据库·算法·etcd
Qayrup18 小时前
docker 搭建私有仓库,推送并拉取
运维·docker·容器
黑黍20 小时前
如何在k8s中配置并使用nvidia显卡
云原生·容器·kubernetes