使用 etcdctl 访问 Kubernetes 数据
Kubernetes 使用 etcd 作为其后端数据存储,从 Kubernetes 1.6 开始默认使用 etcd v3 API。要访问 Kubernetes 在 etcd 中存储的数据,需要使用正确的 API 版本和认证配置。
基本访问方法
设置 API 版本
使用 etcdctl 访问 Kubernetes 数据时,必须指定使用 etcd v3 API:
export ETCDCTL_API=3
或者在每个命令前添加环境变量:
ETCDCTL_API=3 etcdctl get /registry/namespaces/default -w=json | jq .
TLS 认证访问
对于使用 kubeadm 创建的集群,etcd 默认启用 TLS 认证。需要使用相应的证书文件:
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key \
get /registry/namespaces/default -w=json | jq .
参数说明:
--cacert
: CA 证书文件路径--cert
: 客户端证书文件路径--key
: 客户端私钥文件路径-w
: 指定输出格式(json、table 等)
常用查询命令
查看单个对象
查看 default 命名空间的详细信息:
ETCDCTL_API=3 etcdctl get /registry/namespaces/default -w=json | jq .
输出示例:
{
"count": 1,
"header": {
"cluster_id": 12091028579527406772,
"member_id": 16557816780141026208,
"raft_term": 36,
"revision": 29253467
},
"kvs": [
{
"create_revision": 5,
"key": "L3JlZ2lzdHJ5L25hbWVzcGFjZXMvZGVmYXVsdA==",
"mod_revision": 5,
"value": "azhzAAoPCgJ2MRIJTmFtZXNwYWNlEmIKSAoHZGVmYXVsdBIAGgAiACokZTU2YzMzMDgtMWVhOC0xMWU3LThjZDctZjRlOWQ0OWY4ZWQwMgA4AEILCIn4sscFEKOg9xd6ABIMCgprdWJlcm5ldGVzGggKBkFjdGl2ZRoAIgA=",
"version": 1
}
]
}
查看多个对象
使用 --prefix
参数查看指定前缀下的所有对象:
ETCDCTL_API=3 etcdctl get /registry/namespaces --prefix -w=json | jq .
列出所有键
列出 etcd 中所有 Kubernetes 相关的键:
ETCDCTL_API=3 etcdctl get /registry --prefix --keys-only
数据解码
etcd 中的键值都经过 base64 编码,需要解码才能查看实际内容:
# 解码键名
echo "L3JlZ2lzdHJ5L25hbWVzcGFjZXMvZGVmYXVsdA==" | base64 -d
# 输出:/registry/namespaces/default
# 批量解码脚本
#!/bin/bash
export ETCDCTL_API=3
keys=$(etcdctl get /registry --prefix -w json | jq -r '.kvs[].key')
for key in $keys; do
echo $key | base64 -d
done | sort
Kubernetes 数据结构
存储层次结构
Kubernetes 在 etcd 中的数据遵循以下层次结构:
/registry/
├── <资源类型复数形式>/
│ ├── <命名空间>/
│ │ └── <对象名称>
│ └── <集群级别对象名称>
主要资源类型
Kubernetes 在 etcd 中存储的主要资源类型包括:
核心资源:
namespaces
- 命名空间pods
- Pod 对象services
- 服务configmaps
- 配置映射secrets
- 密钥persistentvolumes
- 持久卷persistentvolumeclaims
- 持久卷声明
工作负载资源:
deployments
- 部署replicasets
- 副本集daemonsets
- 守护进程集statefulsets
- 有状态集jobs
- 任务
配置和存储:
storageclasses
- 存储类limitranges
- 资源限制resourcequotas
- 资源配额
RBAC 相关:
roles
- 角色rolebindings
- 角色绑定clusterroles
- 集群角色clusterrolebindings
- 集群角色绑定serviceaccounts
- 服务账户
扩展资源:
apiextensions.k8s.io
- 自定义资源定义apiregistration.k8s.io
- API 服务注册
实用脚本
获取所有 Kubernetes 对象键
#!/bin/bash
# 获取 etcd 中所有 Kubernetes 对象的键
export ETCDCTL_API=3
# 配置 etcd 访问参数(根据实际环境调整)
ETCD_OPTS=""
if [ -f "/etc/kubernetes/pki/etcd/ca.crt" ]; then
ETCD_OPTS="--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key"
fi
# 获取并解码所有键
etcdctl $ETCD_OPTS get /registry --prefix -w json | \
jq -r '.kvs[].key' | \
while read key; do
echo $key | base64 -d
done | sort
按资源类型统计对象数量
#!/bin/bash
export ETCDCTL_API=3
etcdctl get /registry --prefix --keys-only | \
while read key; do
echo $key | base64 -d
done | \
cut -d'/' -f3 | \
sort | uniq -c | \
sort -nr
注意事项
生产环境谨慎操作:直接操作 etcd 数据可能会破坏集群状态,建议仅用于调试和学习。
权限要求:访问 etcd 需要适当的权限,通常需要在 master 节点上执行。
数据一致性:etcd 中的数据反映的是 Kubernetes API Server 的内部状态,可能与 kubectl 输出略有差异。
版本兼容性:不同 Kubernetes 版本在 etcd 中的数据结构可能有所不同。
通过 etcdctl 访问 Kubernetes 数据有助于深入理解集群的内部工作机制,对于故障排查和性能优化具有重要意义。