Secret
Roles
Ils ont plusieurs usages :
- Comme pour les configmap les secrets sont utilisés par les pods comme variables d’environnement ou comme fichiers.
- Ils servent aussi pour les ingress pour fournir les certificats.
- Ils servent à donner les crédentials pour être en mesure de récupérer des images sur un registry docker protégé ou acceder à un serveur ssh ou du basic auth.
S’ils ont leurs données encodées (en base 64), il faut bien réaliser que les données d’un secret ne sont pas chiffrées.
Ainsi, il suffit d’utiliser l’utilitaire base64
pour décoder leur contenu.
Structure
apiVersion: v1
kind: Secret
metadata:
name: secret-sa-sample
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
On peut s’affranchir d’encoder les données nous même. Dans ce cas on troquera data
pour stringData
et Kubernetes l’encodera en base64 pour vous.
apiVersion: v1
kind: Secret
metadata:
name: secret-sa-sample
type: Opaque
stringData:
username: admin
password: 1f2d1e2e67df
Les différents types possibles
- Opaque (on y mettra ce qu’on veut)
- kubernetes.io/tls (fournit des fichiers type
tls.cert
,tls.key
,ca.cert
) - kubernetes.io/service-account-token (un jeton de service Kubernetes)
- kubernetes.io/dockerconfigjson (un Docker sérialisé config. json fichier, pour fournir les informations d’identification Docker)
- kubernetes.io/ssh-auth (fournir les informations d’identification SSH).
- kubernetes.io/basic-auth (fournit des crédentials type basic auth)
Les usages d’un secret au sein d’un pod
On peut s’en servir pour affecter une variable d’environnement.
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: SPECIAL_LEVEL_KEY
valueFrom:
secretKeyRef:
name: secret-env
key: player_initial_lives
restartPolicy: Never
On peut s’en servir pour affecter un ensemble de variables d’environnements
apiVersion: v1
kind: Pod
metadata:
name: test-volume
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- secretRef:
name: secret-env
restartPolicy: Never
On peut s’en servir pour monter un fichier unique dans un pod
apiVersion: v1
kind: Pod
metadata:
name: test-volume-file
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh","-c","cat /etc/secret/exemple.yaml" ]
volumeMounts:
- name: config-volume
mountPath: /etc/secret
volumes:
- name: config-volume
secret:
name: secret-file
items:
- key: exemple.yaml
path: exemple.yaml
restartPolicy: Never
On peut s’en servir pour monter des fichiers dans un pod
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "ls /etc/foo" ]
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
name: secret-file
Commandes utiles
Décoder un secret avec base64
:
kubectl get secret secret-sa-sample -o jsonpath="{.data.username}"|base64 --decode
Exercices
- créer un secret nommé “monsecret” à partir avec une propriété “couleur=rouge” ainsi que des fichiers suivant
monapplication.properties
test = "345"
ville = "toulouse"
fichier.yaml
test: "345"
legume:
couleur: "orange"
nom: "carotte"
ville: "toulouse"
- comparer le yaml du secret monsecret avec celui de la configmap maconfigmap
- créer le secret suivant :
apiVersion: v1
kind: Secret
metadata:
name: monsecret
type: Opaque
data:
password: YmluZ28gZsOpbGljaXRhdGlvbg==
- décoder ce secret en utilisant une ligne de commande