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

另外在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
3 查看k8s储存在etcd中的数据

资源都存储在/registry下

复制代码
[root@k8s-master01 ~]# etcdctl get --prefix / --keys-only|head -10 ##--keys-only表示只看key,相对应的--print-value-only表示只看value

查看/registry/pods下的内容,通过输出结果可以看出。key的命名规则为/registry/pods/namespace_name/pod_name

复制代码
[root@k8s-master01 ~]# etcdctl get --prefix /registry/pods --keys-only|head -10

查看kube-system命名空间下的条目

复制代码
[root@k8s-master01 ~]# etcdctl get --prefix /registry/pods/kube-system --keys-only|head -10
4 查看某个pod的值

在k8s中,pod等资源的value是以protobuf格式存储的,因此我们无法直接使用etcdctl命令去查询,会出现乱码现象。

对此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/

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版本、名字、命名空间等信息。

相关推荐
Patrick_Wilson1 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生2 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭2 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美3 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵4 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
武子康7 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
2601_9618752410 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj10 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
程序员老赵10 天前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops