Как выполнить десериализацию protobuf в etcd v3 с kubernetes 1.6?

В kubernetes 1.6, хранилище информации в etcd v3, я использую команду "etcdctl get", чтобы получить информацию следующим образом:

Мой вопрос: как десериализовать информацию? Как десериализовать информацию командой "protoc --raw"? Я прочитал статью на веб-сайте:

"У вас есть необычные данные, которые мы перехватили и исправили в хранилище Prevent protobuf с помощью etcd2, который является затуфом в кодировке base64 (etcd2 не поддерживает хранение двоичных значений). В 1.6 мы по умолчанию используем режим etcd3, который поддерживает двоичные значения, и по умолчанию сохраняем в "application/vnd.kubernetes.protobuf", которая является следующей формой для значений

4 байта - k8s\x00 кодировка protobuf для runtime.Unknown (pkg/runtime/types.go#Unknown) * в поле "typeMeta" установлены те же значения типа и apiVersion, которые будут возвращены из API * в поле "raw", установленное для закодированного protobuf байты для структуры golang, идентифицированной typeMeta - без магического числа

Вы можете расшифровать это с помощью:

голова -4 (лишить магического числа) | protoc --raw (декодирует прото)

Затем вы можете декодировать необработанное тело, используя также протокол. "

но я не знаю, как это сделать, кто-нибудь знает это?

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.

Другие вопросы по тегам