Remarque :

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 :

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

Prérequis

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 :

Dans ce tutoriel, nous allons nous concentrer sur l'installation de Kyverno à l'aide des graphiques Helm.

Tâche 1.1 : installation de helm

  1. Selon le système d'exploitation que vous utilisez, passez par ce guide et installez helm.

  2. 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

  1. Ajoutez le référentiel Kyverno Helm.

    helm repo add kyverno https://kyverno.github.io/kyverno/
    # "kyverno" has been added to your repositories
    
  2. 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!⎈
    
  3. 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

  1. Générez l'utilisateur Auth Token en suivant les étapes indiquées ici : Obtention d'un jeton d'authentification

  2. 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

  3. 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 ou axaxnpcrorw5/oracleidentitycloudservice/jdoe@acme.com

  4. 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

  1. Créez un fichier nommé add-imagepullsecret.yaml.

  2. 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
    
  3. Remplacez l'adresse OCIR par défaut phx.ocir.io/axaxnpcrorw5 par celle que vous utilisez.

  4. 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

  1. 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
    
  2. Créer les ressources

    kubectl apply -f test-pod.yaml
    
  3. Vérifiez si le pod a été créé.

    kubectl get pods -n testns
    # NAME      READY   STATUS    RESTARTS   AGE
    # testpod   1/1     Running   0          2m4s
    
  4. 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

  1. Supprimez l'équilibreur de charge créé lors du test.

    kubectl delete -f test-pod.yaml
    
  2. Désinstallez Kyverno en exécutant la commande.

    helm uninstall kyverno -n kyverno
    

Remerciements

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.