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}
Ключ и значение, кажется, закодированы, но я не могу найти способ вернуть значение в виде простого текста.
Как я могу получить текстовое значение для данного ключа?
2 ответа
Немного опоздал на шоу, но вот как я смог это сделать. Потому что в 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
...
По умолчанию в kube 1.6 и выше значения хранятся в кодировке protobuf, а не в JSON.
kubernetes известная проблема: https://github.com/kubernetes/kubernetes/issues/44670
Как упоминалось в выпуске, инструмент openshift ( https://github.com/openshift/origin/tree/master/tools/etcdhelper) может помочь прочитать значение. Это работает для меня, но это действительно не удобно.