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

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

Lorsque 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.

Comme je l'ai compris, j'ai besoin d'encoder toutes les valeurs sous la clé data dans le fichier yaml. J'ai donc encodé en 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 data sur mon mac:

echo -n 'mega_secret_key' | openssl base64
12
Alex Fruzenshtein 20 nov. 2018 à 17:16

5 réponses

Meilleure réponse

J'ai obtenu les valeurs décodées "mega_secret_key" et "really_secret_value1" à partir de vos données encodées. Semble qu'ils ne sont pas encodés de la bonne manière. 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

Alors ils vont 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 exécutez $ kubectl create -f dummy-secret.yaml.

26
Shudipta Sharma 21 nov. 2018 à 15:59

Cela peut également se produire lorsque vous essayez de supprimer les caractères de nouvelle ligne d'une manière incorrecte (la manière correcte est de supprimer le suffixe "Cg ==").

J'ai utilisé base64 de cli bien qu'il existe des solutions de contournement 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 ça

import base64

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

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

Ou encore en utilisant une solution pure bash:

echo 'secret_to_encode' | tr -d \\n | base64
0
Fernando Gonzalez Sanchez 17 oct. 2019 à 13:01

Cela a déjà été répondu, mais pour référence future, il n'est pas nécessaire d'encoder les chaînes en utilisant le champ stringData au lieu du champ data comme indiqué ci-dessous:

#secrets.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
stringData:
  API_KEY: "STRING_IN_CLEAR_TEXT"
  API_SECRET: "STRING_IN_CLEAR_TEXT"
2
Tomas Fornara 20 mars 2020 à 11:29

Il semble que votre message d'erreur s'affiche 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

Alors:

$ 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 bien:

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

Alors:

$ 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 20 nov. 2018 à 15:56

Après un certain temps, je veux revenir sur cette question et laisser une réponse avec une référence aux docs officiels de kubernetes:

echo -n 'admin' | base64
YWRtaW4=
echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm

Faites particulièrement attention à -n, car il garantit qu'après le décodage, votre clé secrète ne contiendra pas de «symbole de nouvelle ligne».

5
Alex Fruzenshtein 12 déc. 2019 à 19:17