Hinweis:

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:

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

Voraussetzungen

Aufgabe 1: Kyverno installieren

Auf der Kyverno-Webseite werden zwei Methoden zur Installation von Kyverno in einem Kubernetes-Cluster beschrieben:

In diesem Tutorial wird die Installation von Kyverno mithilfe der Helm-Diagramme erläutert.

Aufgabe 1.1: helm installieren

  1. Gehen Sie je nach aktiviertem Betriebssystem durch dieses Handbuch, und installieren Sie helm.

  2. 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

  1. Fügen Sie das Kyverno Helm-Repository hinzu.

    helm repo add kyverno https://kyverno.github.io/kyverno/
    # "kyverno" has been added to your repositories
    
  2. 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!⎈
    
  3. 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

  1. Generieren Sie den Benutzer Auth Token wie hier beschrieben: Authentifizierungstoken abrufen

  2. Stellen Sie sicher, dass die richtigen Policys für den Benutzerzugriff auf OCIR konfiguriert sind: Policys zur Kontrolle des Repository-Zugriffs

  3. 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 oder axaxnpcrorw5/oracleidentitycloudservice/jdoe@acme.com

  4. 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

  1. Erstellen Sie eine Datei mit dem Namen add-imagepullsecret.yaml.

  2. 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
    
  3. Ersetzen Sie die OCIR-Standardadresse phx.OCIR.io/axaxnpcrorw5 durch die von Ihnen verwendete Adresse.

  4. 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

  1. 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
    
  2. Ressourcen erstellen

    kubectl apply -f test-pod.yaml
    
  3. Validieren, ob der Pod erfolgreich erstellt wurde.

    kubectl get pods -n testns
    # NAME      READY   STATUS    RESTARTS   AGE
    # testpod   1/1     Running   0          2m4s
    
  4. 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

  1. Löschen Sie den Load Balancer, der während des Tests erstellt wurde.

    kubectl delete -f test-pod.yaml
    
  2. Deinstallieren Sie Kyverno, indem Sie den Befehl ausführen.

    helm uninstall kyverno -n kyverno
    

Danksagungen

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.