Nota:

Inyecte el atributo ImagePullSecrets a los pods de Kubernetes mediante Kyverno

Introducción

Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) es un servicio totalmente gestionado, ampliable y altamente disponible que puede utilizar para desplegar las aplicaciones en contenedores en la nube.

Oracle Cloud Infrastructure Registry (también conocido como Container Registry u OCIR) es un registro gestionado por Oracle que permite simplificar el desarrollo en el flujo de trabajo de producción. Container Registry facilita al usuario la tarea de desarrollador almacenar, compartir y gestionar imágenes de contenedor.

Puede crear repositorios de imágenes de contenedor públicas o privadas en OCIR:

Para extraer la imagen del registro privado de OCIR, Kubernetes necesita credenciales. El atributo spec.imagePullSecrets del archivo de configuración de pod especifica una lista de secretos de Kubernetes con credenciales que los nodos de trabajador deben utilizar para extraer las imágenes de contenedor de los registros.

Para simplificar la implementación y los manifiestos de la aplicación, y para desvincular parte de la configuración específica del cluster de OKE al integrarse con OCIR, podemos usar Kyverno. Este proyecto de incubación con CNCF puede validar, modificar, generar y limpiar recursos de Kubernetes mediante la definición de políticas. Aprovechamos este producto para silenciar los manifiestos que enviamos a la API de Kubernetes al crear nuevos pods e inyectar el atributo imagePullSecrets, necesario para extraer las imágenes de contenedor almacenadas en OCIR.

Objetivos

Requisitos

Tarea 1: Instalación de Kyverno

La página web de Kyverno describe dos métodos para instalar Kyverno en un cluster de Kubernetes mediante:

En este tutorial, nos centraremos en cómo instalar Kyverno utilizando los gráficos de Helm.

Tarea 1.1: Instalación de helm

  1. Según el sistema operativo en el que esté activado, consulte esta guía e instale helm.

  2. Confirme si la instalación se ha realizado correctamente ejecutando el siguiente comando.

    helm version
    # version.BuildInfo{Version:"v3.8.1", GitCommit:"5cb9af4b1b271d11d7a97a71df3ac337dd94ad37", GitTreeState:"clean", GoVersion:"go1.17.5"}
    

Tarea 1.2: Instalación de Kyverno en modo independiente

  1. Agregue el repositorio de Helm de Kyverno.

    helm repo add kyverno https://kyverno.github.io/kyverno/
    # "kyverno" has been added to your repositories
    
  2. Escanee el nuevo repositorio para los gráficos.

    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. Instale Kyverno en el espacio de nombres 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
    

Tarea 2: Creación del secreto de Kubernetes ImagePull

  1. Genere el usuario Auth Token siguiendo los pasos proporcionados aquí: Obtención de un token de autenticación

  2. Asegúrese de que se han configurado las políticas adecuadas para permitir el acceso del usuario a OCIR: Políticas para controlar el acceso al repositorio

  3. Confirme la URL, el nombre de usuario y la contraseña del registro de OCIR:

    La URL de registro se basa en la clave de región de OCI: <region-key>.ocir.io

    Ejemplo: para la región Phoenix de OCI: phx.ocir.io

    El nombre de usuario se basa en el espacio de nombres de arrendamiento, el nombre de usuario de oci e IDP(si se utiliza): <tenancy-namespace>/<username> o <tenancy-namespace>/oracleidentitycloudservice/<username>

    Ejemplo:

    axaxnpcrorw5/jdoe@acme.com o axaxnpcrorw5/oracleidentitycloudservice/jdoe@acme.com

  4. Cree un secreto de Kubernetes denominado ocirsecret.

    kubectl create secret docker-registry ocirsecret --docker-server='<OCIR registry>' --docker-username='<username>' --docker-password='<auth-token>'
    

    Ejemplo:

    kubectl create secret docker-registry ocirsecret --docker-server='phx.ocir.io' --docker-username='axaxnpcrorw5/jdoe@acme.com' --docker-password='cxOY5NL<AnBN}<123{_6'

Tarea 3: Definir Kyverno necesario ClusterPolicies

  1. Cree un archivo denominado add-imagepullsecret.yaml.

  2. Copie y pegue el siguiente texto en el archivo.

    ---
    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. Sustituya la dirección OCIR por defecto phx.ocir.io/axaxnpcrorw5 por la que esté utilizando.

  4. Cree ClusterPolicy en el cluster y ejecute el siguiente comando para aplicar la política.

    kubectl apply -f add-imagepullsecret.yaml
    # clusterpolicy.kyverno.io/inject-imagepullsecret-to-namespace created
    # clusterpolicy.kyverno.io/add-imagepullsecrets created
    

Tarea 4: prueba

  1. Cree un archivo denominado test-pod.yaml que contenga el texto siguiente:

    Nota: Rellene la URL de la imagen del repositorio privado en el marcador de posición.

    ---
    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. Crear los recursos

    kubectl apply -f test-pod.yaml
    
  3. Valide si el pod se ha creado correctamente.

    kubectl get pods -n testns
    # NAME      READY   STATUS    RESTARTS   AGE
    # testpod   1/1     Running   0          2m4s
    
  4. Valide si el secreto se ha clonado del espacio de nombres por defecto al nuevo espacio de nombres creado.

    kubectl get secret -n testns
    # NAME         TYPE                             DATA   AGE
    # ocirsecret   kubernetes.io/dockerconfigjson   1      2m56s
    

Tarea 5: Limpiar

  1. Suprima el equilibrador de carga creado durante la prueba.

    kubectl delete -f test-pod.yaml
    
  2. Desinstale Kyverno ejecutando el comando.

    helm uninstall kyverno -n kyverno
    

Agradecimientos

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en un explorador de Oracle Learning.

Para obtener documentación sobre los productos, visite Oracle Help Center.