Hinweis:

Setzen Sie interne Oracle Container Engine for Kubernetes Load Balancer-Services mit Kyverno durch

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.

Anwendungen, die im OKE-Cluster ausgeführt werden, können mit Services des Typs LoadBalancer verfügbar gemacht werden. Für jeden Service erstellt der integrierte OKE-Cloud-Controller-Manager einen Oracle Cloud Infrastructure-(OCI-)Load Balancer und konfiguriert das Backend automatisch so, dass die OKE-Worker-Knoten enthalten sind. Die OCI Load Balancer-Konfiguration kann mit Annotationen gesteuert werden. Im Falle ihrer Abwesenheit nimmt der Cloud-Controller-Manager die folgenden Standardwerte an:

Mit Kyverno können wir die Webhooks für die gegenseitige Zulassung von Kubernetes nutzen und eine Policy mit einer Gruppe von Standardanmerkungen definieren, die Services des Typs LoadBalancer hinzugefügt werden sollen, die im OKE-Cluster erstellt wurden.

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 Jun 16 17:50:48 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: Servicestandardwerte mit ClusterPolicy definieren

  1. Erstellen Sie eine Datei mit dem Namen enforce-internal-loadbalancer.yaml.

  2. Kopieren Sie den Text, und fügen Sie ihn in die Datei ein.

    apiVersion: kyverno.io/v1
    # The `ClusterPolicy` kind applies to the resources deployed in any namespace.
    kind: ClusterPolicy
    metadata:
    name: mutate-oci-services
    spec:
    rules:
    # As part of this rule we intend to mutate Flexible Load Balancers.
    - name: mutate-lb-services
       # We look for all requests to Create or Update Kubernetes Services.
       match:
          resources:
          kinds:
          - Service
          operations:
          - CREATE
          - UPDATE
       # We exclude services with the label: "service-type: external".
       exclude:
          resources:
          selector:
             matchLabels:
                service-type: "external"
       # Out of all the services we are interested in those of type Load Balancer where the annotation oci.oraclecloud.com/load-balancer-type is not present or equal to "nlb".
       preconditions:
          all:
          - key: ""
          operator: Equals
          value: LoadBalancer
          - key: ""
          operator: NotEquals
          value: "nlb"
       # We mutate the request by appending the annotations required to create an internal Load Balancer.
       mutate:
          patchStrategicMerge:
          metadata:
             annotations:
                service.beta.kubernetes.io/oci-load-balancer-internal: "true"
                # service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1...3gi7y5a"
    # As part of this rule we intend to mutate Network Load Balancers.
    - name: mutate-nlb-services
       # We look for all requests to Create or Update Kubernetes Services with the annotation oci.oraclecloud.com/load-balancer-type: "nlb".
       match:
          resources:
          kinds:
          - Service
          annotations:
             oci.oraclecloud.com/load-balancer-type: "nlb"
          operations:
          - CREATE
          - UPDATE
       # We exclude services with the label: "service-type: external".
       exclude:
          resources:
          selector:
             matchLabels:
                service-type: "external"
       # Out of all the services we are interested in those of type Load Balancer.
       preconditions:
          all:
          - key: ""
          operator: Equals
          value: LoadBalancer
       # We mutate the request by appending the annotations required to create an internal NetworkLoad Balancer.
       mutate:
          patchStrategicMerge:
          metadata:
             annotations:
                oci-network-load-balancer.oraclecloud.com/internal: "true"
                # oci-network-load-balancer.oraclecloud.com/subnet: "ocid1.subnet.oc1...3gi7y5a"
    
  3. Speichern Sie die Datei.

    Hinweis: Eine Liste aller unterstützten Annotationen in OKE für den Servicetyp LoadBalancer finden Sie unter Zusammenfassung der Annotationen für Load Balancer und Network Load Balancer.

  4. Erstellen Sie ClusterPolicy im Cluster, und führen Sie den folgenden Befehl aus, um die Policy durchzusetzen:

    $ kubectl apply -f enforce-internal-loadbalancer.yaml
    clusterpolicy.kyverno.io/mutate-oci-services created
    

Aufgabe 3: Testen

  1. Erstellen Sie eine Datei mit dem Namen test-service.yaml, die den folgenden Text enthält:

    apiVersion: v1
    kind: Service
    metadata:
    name: my-nginx-svc
    labels:
       app: nginx
       # service-type: external
    annotations:
       oci.oraclecloud.com/load-balancer-type: "lb"
    spec:
    type: LoadBalancer
    ports:
    - port: 80
    selector:
       app: nginx
    
  2. Prüfen Sie, ob die erforderlichen Annotationen zum Erstellen einer internen LoadBalancer mit dem folgenden Befehl hinzugefügt werden:

    $ kubectl apply -f test_service.yaml --dry-run=server -o json | jq ".metadata.annotations"
    {
    "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"annotations\":{\"oci.oraclecloud.com/load-balancer-type\":\"lb\"},\"labels\":{\"app\":\"nginx\"},\"name\":\"my-nginx-svc\",\"namespace\":\"default\"},\"spec\":{\"ports\":[{\"port\":80}],\"selector\":{\"app\":\"nginx\"},\"type\":\"LoadBalancer\"}}\n",
    "oci.oraclecloud.com/load-balancer-type": "lb",
    "policies.kyverno.io/last-applied-patches": "mutate-lb-services.mutate-oci-services.kyverno.io: added /metadata/annotations/service.beta.kubernetes.io~1oci-load-balancer-internal\n",
    "service.beta.kubernetes.io/oci-load-balancer-internal": "true"
    }
    
  3. Sie können prüfen, ob der interne Load Balancer erfolgreich erstellt wurde, indem Sie den folgenden Befehl ausführen:

    $ kubectl apply -f test_service.yaml
    

Aufgabe 4: Bereinigen

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

    $ kubectl delete -f test_service.yaml
    
  2. Deinstallieren Sie Kyverno, indem Sie den folgenden Befehl ausführen:

    $ helm uninstall kyverno -n kyverno
    

Bestätigungen

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.