web-dev-qa-db-fra.com

Impossible de créer un secret dans Kubernetes: données base64 illégales à l'entrée

Je veux créer un secret pour mon cluster kubernetes. J'ai donc composé suivant dummy-secret.yaml fichier:

apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
type: Opaque
data:
  API_KEY: bWVnYV9zZWNyZXRfa2V5
  API_SECRET: cmVhbGx5X3NlY3JldF92YWx1ZTE=

Quand je lance kubectl create -f dummy-secret.yaml Je reçois le message suivant:

Error from server (BadRequest): error when creating "dummy-secret.yaml": Secret in version "v1" cannot be handled as a Secret: v1.Secret: Data: decode base64: illegal base64 data at input byte 8, error found in #10 byte of ...|Q89_Hj1Aq","API_SECR|..., bigger context ...|sion":"v1","data":{"API_KEY":"af76fsdK_cQ89_Hj1Aq","API_SECRET":"bsdfmkwegwegwe"},"kind":"Secret","m|...

Je ne sais pas pourquoi cela se produit.

Si j'ai bien compris, je dois encoder toutes les valeurs sous la clé data dans le fichier yaml. J'ai donc fait l'encodage base64, mais kubernetes ne gère toujours pas le fichier secret yaml comme je m'y attendais.

MISE À JOUR:

J'ai utilisé cette commande pour encoder les valeurs de data sur mon mac:

echo -n 'mega_secret_key' | openssl base64
9
Alex Fruzenshtein

J'ai obtenu les valeurs décodées "mega_secret_key" et "really_secret_value1" de vos données encodées. Semble qu'ils ne sont pas codés correctement. Alors, encodez vos données de la bonne manière:

$ echo "mega_secret_key" | base64
bWVnYV9zZWNyZXRfa2V5Cg==

$ echo "really_secret_value1" | base64
cmVhbGx5X3NlY3JldF92YWx1ZTEK

Vérifiez ensuite s'ils sont correctement encodés:

$ echo "bWVnYV9zZWNyZXRfa2V5Cg==" | base64 -d
mega_secret_key

$ echo "cmVhbGx5X3NlY3JldF92YWx1ZTEK" | base64 -d
really_secret_value1

Ils vont donc bien. Maintenant, utilisez-les dans votre dummy-secret.yaml:

apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
type: Opaque
data:
  API_KEY: bWVnYV9zZWNyZXRfa2V5Cg==
  API_SECRET: cmVhbGx5X3NlY3JldF92YWx1ZTEK

Et courir $ kubectl create -f dummy-secret.yaml.

16
Shudipta Sharma

On dirait que votre message d'erreur se produit avec un autre dummy-secret.yaml.

apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
type: Opaque
data:
  API_KEY: af76fsdK_cQ89_Hj1Aq
  API_SECRET: bsdfmkwegwegwe

Ensuite:

$ kubectl create -f s.yaml
Error from server (BadRequest): error when creating "dummy-secret.yaml": Secret in version "v1" cannot be handled as a Secret: v1.Secret.Data: decode base64: illegal base64 data at input byte 8, error found in #10 byte of ...|Q89_Hj1Aq","API_SECR|..., bigger context ...|sion":"v1","data":{"API_KEY":"af76fsdK_cQ89_Hj1Aq","API_SECRET":"bsdfmkwegwegwe"},"kind":"Secret","m|...

Si j'utilise votre original, cela fonctionne très bien:

apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
type: Opaque
data:
  API_KEY: bWVnYV9zZWNyZXRfa2V5
  API_SECRET: cmVhbGx5X3NlY3JldF92YWx1ZTE=

Ensuite:

$ kubectl create -f dummy-secret.yaml
secret/dummy-secret created

J'utilise la version suivante:

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.2", GitCommit:"17c77c7898218073f14c8d573582e8d2313dc740", GitTreeState:"clean", BuildDate:"2018-10-30T21:39:38Z", GoVersion:"go1.11.1", Compiler:"gc", Platform:"darwin/AMD64"}
Server Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"4ed3216f3ec431b140b1d899130a69fc671678f4", GitTreeState:"clean", BuildDate:"2018-10-05T16:36:14Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/AMD64"}
2
Rico

Cela peut également se produire lorsque vous essayez de supprimer les nouveaux caractères de ligne de manière incorrecte (la bonne façon consiste à supprimer le suffixe "Cg ==").

J'ai utilisé base64 de cli bien qu'il existe des solutions pour éviter le NL, comme

https://superuser.com/questions/1225134/why-does-the-base64-of-a-string-contain-n/1225334

ils ne fonctionnent pas sous MacOS, j'ai trouvé plus simple d'utiliser python comme ceci

import base64

data = "abc123!?$*&()'-=@~"

# Standard Base64 Encoding
encodedBytes = base64.b64encode(data.encode("utf-8"))
encodedStr = str(encodedBytes, "utf-8")

Ou toujours en utilisant une solution basée uniquement sur bash:

echo 'secret_to_encode' | tr -d \\n | base64