Remarque :
- Ce tutoriel nécessite un accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, reportez-vous à Introduction au niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeur pour les informations d'identification Oracle Cloud Infrastructure, la location et les compartiments. A la fin de votre atelier, remplacez ces valeurs par celles propres à votre environnement cloud.
Injecter l'attribut ImagePullSecrets dans les pods Kubernetes à l'aide de Kyverno
Introduction
Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) est un service entièrement géré, évolutif et hautement disponible que vous pouvez utiliser pour déployer vos applications en conteneur vers le cloud.
Oracle Cloud Infrastructure Registry (également appelé Container Registry ou OCIR) est un registre géré par Oracle qui vous permet de simplifier votre workflow du développement jusqu'en production. Container Registry facilite le stockage, le partage et la gestion d'images de conteneur en tant que développeur.
Vous pouvez créer des référentiels d'images de conteneur publics ou privés dans OCIR :
-
Les images stockées dans les référentiels publics sont accessibles sans fournir d'informations d'identification.
-
Les images stockées dans les référentiels privés nécessitent une authentification et une autorisation.
Pour extraire l'image du registre privé OCIR, Kubernetes a besoin d'informations d'identification. L'attribut spec.imagePullSecrets
du fichier de configuration de pod indique la liste des clés secrètes Kubernetes avec les informations d'identification que les noeuds de processus actif doivent utiliser pour extraire les images de conteneur des registres.
Pour simplifier les manifestes d'application et le déploiement, et pour découpler une partie de la configuration propre au cluster OKE lors de l'intégration à OCIR, nous pouvons utiliser Kyverno. Ce projet d'incubation sous CNCF peut valider, muter, générer et nettoyer les ressources Kubernetes à l'aide de la définition des stratégies. Nous pouvons tirer parti de ce produit pour mettre en sourdine les manifestes que nous soumettons à l'API Kubernetes lorsque nous créons des pods et que nous injectons l'attribut imagePullSecrets
, requis pour extraire les images de conteneur stockées dans OCIR.
Objectifs
-
Déployez Kyverno sur le cluster OKE.
-
Découvrez comment utiliser Kyverno pour permettre la création du secret OCIR dans les nouveaux espaces de noms et injecter
spec.imagePullSecrets
dans les nouveaux pods.
Prérequis
-
Inscrivez-vous ou connectez-vous à votre compte Oracle Cloud.
-
Utilisez un cluster OKE existant ou le flux Création rapide pour en créer un.
-
kubectl
est installé et configuré pour accéder au cluster OKE.
Tâche 1 : installation de Kyverno
La page Web Kyverno décrit deux méthodes d'installation de Kyverno sur un cluster Kubernetes, à l'aide des méthodes suivantes :
- Graphiques Helm
- YAML
Dans ce tutoriel, nous allons nous concentrer sur l'installation de Kyverno à l'aide des graphiques Helm.
Tâche 1.1 : installation de helm
-
Selon le système d'exploitation que vous utilisez, passez par ce guide et installez
helm
. -
Vérifiez que l'installation a réussi en exécutant la commande suivante.
helm version # version.BuildInfo{Version:"v3.8.1", GitCommit:"5cb9af4b1b271d11d7a97a71df3ac337dd94ad37", GitTreeState:"clean", GoVersion:"go1.17.5"}
Tâche 1.2 : installation de Kyverno en mode autonome
-
Ajoutez le référentiel Kyverno Helm.
helm repo add kyverno https://kyverno.github.io/kyverno/ # "kyverno" has been added to your repositories
-
Recherchez des graphiques dans le nouveau référentiel.
helm repo update # Hang tight while we grab the latest from your chart repositories... # ...Successfully got an update from the "kyverno" chart repository # Update Complete. ⎈Happy Helming!⎈
-
Installez Kyverno dans l'espace de noms
kyverno
.helm install kyverno kyverno/kyverno -n kyverno --create-namespace # NAME: kyverno # LAST DEPLOYED: Fri Aug 30 12:20:33 2023 # NAMESPACE: kyverno # STATUS: deployed # REVISION: 1 # NOTES: # Chart version: 3.0.1 # Kyverno version: v1.10.0 # Thank you for installing kyverno! Your release is named kyverno. # The following components have been installed in your cluster: # - CRDs # - Admission controller # - Reports controller # - Cleanup controller # - Background controller
Tâche 2 : création d'une clé secrète ImagePull Kubernetes
-
Générez l'utilisateur
Auth Token
en suivant les étapes indiquées ici : Obtention d'un jeton d'authentification -
Assurez-vous que les stratégies appropriées sont configurées pour autoriser l'accès utilisateur à OCIR : Stratégies de contrôle d'accès au référentiel
-
Confirmez l'URL, le nom utilisateur et le mot de passe du registre OCIR :
L'URL de registre est basée sur la clé de région OCI :
<region-key>.ocir.io
Exemple : pour la région OCI Phoenix :
phx.ocir.io
Le nom utilisateur est basé sur l'espace de noms de location, le nom utilisateur et le fournisseur d'identités oci (le cas échéant) :
<tenancy-namespace>/<username>
ou<tenancy-namespace>/oracleidentitycloudservice/<username>
Exemple :
axaxnpcrorw5/jdoe@acme.com
ouaxaxnpcrorw5/oracleidentitycloudservice/jdoe@acme.com
-
Créez une clé secrète Kubernetes nommée
ocirsecret
.kubectl create secret docker-registry ocirsecret --docker-server='<OCIR registry>' --docker-username='<username>' --docker-password='<auth-token>'
Exemple :
kubectl create secret docker-registry ocirsecret --docker-server='phx.ocir.io' --docker-username='axaxnpcrorw5/jdoe@acme.com' --docker-password='cxOY5NL<AnBN}<123{_6'
Tâche 3 : définir Kyverno obligatoire ClusterPolicies
-
Créez un fichier nommé
add-imagepullsecret.yaml
. -
Copiez et collez le texte ci-dessous dans le fichier.
--- apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: inject-imagepullsecret-to-namespace annotations: policies.kyverno.io/title: Clone imagePullSecret secret to new namespaces policies.kyverno.io/subject: Namespace policies.kyverno.io/description: >- ImagePullSecrets must be present in the same namespace as the pods using them. This policy monitors for new namespaces being created (except kube-system and kyverno), and automatically clones into the namespace the `ocirsecret` from the `default` namespace. spec: generateExisting: true rules: - name: inject-imagepullsecret-to-namespace match: any: - resources: kinds: - Namespace exclude: any: - resources: namespaces: - kube-system - kube-node-lease - kube-public - kyverno generate: apiVersion: v1 kind: Secret name: ocirsecret namespace: "{{ request.object.metadata.name }}" synchronize: true clone: namespace: default name: ocirsecret --- apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: add-imagepullsecrets annotations: policies.kyverno.io/title: Add imagePullSecrets policies.kyverno.io/subject: Pod policies.kyverno.io/description: >- Images coming from certain registries require authentication in order to pull them, and the kubelet uses this information in the form of an imagePullSecret to pull those images on behalf of your Pod. This policy searches pod spec for images coming from a registry which contains `phx.ocir.io/axaxnpcrorw5` and, if found, will mutate the Pod to add an imagePullSecret called `ocirsecret`. spec: rules: - name: add-imagepullsecret match: any: - resources: kinds: - Pod context: - name: images_in_ocir variable: jmesPath: "[request.object.spec.containers[*].image.contains(@, 'phx.ocir.io/axaxnpcrorw5'), request.object.spec.initContainers[*].image.contains(@, 'phx.ocir.io/axaxnpcrorw5')][]" default: [] preconditions: all: - key: true operator: In value: "{{ images_in_ocir }}" mutate: patchStrategicMerge: spec: imagePullSecrets: - name: ocirsecret
-
Remplacez l'adresse OCIR par défaut
phx.ocir.io/axaxnpcrorw5
par celle que vous utilisez. -
Créez le fichier
ClusterPolicy
dans le cluster et exécutez la commande ci-dessous pour appliquer la stratégie.kubectl apply -f add-imagepullsecret.yaml # clusterpolicy.kyverno.io/inject-imagepullsecret-to-namespace created # clusterpolicy.kyverno.io/add-imagepullsecrets created
Tâche 4 : Test
-
Créez un fichier nommé
test-pod.yaml
contenant le texte ci-dessous :Remarque : remplissez l'URL de l'image à partir du référentiel privé dans l'espace réservé.
--- apiVersion: v1 kind: Namespace metadata: name: testns --- apiVersion: v1 kind: Pod metadata: labels: run: testpod name: testpod namespace: testns spec: containers: - args: - /bin/sh - -c - sleep infinity image: <image_from_OCIR> # eg: phx.ocir.io/axaxnpcrorw5/nginx:latest name: test resources: {} dnsPolicy: ClusterFirst restartPolicy: Always
-
Créer les ressources
kubectl apply -f test-pod.yaml
-
Vérifiez si le pod a été créé.
kubectl get pods -n testns # NAME READY STATUS RESTARTS AGE # testpod 1/1 Running 0 2m4s
-
Vérifiez si la clé secrète a été clonée de l'espace de noms par défaut vers le nouvel espace de noms créé.
kubectl get secret -n testns # NAME TYPE DATA AGE # ocirsecret kubernetes.io/dockerconfigjson 1 2m56s
Tâche 5 : nettoyage
-
Supprimez l'équilibreur de charge créé lors du test.
kubectl delete -f test-pod.yaml
-
Désinstallez Kyverno en exécutant la commande.
helm uninstall kyverno -n kyverno
Liens connexes
- Documentation OKE
- Documentation OCIR
- Niveau gratuit Oracle Cloud
- Connexion à votre compte Oracle Cloud
- Page d'accueil de Kyverno
- Registre privé d'image d'extraction Kubernetes
Remerciements
- Auteur - Andrei Ilas (architecte cloud principal)
Ressources de formation supplémentaires
Explorez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenu de formation gratuit sur le canal Oracle Learning YouTube. En outre, accédez à education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.
Pour consulter la documentation produit, consultez Oracle Help Center.
Inject the ImagePullSecrets attribute into Kubernetes pods using Kyverno
F86190-02
September 2023
Copyright © 2023, Oracle and/or its affiliates.