Etcdctl 命令行


原文链接: Etcdctl 命令行
  • etcd中文文档
  • etcd官方文档
    用户通常通过设置或者获取键的值来和 etcd 交互。这一节描述如何使用 etcdctl 来操作, etcdctl 是一个和 etcd 服务器交互的命令行工具。这里描述的概念也适用于 gRPC API 或者客户端类库 API。

默认,为了向后兼容 etcdctl 使用 v2 API 来和 etcd 服务器通讯。为了让 etcdctl 使用 v3 API 来和etcd通讯,API 版本必须通过环境变量 ETCDCTL_API 设置为版本3。

export ETCDCTL_API=3

前缀查询 获取目录

etcdctl get /test/ok --prefix

获取所有的键值

etcdctl get / --prefix --keys-only
etcdctl get "" --prefix --keys-only | sed '/^\s*$/d'

查找版本

$ etcdctl version

使用etcdctl访问kuberentes数据

Kubenretes1.6中使用etcd V3版本的API,使用etcdctl直接ls的话只能看到/kube-centos一个路径。需要在命令前加上ETCDCTL_API=3这个环境变量才能看到kuberentes在etcd中保存的数据。

ETCDCTL_API=3 etcdctl get /registry/namespaces/default -w=json|python -m json.tool

  • -w 指定输出格式

查看所有子目录

使用--prefix可以看到所有的子目录,如查看集群中的namespace:

ETCDCTL_API=3 etcdctl get /registry/namespaces --prefix -w=json|python -m json.tool

输出结果中可以看到所有的namespace。

{
    "count": 148,
    "header": {
        "cluster_id": 5337099087796519416,
        "member_id": 1096038705891769720,
        "raft_term": 6,
        "revision": 99292
    },
    "kvs": [
        {
            "create_revision": 14,
            "key": "L3JlZ2lzdHJ5L2FwaXJlZ2lzdHJhdGlvbi5rOHMuaW8vYXBpc2VydmljZXMvdjEu",
            "mod_revision": 14,
            "value": "eyJraW5kIjoiQVBJU2VydmljZSIsImFwaVZlcnNpb24iOiJhcGlyZWdpc3RyYXRpb24uazhzLmlvL3YxYmV0YTEiLCJtZXRhZGF0YSI6eyJuYW1lIjoidjEuIiwidWlkIjoiZDljMDUwYWItMjY5NS0xMWU4LWFlZmQtZmExNjNlOWZmMTQyIiwiY3JlYXR
pb25UaW1lc3RhbXAiOiIyMDE4LTAzLTEzVDA4OjA5OjI4WiIsImxhYmVscyI6eyJrdWJlLWFnZ3JlZ2F0b3Iua3ViZXJuZXRlcy5pby9hdXRvbWFuYWdlZCI6Im9uc3RhcnQifX0sInNwZWMiOnsic2VydmljZSI6bnVsbCwidmVyc2lvbiI6InYxIiwiY2FCdW5kbGUiOm51bGwsImdy
b3VwUHJpb3JpdHlNaW5pbXVtIjoxODAwMCwidmVyc2lvblByaW9yaXR5IjoxfSwic3RhdHVzIjp7ImNvbmRpdGlvbnMiOlt7InR5cGUiOiJBdmFpbGFibGUiLCJzdGF0dXMiOiJUcnVlIiwibGFzdFRyYW5zaXRpb25UaW1lIjoiMjAxOC0wMy0xM1QwODowOToyOFoiLCJyZWFzb24iO
iJMb2NhbCIsIm1lc3NhZ2UiOiJMb2NhbCBBUElTZXJ2aWNlcyBhcmUgYWx3YXlzIGF2YWlsYWJsZSJ9XX19Cg==",
            "version": 1
        },

key的值是经过base64编码,需要解码后才能看到实际值,如:

$ echo L3JlZ2lzdHJ5L25hbWVzcGFjZXMvYXV0b21vZGVs|base64 -d
/registry/namespaces/automodel

etcd中kubernetes的元数据

我们使用kubectl命令获取的kubernetes的对象状态实际上是保存在etcd中的,使用下面的脚本可以获取etcd中的所有kubernetes对象的key:

注意,我们使用了ETCD v3版本的客户端命令来访问etcd。

#!/bin/bash
# Get kubernetes keys from etcd
export ETCDCTL_API=3
keys=`etcdctl get /registry --prefix -w json|python -m json.tool|grep key|cut -d ":" -f2|tr -d '"'|tr -d ","`
for x in $keys;do
  echo $x|base64 -d|sort
done

通过输出的结果我们可以看到kubernetes的原数据是按何种结构包括在kuberentes中的,输出结果如下所示:

/registry/ThirdPartyResourceData/istio.io/istioconfigs/default/route-rule-details-default
/registry/ThirdPartyResourceData/istio.io/istioconfigs/default/route-rule-productpage-default
/registry/ThirdPartyResourceData/istio.io/istioconfigs/default/route-rule-ratings-default
...
/registry/configmaps/default/namerctl-script
/registry/configmaps/default/namerd-config
/registry/configmaps/default/nginx-config
...
/registry/deployments/default/sdmk-page-sdmk
/registry/deployments/default/sdmk-payment-web
/registry/deployments/default/sdmk-report
...

我们可以看到所有的Kuberentes的所有元数据都保存在/registry目录下,下一层就是API对象类型(复数形式),再下一层是namespace,最后一层是对象的名字。

以下是etcd中存储的kubernetes所有的元数据类型:

ThirdPartyResourceData
apiextensions.k8s.io
apiregistration.k8s.io
certificatesigningrequests
clusterrolebindings
clusterroles
configmaps
controllerrevisions
controllers
daemonsets
deployments
events
horizontalpodautoscalers
ingress
limitranges
minions
monitoring.coreos.com
namespaces
persistentvolumeclaims
persistentvolumes
poddisruptionbudgets
pods
ranges
replicasets
resourcequotas
rolebindings
roles
secrets
serviceaccounts
services
statefulsets
storageclasses
thirdpartyresources

参考

`