Nota:

Iniettare l'attributo ImagePullSecrets nei pod Kubernetes utilizzando Kyverno

Introduzione

Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) è un servizio completamente gestito, scalabile e ad alta disponibilità che puoi utilizzare per distribuire le tue applicazioni in container nel cloud.

Oracle Cloud Infrastructure Registry (noto anche come Container Registry o OCIR) è un registro gestito da Oracle che consente di semplificare lo sviluppo verso il flusso di lavoro di produzione. Container Registry consente agli sviluppatori di memorizzare, condividere e gestire le immagini dei container con facilità.

È possibile creare repository di immagini di container pubblici o privati in OCIR:

Per estrarre l'immagine dal registro privato OCIR, Kubernetes richiede le credenziali. L'attributo spec.imagePullSecrets nel file di configurazione pod specifica una lista di segreti Kubernetes con credenziali che i nodi di lavoro devono utilizzare per estrarre le immagini dei container dai registri.

Per semplificare i file manifest e la distribuzione dell'applicazione e scollegare alcune delle configurazioni specifiche del cluster OKE durante l'integrazione con OCIR, è possibile utilizzare Kyverno. Questo progetto di incubazione in CNCF può convalidare, modificare, generare ed eseguire il cleanup delle risorse Kubernetes utilizzando la definizione dei criteri. Possiamo trarre vantaggio da questo prodotto per modificare i file manifest che stiamo sottomettendo all'API Kubernetes quando creiamo nuovi pod e inseriamo l'attributo imagePullSecrets, necessario per estrarre le immagini dei container memorizzate in OCIR.

Obiettivi

Prerequisiti

Task 1: Installare Kyverno

La pagina Web Kyverno descrive due metodi per installare Kyverno su un cluster Kubernetes, utilizzando:

In questa esercitazione, ci concentreremo su come installare Kyverno utilizzando i grafici Helm.

Task 1.1: Installazione di helm

  1. A seconda del sistema operativo in uso, consultare questa guida e installare helm.

  2. Verificare se l'installazione riesce correttamente eseguendo il comando seguente.

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

Task 1.2: Installare Kyverno in modalità standalone

  1. Aggiungere il repository Kyverno Helm.

    helm repo add kyverno https://kyverno.github.io/kyverno/
    # "kyverno" has been added to your repositories
    
  2. Eseguire la scansione del nuovo repository per individuare i grafici.

    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. Installare Kyverno nello spazio di nomi 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
    

Task 2: creare il segreto ImagePull di Kubernetes

  1. Generare l'utente Auth Token seguendo i passi forniti qui: Recupero di un token di autenticazione

  2. Assicurarsi che i criteri appropriati siano configurati per consentire l'accesso utente a OCIR: Criteri per controllare l'accesso al repository

  3. Confermare l'URL, il nome utente e la password del registro OCIR:

    URL registro si basa sulla chiave area OCI: <region-key>.ocir.io

    Esempio: per l'area OCI di Phoenix: phx.ocir.io

    Nome utente si basa sullo spazio di nomi della tenancy, sul nome utente oci e sull'IDP (se utilizzato): <tenancy-namespace>/<username> o <tenancy-namespace>/oracleidentitycloudservice/<username>

    Esempio:

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

  4. Crea il segreto Kubernetes denominato ocirsecret.

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

    Esempio:

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

Task 3: Definire Kyverno richiesto ClusterPolicies

  1. Creare un file denominato add-imagepullsecret.yaml.

  2. Copiare e incollare il testo seguente nel file.

    ---
    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. Sostituire l'indirizzo OCIR predefinito phx.ocir.io/axaxnpcrorw5 con quello in uso.

  4. Creare il file ClusterPolicy nel cluster ed eseguire il comando riportato di seguito per applicare il criterio.

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

Task 4: Test

  1. Creare un file denominato test-pod.yaml contenente il testo seguente:

    Nota: immettere l'URL dell'immagine dal repository privato nel segnaposto.

    ---
    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. Crea le risorse

    kubectl apply -f test-pod.yaml
    
  3. Verificare se il pod è stato creato correttamente.

    kubectl get pods -n testns
    # NAME      READY   STATUS    RESTARTS   AGE
    # testpod   1/1     Running   0          2m4s
    
  4. Convalida se il segreto è stato clonato dallo spazio di nomi predefinito al nuovo spazio di nomi creato.

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

Task 5: cleanup

  1. Eliminare il load balancer creato durante il test.

    kubectl delete -f test-pod.yaml
    
  2. Disinstallare Kyverno eseguendo il comando.

    helm uninstall kyverno -n kyverno
    

Approvazioni

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi a contenuti di formazione gratuiti sul canale YouTube di Oracle Learning. Inoltre, visitare education.oracle.com/learning-explorer per diventare Explorer di Oracle Learning.

Per la documentazione sul prodotto, visitare il sito Oracle Help Center.