Nota:
- Questa esercitazione richiede l'accesso a Oracle Cloud. Per iscriversi a un account gratuito, consulta Inizia a utilizzare Oracle Cloud Infrastructure Free Tier.
- Utilizza valori di esempio per le credenziali, la tenancy e i compartimenti di Oracle Cloud Infrastructure. Al termine del laboratorio, sostituisci questi valori con quelli specifici del tuo ambiente cloud.
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:
-
È possibile accedere alle immagini memorizzate nei repository pubblici senza fornire le credenziali.
-
Le immagini memorizzate nei repository privati richiedono autenticazione e autorizzazione.
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
-
Distribuire Kyverno nel cluster OKE.
-
Scopri come utilizzare Kyverno per creare il segreto OCIR nei nuovi spazi di nomi e inserire
spec.imagePullSecrets
nei nuovi pod.
Prerequisiti
-
Iscriversi o accedere all'account Oracle Cloud.
-
Utilizzare un cluster OKE esistente o il flusso Creazione rapida per crearne uno.
-
kubectl
installato e configurato per accedere al cluster OKE.
Task 1: Installare Kyverno
La pagina Web Kyverno descrive due metodi per installare Kyverno su un cluster Kubernetes, utilizzando:
- Grafici Helm
- YAML
In questa esercitazione, ci concentreremo su come installare Kyverno utilizzando i grafici Helm.
Task 1.1: Installazione di helm
-
A seconda del sistema operativo in uso, consultare questa guida e installare
helm
. -
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
-
Aggiungere il repository Kyverno Helm.
helm repo add kyverno https://kyverno.github.io/kyverno/ # "kyverno" has been added to your repositories
-
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!⎈
-
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
-
Generare l'utente
Auth Token
seguendo i passi forniti qui: Recupero di un token di autenticazione -
Assicurarsi che i criteri appropriati siano configurati per consentire l'accesso utente a OCIR: Criteri per controllare l'accesso al repository
-
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
oaxaxnpcrorw5/oracleidentitycloudservice/jdoe@acme.com
-
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
-
Creare un file denominato
add-imagepullsecret.yaml
. -
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
-
Sostituire l'indirizzo OCIR predefinito
phx.ocir.io/axaxnpcrorw5
con quello in uso. -
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
-
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
-
Crea le risorse
kubectl apply -f test-pod.yaml
-
Verificare se il pod è stato creato correttamente.
kubectl get pods -n testns # NAME READY STATUS RESTARTS AGE # testpod 1/1 Running 0 2m4s
-
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
-
Eliminare il load balancer creato durante il test.
kubectl delete -f test-pod.yaml
-
Disinstallare Kyverno eseguendo il comando.
helm uninstall kyverno -n kyverno
Collegamenti correlati
- Documentazione OKE
- Documentazione OCIR
- Livello gratuito Oracle Cloud
- Collegarsi all'account Oracle Cloud
- Home page Kyverno
- Registro privato dell'immagine di pull Kubernetes
Approvazioni
- Autore - Andrej Ilas (Principal Cloud Architect)
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.
Inject the ImagePullSecrets attribute into Kubernetes pods using Kyverno
F86190-02
September 2023
Copyright © 2023, Oracle and/or its affiliates.