Nota:
- Este tutorial requiere acceso a Oracle Cloud. Para registrarse en una cuenta gratuita, consulte Introducción a la capa gratuita de Oracle Cloud Infrastructure.
- Utiliza valores de ejemplo para las credenciales, el arrendamiento y los compartimentos de Oracle Cloud Infrastructure. Al finalizar el laboratorio, sustituya estos valores por otros específicos de su entorno en la nube.
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:
-
Se puede acceder a las imágenes almacenadas en los repositorios públicos sin proporcionar credenciales.
-
Las imágenes almacenadas en los repositorios privados requieren autenticación y autorización.
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
-
Despliegue Kyverno en el cluster de OKE.
-
Descubra cómo utilizar Kyverno para activar la creación del secreto de OCIR en nuevos espacios de nombres e inyectar
spec.imagePullSecrets
en los nuevos pods.
Requisitos
-
Regístrese o inicie sesión en su cuenta de Oracle Cloud.
-
Utilice un cluster de OKE existente o el flujo Creación rápida para crear uno.
-
kubectl
instalado y configurado para acceder al cluster de OKE.
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:
- Gráficos de Helm
- YAML
En este tutorial, nos centraremos en cómo instalar Kyverno utilizando los gráficos de Helm.
Tarea 1.1: Instalación de helm
-
Según el sistema operativo en el que esté activado, consulte esta guía e instale
helm
. -
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
-
Agregue el repositorio de Helm de Kyverno.
helm repo add kyverno https://kyverno.github.io/kyverno/ # "kyverno" has been added to your repositories
-
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!⎈
-
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
-
Genere el usuario
Auth Token
siguiendo los pasos proporcionados aquí: Obtención de un token de autenticación -
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
-
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
oaxaxnpcrorw5/oracleidentitycloudservice/jdoe@acme.com
-
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
-
Cree un archivo denominado
add-imagepullsecret.yaml
. -
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
-
Sustituya la dirección OCIR por defecto
phx.ocir.io/axaxnpcrorw5
por la que esté utilizando. -
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
-
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
-
Crear los recursos
kubectl apply -f test-pod.yaml
-
Valide si el pod se ha creado correctamente.
kubectl get pods -n testns # NAME READY STATUS RESTARTS AGE # testpod 1/1 Running 0 2m4s
-
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
-
Suprima el equilibrador de carga creado durante la prueba.
kubectl delete -f test-pod.yaml
-
Desinstale Kyverno ejecutando el comando.
helm uninstall kyverno -n kyverno
Enlaces relacionados
- Documentación de OKE
- Documentación de OCIR
- Cuenta gratuita de Oracle Cloud
- Inicia sesión en tu cuenta de Oracle Cloud
- Página de inicio de Kyverno
- Registro privado de imágenes de extracción de Kubernetes
Agradecimientos
- Autor: Andrei Ilas (arquitecto principal de Cloud)
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.
Inject the ImagePullSecrets attribute into Kubernetes pods using Kyverno
F86190-02
September 2023
Copyright © 2023, Oracle and/or its affiliates.