使用 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

注意事项

  1. 生产环境谨慎操作:直接操作 etcd 数据可能会破坏集群状态,建议仅用于调试和学习。

  2. 权限要求:访问 etcd 需要适当的权限,通常需要在 master 节点上执行。

  3. 数据一致性:etcd 中的数据反映的是 Kubernetes API Server 的内部状态,可能与 kubectl 输出略有差异。

  4. 版本兼容性:不同 Kubernetes 版本在 etcd 中的数据结构可能有所不同。

通过 etcdctl 访问 Kubernetes 数据有助于深入理解集群的内部工作机制,对于故障排查和性能优化具有重要意义。

文章导航

章节内容

这是章节的内容页面。

章节概览

评论区