6.4. Cartographie des volumes à l'aide des volumes projetés
Un site projected volume met en correspondance plusieurs sources de volume existantes dans le même répertoire.
Les types de sources de volume suivants peuvent être projetés :
- Secrets
- Cartes de configuration
- API vers le bas
Toutes les sources doivent se trouver dans le même espace de noms que le module.
6.4.1. Comprendre les volumes prévus
Les volumes projetés peuvent représenter n'importe quelle combinaison de ces sources de volume dans un seul répertoire, ce qui permet à l'utilisateur de.. :
- remplir automatiquement un seul volume avec les clés de plusieurs secrets, les cartes de configuration et les informations de l'API descendante, afin que je puisse synthétiser un seul répertoire avec diverses sources d'informations ;
- remplir un seul volume avec les clés de plusieurs secrets, les cartes de configuration et les informations de l'API descendante, en spécifiant explicitement les chemins pour chaque élément, de sorte que je puisse avoir un contrôle total sur le contenu de ce volume.
Lorsque l'autorisation RunAsUser
est définie dans le contexte de sécurité d'un pod basé sur Linux, les fichiers projetés ont les autorisations correctes, y compris la propriété de l'utilisateur du conteneur. Toutefois, lorsque l'autorisation équivalente de Windows, RunAsUsername
, est définie dans un module Windows, le kubelet n'est pas en mesure de définir correctement la propriété des fichiers du volume projeté.
Par conséquent, l'autorisation RunAsUsername
définie dans le contexte de sécurité d'un pod Windows n'est pas honorée pour les volumes projetés Windows fonctionnant dans OpenShift Container Platform.
Les scénarios généraux suivants montrent comment vous pouvez utiliser les volumes prévisionnels.
- Config map, secrets, Downward API.
-
Les volumes projetés vous permettent de déployer des conteneurs avec des données de configuration comprenant des mots de passe. Une application utilisant ces ressources pourrait déployer Red Hat OpenStack Platform (RHOSP) sur Kubernetes. Les données de configuration peuvent devoir être assemblées différemment selon que les services seront utilisés pour la production ou pour les tests. Si un pod est étiqueté comme production ou test, le sélecteur d'API descendant
metadata.labels
peut être utilisé pour produire les configurations RHOSP correctes. - Config map secrets.
- Les volumes projetés vous permettent de déployer des conteneurs contenant des données de configuration et des mots de passe. Par exemple, vous pouvez exécuter une carte de configuration avec des tâches sensibles cryptées qui sont décryptées à l'aide d'un fichier de mots de passe du coffre-fort.
- ConfigMap Downward API.
-
Les volumes projetés vous permettent de générer une configuration comprenant le nom du pod (disponible via le sélecteur
metadata.name
). Cette application peut alors transmettre le nom du pod avec les requêtes afin de déterminer facilement la source sans utiliser le suivi des adresses IP. - Secrets Downward API.
-
Les volumes projetés vous permettent d'utiliser un secret comme clé publique pour crypter l'espace de noms du pod (disponible via le sélecteur
metadata.namespace
). Cet exemple permet à l'opérateur d'utiliser l'application pour fournir les informations sur l'espace de noms en toute sécurité sans utiliser de transport crypté.
6.4.1.1. Exemple de spécifications d'un pod
Voici des exemples de spécifications Pod
pour la création de volumes prévisionnels.
Pod avec un secret, une API descendante et une carte de configuration
apiVersion: v1 kind: Pod metadata: name: volume-test spec: containers: - name: container-test image: busybox volumeMounts: 1 - name: all-in-one mountPath: "/projected-volume"2 readOnly: true 3 volumes: 4 - name: all-in-one 5 projected: defaultMode: 0400 6 sources: - secret: name: mysecret 7 items: - key: username path: my-group/my-username 8 - downwardAPI: 9 items: - path: "labels" fieldRef: fieldPath: metadata.labels - path: "cpu_limit" resourceFieldRef: containerName: container-test resource: limits.cpu - configMap: 10 name: myconfigmap items: - key: config path: my-group/my-config mode: 0777 11
- 1
- Ajoutez une section
volumeMounts
pour chaque conteneur qui a besoin du secret. - 2
- Indiquez le chemin d'accès à un répertoire inutilisé dans lequel le secret apparaîtra.
- 3
- Définir
readOnly
àtrue
. - 4
- Ajouter un bloc
volumes
pour énumérer chaque source de volume projeté. - 5
- Indiquez un nom quelconque pour le volume.
- 6
- Définir l'autorisation d'exécution sur les fichiers.
- 7
- Ajouter un secret. Saisissez le nom de l'objet secret. Chaque secret que vous souhaitez utiliser doit être répertorié.
- 8
- Indiquez le chemin d'accès au fichier des secrets sous
mountPath
. Ici, le fichier des secrets se trouve dans /projected-volume/my-group/my-username. - 9
- Ajouter une source API descendante.
- 10
- Ajouter une source ConfigMap.
- 11
- Régler le mode pour la projection spécifique
S'il y a plusieurs conteneurs dans le module, chaque conteneur a besoin d'une section volumeMounts
, mais une seule section volumes
est nécessaire.
Pod avec plusieurs secrets dont le mode d'autorisation n'est pas par défaut
apiVersion: v1 kind: Pod metadata: name: volume-test spec: containers: - name: container-test image: busybox volumeMounts: - name: all-in-one mountPath: "/projected-volume" readOnly: true volumes: - name: all-in-one projected: defaultMode: 0755 sources: - secret: name: mysecret items: - key: username path: my-group/my-username - secret: name: mysecret2 items: - key: password path: my-group/my-password mode: 511
Le defaultMode
ne peut être spécifié qu'au niveau de la projection et non pour chaque source de volume. Cependant, comme illustré ci-dessus, vous pouvez explicitement définir le mode
pour chaque projection individuelle.
6.4.1.2. Considérations sur le cheminement
- Collisions Between Keys when Configured Paths are Identical
Si vous configurez des clés avec le même chemin d'accès, la spécification du pod ne sera pas acceptée comme valide. Dans l'exemple suivant, le chemin spécifié pour
mysecret
etmyconfigmap
est le même :apiVersion: v1 kind: Pod metadata: name: volume-test spec: containers: - name: container-test image: busybox volumeMounts: - name: all-in-one mountPath: "/projected-volume" readOnly: true volumes: - name: all-in-one projected: sources: - secret: name: mysecret items: - key: username path: my-group/data - configMap: name: myconfigmap items: - key: config path: my-group/data
Examinez les situations suivantes relatives aux chemins d'accès aux fichiers de volume.
- Collisions Between Keys without Configured Paths
- La seule validation en cours d'exécution possible est lorsque tous les chemins sont connus lors de la création du module, comme dans le scénario ci-dessus. Sinon, en cas de conflit, la ressource spécifiée la plus récente écrase tout ce qui la précède (cela vaut également pour les ressources mises à jour après la création du module).
- Collisions when One Path is Explicit and the Other is Automatically Projected
- En cas de collision due à la correspondance entre un chemin spécifié par l'utilisateur et des données projetées automatiquement, cette dernière ressource écrasera tout ce qui la précède, comme auparavant
6.4.2. Configuration d'un volume projeté pour un pod
Lors de la création de volumes projetés, tenez compte des situations de chemin de fichier de volume décrites à l'adresse Understanding projected volumes.
L'exemple suivant montre comment utiliser un volume projeté pour monter une source de volume secret existante. Les étapes peuvent être utilisées pour créer un nom d'utilisateur et un mot de passe secrets à partir de fichiers locaux. Vous créez ensuite un pod qui exécute un conteneur, en utilisant un volume projeté pour monter les secrets dans le même répertoire partagé.
Procédure
Pour utiliser un volume projeté afin de monter une source de volume secrète existante.
Créez des fichiers contenant les secrets, en saisissant ce qui suit, en remplaçant le mot de passe et les informations relatives à l'utilisateur, le cas échéant :
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: pass: MWYyZDFlMmU2N2Rm user: YWRtaW4=
Les valeurs
user
etpass
peuvent être n'importe quelle chaîne de caractères valide codée base64.L'exemple suivant montre
admin
en base64 :$ echo -n "admin" | base64
Exemple de sortie
YWRtaW4=
L'exemple suivant montre le mot de passe
1f2d1e2e67df
en base64 :.$ echo -n "1f2d1e2e67df" | base64
Exemple de sortie
MWYyZDFlMmU2N2Rm
Utilisez la commande suivante pour créer les secrets :
$ oc create -f <secrets-filename>
Par exemple :
$ oc create -f secret.yaml
Exemple de sortie
secret "mysecret" created
Vous pouvez vérifier que le secret a été créé à l'aide des commandes suivantes :
$ oc get secret <secret-name>
Par exemple :
$ oc get secret mysecret
Exemple de sortie
NAME TYPE DATA AGE mysecret Opaque 2 17h
$ oc get secret <secret-name> -o yaml
Par exemple :
$ oc get secret mysecret -o yaml
apiVersion: v1 data: pass: MWYyZDFlMmU2N2Rm user: YWRtaW4= kind: Secret metadata: creationTimestamp: 2017-05-30T20:21:38Z name: mysecret namespace: default resourceVersion: "2107" selfLink: /api/v1/namespaces/default/secrets/mysecret uid: 959e0424-4575-11e7-9f97-fa163e4bd54c type: Opaque
Créez un fichier de configuration de pod similaire au suivant qui inclut une section
volumes
:apiVersion: v1 kind: Pod metadata: name: test-projected-volume spec: containers: - name: test-projected-volume image: busybox args: - sleep - "86400" volumeMounts: - name: all-in-one mountPath: "/projected-volume" readOnly: true volumes: - name: all-in-one projected: sources: - secret: 1 name: user - secret: 2 name: pass
Créer le pod à partir du fichier de configuration :
oc create -f <votre_fichier_yaml_>.yaml
Par exemple :
$ oc create -f secret-pod.yaml
Exemple de sortie
pod "test-projected-volume" created
Vérifiez que le conteneur de pods est en cours d'exécution, puis surveillez les modifications apportées au pod :
$ oc get pod <name>
Par exemple :
$ oc get pod test-projected-volume
Le résultat devrait ressembler à ce qui suit :
Exemple de sortie
NAME READY STATUS RESTARTS AGE test-projected-volume 1/1 Running 0 14s
Dans un autre terminal, utilisez la commande
oc exec
pour ouvrir un shell sur le conteneur en cours d'exécution :oc exec -it <pod> <command> $ oc exec -it <pod> <command>
Par exemple :
$ oc exec -it test-projected-volume -- /bin/sh
Dans votre shell, vérifiez que le répertoire
projected-volumes
contient les sources projetées :/ # ls
Exemple de sortie
bin home root tmp dev proc run usr etc projected-volume sys var