Secret

Prérequis

Déployer le service myboot :

kubectl apply -f apps/kubefiles/myboot-deployment.yml

Déployer le service myboot :

kubectl apply -f apps/kubefiles/myboot-service.yml

Regardez vos Pods:

watch kubectl get pods

Regardez vos services:

watch kubectl get services
NAME    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
myapp   LoadBalancer   172.30.103.41   <pending>     8080:31974/TCP   4s

Attendez jusqu’à ce que vous voyez une IP externe assignée.

NAME    TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
myapp   LoadBalancer   172.30.103.41   34.71.122.153   8080:31974/TCP   44s

Créer les variables IP et PORT :

IP=$(minikube ip)
PORT=$(kubectl get service/myboot -o jsonpath="{.spec.ports[*].nodePort}")

Réaliser une requete du service :

curl $IP:$PORT

L’exemple de ConfigMap présenté précédemment contenait une chaîne de connexion à une base de données (“user=MyUserName;password=*"). Les données sensibles comme les mots de passe peuvent être placées dans un autre récipient appelé Secret.

Créer des secrets

kubectl create secret generic mysecret --from-literal=user='MyUserName' --from-literal=password='mypassword'
kubectl get secrets
NAME                       TYPE                                  DATA   AGE
builder-dockercfg-96ml5    kubernetes.io/dockercfg               1      3d6h
builder-token-h5g82        kubernetes.io/service-account-token   4      3d6h
builder-token-vqjqz        kubernetes.io/service-account-token   4      3d6h
default-dockercfg-bsnjr    kubernetes.io/dockercfg               1      3d6h
default-token-bl77s        kubernetes.io/service-account-token   4      3d6h
default-token-vlzsl        kubernetes.io/service-account-token   4      3d6h
deployer-dockercfg-k6npn   kubernetes.io/dockercfg               1      3d6h
deployer-token-4hb78       kubernetes.io/service-account-token   4      3d6h
deployer-token-vvh6r       kubernetes.io/service-account-token   4      3d6h
mysecret                   Opaque                                2      5s

L’utilisateur et le mot de passe ne sont pas immédiatement visibles :

Name:         mysecret
Namespace:    myspace
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  10 bytes
user:      10 bytes
apiVersion: v1
data:
  password: bXlwYXNzd29yZA==
  user: TXlVc2VyTmFtZQ==
kind: Secret
metadata:
  creationTimestamp: "2020-03-31T20:19:26Z"
  name: mysecret
  namespace: myspace
  resourceVersion: "4944690"
  selfLink: /api/v1/namespaces/myspace/secrets/mysecret
  uid: e8c5f12e-bd71-4d6b-8d8c-7af9ed6439f8
type: Opaque

Vous pouvez voir les secrets en courant :

echo 'bXlwYXNzd29yZA==' | base64 --decode
mypassword
echo 'TXlVc2VyTmFtZQ==' | base64 --decode
MyUserName

Ou les obtenir en utilisant kubectl :

kubectl get secret mysecret -o jsonpath='{.data.password}' | base64 --decode

Les secrets sont fournis au Pod via des montages de volumes :

        volumeMounts:
          - name: mysecretvolume
            mountPath: /mystuff/mysecretvolume

Nouveau déploiement avec le volume secret :

vim apps/kubefiles/myboot-deployment-configuration-secret.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myboot
  name: myboot
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myboot
  template:
    metadata:
      labels:
        app: myboot
    spec:
      containers:
      - name: myboot
        image: quay.io/rhdevelopers/myboot:v1
        ports:
          - containerPort: 8080
        volumeMounts:
          - name: mysecretvolume #<.>
            mountPath: /mystuff/secretstuff
            readOnly: true
        resources:
          requests:
            memory: "300Mi"
            cpu: "250m" # 1/4 core
          limits:
            memory: "400Mi"
            cpu: "1000m" # 1 core
      volumes:
        - name: mysecretvolume #<.>
          secret:
            secretName: mysecret
kubectl replace -f apps/kubefiles/myboot-deployment-configuration-secret.yml

Exec dans le Pod nouvellement créé :

PODNAME=$(kubectl get pod -l app=myboot -o name)
kubectl exec $PODNAME -- cat /mystuff/secretstuff/password

Résultat

mypassword

Vous pourriez fournir l’emplacement de /mystuff/mysecretvolume au pod via une variable d’environnement afin que l’application sache où chercher.

Supprimer vos ressources

kubectl delete deployment myboot
kubectl delete service myboot