J'ai hérité d'une configuration Kubernetes / Docker, et j'ai accidentellement écrasé le pod en modifiant quelque chose concernant le mot de passe DB.
J'essaye de résoudre ceci.
Je n'ai pas beaucoup d'expérience Kubernetes ou Docker, donc j'apprends encore à faire les choses.
La valeur est contenue dans les informations d'identification db-user-pass, je crois, qui est un secret de type Opaque.
Je le décris:
kubectl describe secrets/db-user-pass Name: db-user-pass Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 16 bytes username: 13 bytes
mais je n'ai aucune idée de comment obtenir des données de ce secret. L'exemple sur le site Kubernetes semble supposer que j'aurai une chaîne encodée en base64, mais je n'arrive même pas à l'obtenir. Comment en obtenir la valeur?
9 Réponses :
C'est le lien que vous recherchez peut-être.
Les secrets Kubernetes doivent être fournis au format encodé en base64, qui peut être créé en utilisant le binaire base64 dans le cas de distributions Linux.
Exemple:
echo "hello" | base64 aGVsbG8K
Kubernetes décode l'encodage base64 lorsque nous transmettons la clé secrète en tant que variable d'environnement ou montée en volume.
Ajoutez le paramètre --decode
pour décoder le secret à partir de base64.
echo "aGVsbG8K" | base64 --decode
affichera hello
Vous pouvez utiliser kubectl get secrets/db-user-pass -o yaml
ou -o json
où vous verrez le username
et le password
encodés en base64. Vous pouvez ensuite copier la valeur et la décoder avec quelque chose comme echo <ENCODED_VALUE> | base64 -D
.
Un one-liner plus compact pour cela:
$ kubectl get secrets/db-user-pass --template={{.data.username}} | base64 -D
et de même pour le nom d'utilisateur:
$ kubectl get secrets/db-user-pass --template={{.data.password}} | base64 -D
selon base64 sur centos7 la commande est base64 -d
pas -D
-D n'est pas disponible non plus pour ubuntu 18
Cette réponse a été publiée par quelqu'un sur un Mac OS. -d
est l'argument approprié pour décoder sous Linux.
Ce modèle ne fonctionne pas lorsqu'une clé à l'intérieur d'un secret contient un point (par exemple credentials.json
). La variante de travail est: kubectl get secrets/secret-name --template="{{index .data \"credentials.json\" | base64decode}}"
. Notez également l'utilisation du base64decode
base64
de Go au lieu de base64
du système d'exploitation pour le faire fonctionner sous n'importe quel système d'exploitation.
Tout d'abord, obtenez le secret sur etcd en interrogeant le serveur api à l'aide de kubectl.
kubectl get secret db-user-pass -o yaml
Cela vous donnera le secret encodé en base64 au format yaml.
Une fois que vous avez le fichier yaml, décodez-les en utilisant
"base64 --decode"
La commande finale ressemblera à ceci: N'oubliez pas l'indicateur -n
dans la commande echo
echo -n "jdddjdkkdkdmdl" | base64 --decode
Je suggérerais d'utiliser cette commande pratique. Il utilise une puissance de go-templates . Il itère sur toutes les valeurs, les décode et les imprime avec la clé. Il gère également les valeurs non définies.
kubectl get secret name-of-secret -o go-template=' {{range $k,$v := .data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}' ## In your case it would output # password: decoded_password # username: doceded_username
Si vous n'aimez pas les go-templates, vous pouvez utiliser différents formats de sortie, par exemple yaml
ou json
, mais cela produira des secrets encodés en base64.
C'est la réponse la plus robuste.
Quelqu'un a-t-il trouvé la syntaxe pour que cela fonctionne dans PowerShell? Si je mets le modèle dans un fichier et que j'utilise --go-template-file
cela fonctionne. Mais --go-template
se comporte différemment (donne diverses erreurs sur ceci ou cela inattendu). Même en échappant correctement à la corde (ce qui, franchement, est douloureux).
Pour un décodage plus facile, vous pouvez utiliser un outil comme ksd qui effectuera le décodage base64 pour vous
kubectl view-secret secrets/db-user-pass
ou en utilisant https://github.com/elsesiy/kubectl-view-secret
kubectl get secrets/db-user-pass -o yaml | ksd
Si vous avez jq (requête json), cela fonctionne:
kubectl get secret db-user-pass -o json | jq '.data | map_values(@base64d)'
Cela marche! Notez qu'il nécessite jq 1.6 ou supérieur (qui n'est pas installé de base sur certains systèmes) et peut avoir des problèmes par github.com/stedolan/jq/issues/47
Cela donne le plus beau résultat!
sur ubuntu 18+
kubectl get secrets/db-user-pass --template={{.data.password}} | base64 -d
Gouverneurs 1.11+
kubectl get secrets/db-user-pass --template='{{.data.password | base64decode }}'
Si vos clés secrètes contiennent un tiret ( -
) ou un point ( .
):
kubectl get secret db-user-pass -o=go-template='{{index .data "password"}}' | base64 -d
Essayez
kubectl get secret db-user-pass -o yaml
, qui lekubectl get secret db-user-pass -o yaml
YAML et inclura généralement les valeurs secrètes codées.Parfait! Merci. Si vous voulez écrire ceci comme réponse, je l'accepterai.
kubectl get secret db-user-pass -o json | jq '.data | map_values(@base64d)'
. Cela donne les meilleurs résultats mais nécessite la dépendance jq .