Hinweis:
- Dieses Tutorial erfordert Zugriff auf Oracle Cloud. Informationen zum Anmelden für einen kostenlosen Account finden Sie unter Erste Schritte mit Oracle Cloud Infrastructure Free Tier.
- Es verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, -Mandanten und -Compartments. Wenn Sie Ihre Übung abgeschlossen haben, ersetzen Sie diese Werte durch die Werte, die für Ihre Cloud-Umgebung spezifisch sind.
Fügt das Attribut ImagePullSecrets mit Kyverno in Kubernetes-Pods ein
Einführung
Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) ist ein vollständig verwalteter, skalierbarer und hochverfügbarer Service, mit dem Sie Ihre Containeranwendungen in der Cloud bereitstellen können.
Oracle Cloud Infrastructure Registry (auch als Container Registry oder OCIR bezeichnet) ist eine von Oracle verwaltete Registry, mit der Sie Ihren Workflow von der Entwicklung bis zur Produktion vereinfachen können. Container Registry erleichtert Ihnen als Entwickler das Speichern, Teilen und Verwalten von Containerimages.
Sie können öffentliche oder private Containerimage-Repositorys in OCIR erstellen:
-
Auf in den öffentlichen Repositorys gespeicherte Images kann ohne Angabe von Zugangsdaten zugegriffen werden.
-
In den privaten Repositorys gespeicherte Images erfordern Authentifizierung und Autorisierung.
Um das Image aus der privaten OCIR-Registry abzurufen, benötigt Kubernetes Zugangsdaten. Das Attribut spec.imagePullSecrets
in der Podkonfigurationsdatei gibt eine Liste mit Kubernetes-Secrets mit Zugangsdaten an, mit denen Worker-Knoten die Containerimages aus den Registrys abrufen sollen.
Um die Anwendungsmanifeste und das Deployment zu vereinfachen und einige der clusterspezifischen OKE-Konfiguration bei der Integration mit OCIR zu entkoppeln, können wir Kyverno verwenden. Dieses inkubierende Projekt unter CNCF kann Kubernetes-Ressourcen mit der Policy-Definition validieren, mutieren, generieren und bereinigen. Wir können dieses Produkt nutzen, um die Manifeste zu verändern, die wir an die Kubernetes-API weiterleiten, wenn wir neue Pods erstellen und das imagePullSecrets
-Attribut injizieren, das zum Abrufen der in OCIR gespeicherten Containerimages erforderlich ist.
Ziele
-
Stellen Sie Kyverno für das OKE-Cluster bereit.
-
Erfahren Sie, wie Sie Kyverno verwenden, um die Erstellung des OCIR-Secrets in neuen Namespaces zu ermöglichen und die
spec.imagePullSecrets
in die neuen Pods zu injizieren.
Voraussetzungen
-
Registrieren Sie sich, oder melden Sie sich bei Ihrem Oracle Cloud-Account an.
-
Verwenden Sie ein vorhandenes OKE-Cluster, oder erstellen Sie eines mit dem Schnellerstellungsablauf.
-
kubectl
wurde für den Zugriff auf das OKE-Cluster installiert und konfiguriert.
Aufgabe 1: Kyverno installieren
Auf der Kyverno-Webseite werden zwei Methoden zur Installation von Kyverno in einem Kubernetes-Cluster beschrieben:
- Helm-Diagramme
- YAMLs
In diesem Tutorial wird die Installation von Kyverno mithilfe der Helm-Diagramme erläutert.
Aufgabe 1.1: helm
installieren
-
Gehen Sie je nach aktiviertem Betriebssystem durch dieses Handbuch, und installieren Sie
helm
. -
Prüfen Sie, ob die Installation erfolgreich war, indem Sie den folgenden Befehl ausführen.
helm version # version.BuildInfo{Version:"v3.8.1", GitCommit:"5cb9af4b1b271d11d7a97a71df3ac337dd94ad37", GitTreeState:"clean", GoVersion:"go1.17.5"}
Aufgabe 1.2: Kyverno im Standalone-Modus installieren
-
Fügen Sie das Kyverno Helm-Repository hinzu.
helm repo add kyverno https://kyverno.github.io/kyverno/ # "kyverno" has been added to your repositories
-
Scannen Sie das neue Repository nach Diagrammen.
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!⎈
-
Installieren Sie Kyverno im Namespace
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
Aufgabe 2: Kubernetes-ImagePull-Secret erstellen
-
Generieren Sie den Benutzer
Auth Token
wie hier beschrieben: Authentifizierungstoken abrufen -
Stellen Sie sicher, dass die richtigen Policys für den Benutzerzugriff auf OCIR konfiguriert sind: Policys zur Kontrolle des Repository-Zugriffs
-
Bestätigen Sie die OCIR-Registry-URL, den Benutzernamen und das Kennwort:
Registry-URL basiert auf dem OCI-Regionsschlüssel:
<region-key>.ocir.io
Beispiel: Für die OCI-Region Phoenix:
phx.ocir.io
Benutzername basiert auf dem Mandanten-Namespace, dem OCI-Benutzernamen und dem IDP (sofern verwendet):
<tenancy-namespace>/<username>
oder<tenancy-namespace>/oracleidentitycloudservice/<username>
Beispiel:
axaxnpcrorw5/jdoe@acme.com
oderaxaxnpcrorw5/oracleidentitycloudservice/jdoe@acme.com
-
Erstellen Sie das Kubernetes-Secret mit dem Namen
ocirsecret
.kubectl create secret docker-registry ocirsecret --docker-server='<OCIR registry>' --docker-username='<username>' --docker-password='<auth-token>'
Beispiel:
kubectl create secret docker-registry ocirsecret --docker-server='phx.ocir.io' --docker-username='axaxnpcrorw5/jdoe@acme.com' --docker-password='cxOY5NL<AnBN}<123{_6'
Aufgabe 3: Erforderlichen Kyverno ClusterPolicies definieren
-
Erstellen Sie eine Datei mit dem Namen
add-imagepullsecret.yaml
. -
Kopieren Sie den Text, und fügen Sie ihn in die Datei ein.
--- 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
-
Ersetzen Sie die OCIR-Standardadresse
phx.OCIR.io/axaxnpcrorw5
durch die von Ihnen verwendete Adresse. -
Erstellen Sie
ClusterPolicy
im Cluster, und führen Sie den folgenden Befehl aus, um die Policy durchzusetzen.kubectl apply -f add-imagepullsecret.yaml # clusterpolicy.kyverno.io/inject-imagepullsecret-to-namespace created # clusterpolicy.kyverno.io/add-imagepullsecrets created
Aufgabe 4: Testen
-
Erstellen Sie eine Datei mit dem Namen
test-pod.yaml
, die den folgenden Text enthält:Hinweis: Füllen Sie die URL des Images aus dem privaten Repository im Platzhalter aus.
--- 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
-
Ressourcen erstellen
kubectl apply -f test-pod.yaml
-
Validieren, ob der Pod erfolgreich erstellt wurde.
kubectl get pods -n testns # NAME READY STATUS RESTARTS AGE # testpod 1/1 Running 0 2m4s
-
Prüfen Sie, ob das Secret aus dem Standard-Namespace in den neu erstellten Namespace geklont wurde.
kubectl get secret -n testns # NAME TYPE DATA AGE # ocirsecret kubernetes.io/dockerconfigjson 1 2m56s
Aufgabe 5: Bereinigen
-
Löschen Sie den Load Balancer, der während des Tests erstellt wurde.
kubectl delete -f test-pod.yaml
-
Deinstallieren Sie Kyverno, indem Sie den Befehl ausführen.
helm uninstall kyverno -n kyverno
Verwandte Links
- OKE-Dokumentation
- OCIR-Dokumentation
- Oracle Cloud Free Tier
- Bei Oracle Cloud-Account anmelden
- Kyverno-Homepage
- Private Registry für Kubernetes-Pullimage
Danksagungen
- Autor - Andrei Ilas (Principal Cloud Architect)
Weitere Lernressourcen
Sehen Sie sich andere Übungen zu docs.oracle.com/learn an, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning YouTube-Kanal zu. Besuchen Sie außerdem die Website education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.
Produktdokumentation finden Sie im Oracle Help Center.
Inject the ImagePullSecrets attribute into Kubernetes pods using Kyverno
F86190-02
September 2023
Copyright © 2023, Oracle and/or its affiliates.