0

在 kubernetes 1.6 中,etcd v3 中的信息存储,我使用“etcdctl get”命令获取信息如下: 在此处输入图像描述

我的问题是如何反序列化信息?如何通过“protoc --raw”命令反序列化信息?我在一个网站上阅读了这篇论文:

“您有我们在使用 etcd2 防止 protobuf 存储中捕获并修复的异常数据,它是 base64 编码的 protobuf(etcd2 不支持存储二进制值)。在 1.6 中我们默认为支持二进制值的 etcd3 模式,并且默认存储在“application/vnd.kubernetes.protobuf”,这是值的以下形式

4 个字节 - k8s\x00runtime.Unknown (pkg/runtime/types.go#Unknown) 的 protobuf 编码 *“typeMeta”字段设置为与 API 返回的 kind 和 apiVersion 相同的值 *“raw”字段设置为由 typeMeta 标识的 golang 结构的 protobuf 编码字节 - 没有幻数

您可以使用以下方法对此进行解码:

head -4(去除幻数)| protoc --raw(解码proto)

然后,您也可以使用 protoc 解码原始正文。”

但我不知道如何执行它,有人知道吗?

4

1 回答 1

1

试试这个

ETCDCTL_API=3 etcdctl get /registry/namespaces/default -w protobuf | protoc --decode_raw

输出应如下所示

1 {
  1: 14841639068965178418
  2: 10276657743932975437
  3: 7839988
  4: 2
}
2 {
  1: "/registry/namespaces/default"
  2: 11
  3: 11
  4: 1
  5: "k8s\000\n\017\n\002v1\022\tNamespace\022c\nI\n\007default\022\000\032\000\"\000*$20b6cdfa-9929-11e7-8b62-005056b549b62\0008\000B\014\010\305\203\351\315\005\020\221\356\217\314\003z\000\022\014\n\nkubernetes\032\010\n\006Active\032\000\"\000"
}
4: 1

顺便说一句,我在 kubernetes 源代码中没有找到相关的 proto 文件。

于 2017-10-26T16:14:22.947 回答