Почему секреты k8s должны быть закодированы base64, если нет конфигурационных карт?

Почему секреты k8s должны быть закодированы base64, если нет конфигурационных карт?

При создании configmap вы просто делаете что-то вроде этого:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  SOME_KEY: a string value

Но когда вы хотите создать секрет, вы должны echo -n "some secret string" | base64 echo -n "some secret string" | base64 а затем поместите результат этого в файл, выглядящий примерно так:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  SOME_KEY: c29tZSBzZWNyZXQgc3RyaW5n

Я действительно удивляюсь, почему существует такая разница? Являются ли kubernetes секретами просто закодированные строки base64? Я бы ожидал, что секреты были зашифрованы в кубернетах.

Ответ 1

Секреты могут содержать двоичные данные (тип - это map[string][]byte), а байт-массивы кодируются base64 в сериализации JSON.

ConfigMaps содержит только строковые данные (тип - map[string]string), поэтому сериализация JSON просто выводит строку.

В 1.10 ConfigMaps имеет новое поле binaryData которое позволяет хранить двоичные данные, которые закодированы в base64, подобно секретам. https://github.com/kubernetes/kubernetes/pull/57938

Ответ 2

  Почему секреты k8s должны быть закодированы в base64

Это позволяет предоставлять двоичные данные (сертификаты и т.д.) Как секретные, а также экранировать любые хитрые символы, такие как "'\ и т.д.

Являются ли секреты kubernetes просто строками в кодировке base64?

Да, секреты kubernetes не шифруются по умолчанию. Вы должны самостоятельно настроить шифрование, см. https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/