Почему секреты 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/