etcd v3 не может прочитать закодированные значения

Я пытаюсь получить значения из etcd v3 в кластере kubernetes. Значения кажутся закодированными и возвращаются не полностью. Когда -w simple, значение возвращается с большим количеством вопросительных знаков в маленьких ромбах. При использовании -w json значение возвращается следующим образом:

ubuntu@k8s-master-0:~$ etcdctl --endpoints=https://127.0.0.1:2379 -w json get /registry/services/specs/default/kubernetes-bootcamp
{"header":{"cluster_id":13533136872321707204,"member_id":12171258639343793897,"revision":1142056,"raft_term":53},"kvs":[{"key":"L3JlZ2lzdHJ5L3NlcnZpY2VzL3NwZWNzL2RlZmF1bHQva3ViZXJuZXRlcy1ib290Y2FtcA==","create_revision":863556,"mod_revision":863556,"version":1,"value":"azhzAAoNCgJ2MRIHU2VydmljZRLaAQp3ChNrdWJlcm5ldGVzLWJvb3RjYW1wEgAaB2RlZmF1bHQiACokNzBhNDdlZDgtODFjZS0xMWU3LWE2ZGMtZmExNjNlYmZlNzM5MgA4AEILCLOmzMwFEOaHwTdaGgoDcnVuEhNrdWJlcm5ldGVzLWJvb3RjYW1wegASWwoXCgASA1RDUBiYPyIHCAAQkD8aACjR+QESGgoDcnVuEhNrdWJlcm5ldGVzLWJvb3RjYW1wGgwxMC4yMzMuNTIuNzEiDExvYWRCYWxhbmNlcjoETm9uZUIAUgAaAgoAGgAiAA=="}],"count":1}

Ключ и значение кажутся закодированными, но я не могу найти способ вернуть значение обычного текста.

Как я могу получить значение обычного текста для данного ключа?


person Daniel Watrous    schedule 17.08.2017    source источник
comment
Приведенный выше ключ закодирован в base64 и может быть напрямую декодирован. Вышеприведенное значение похоже на кодировку base64, но оно лишь частично декодируется в обычные символы со специальными символами.   -  person Daniel Watrous    schedule 18.08.2017


Ответы (3)


Немного опоздал на шоу, но вот как я смог это сделать. Поскольку в etcd pre-v3 данные хранились в простом виде json, а начиная с v3 они в двоичном формате, необходим дополнительный шаг декодирования.

Подробности можно проверить в этом репозитории: https://github.com/jpbetz/auger.

И здесь находятся документы Kubernetes, касающиеся кодирования protobuf.

И рабочий пример:

etcdctl get "/registry/pods/default/nginx-dbddb74b8-62hh7" --prefix -w simple | auger decode

Теперь ответ в виде простого текста:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/limit-ranger: 'LimitRanger plugin set: cpu request for container
      nginx'
  creationTimestamp: 2019-08-12T14:11:57Z
...
person esboych    schedule 14.08.2019

По умолчанию в kube 1.6 и выше значения хранятся в кодировке protobuf, а не JSON.

person Jordan Liggitt    schedule 18.08.2017
comment
Ключ и значение в приведенном выше выводе больше похожи на вывод base64, чем на protobuf, поэтому я не уверен, как их декодировать. Как я могу преобразовать формат protobuf во что-то читаемое (человеком или скриптом)? - person Daniel Watrous; 18.08.2017

известная проблема kubernetes: https://github.com/kubernetes/kubernetes/issues/44670

Как упоминалось в выпуске, инструмент openshift (https://github.com/openshift/origin/tree/master/tools/etcdhelper) может помочь прочитать значение. У меня работает, но реально не удобно.

person chestack    schedule 01.11.2018