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)

相关推荐
基哥的奋斗历程1 小时前
Kubernetes 存储 Downward API
云原生·容器·kubernetes
程序边界5 小时前
AIGC时代Kubernetes企业级云原生运维实战:智能重构与深度实践指南
云原生·kubernetes·aigc
dessler8 小时前
Kubernetes(k8s)-Reloader介绍&使用
linux·运维·kubernetes
weixin_425878238 小时前
k8s 自动伸缩的场景与工作原理
java·容器·kubernetes
lzz的编码时刻8 小时前
K8s私有仓库拉取镜像报错解决:x509 certificate signed by unknown authority
云原生·容器·kubernetes
码哝小鱼9 小时前
docker stack常用命令
docker·容器·eureka
NorthCastle11 小时前
Centos7 上 卸载 docker
运维·docker·容器
{⌐■_■}12 小时前
【Kubernetes】RBAC(基于角色的访问控制)如何设置?如何管理 Kubernetes 的权限?
云原生·容器·kubernetes
kfepiza12 小时前
docker mysql 笔记250406
docker·容器
kfepiza12 小时前
`docker run --restart no,always,on-failure,unless-stopped` 笔记250406
docker·容器