Cluster Autoscaler als Standalone-Programm verwenden

Erfahren Sie, wie Sie Kubernetes Cluster Autoscaler als eigenständiges Programm installieren, konfigurieren und verwenden, um die Größe der verwalteten Knotenpools in einem Cluster, das Sie mit Kubernetes Engine (OKE) erstellt haben, automatisch zu ändern.

Wenn Sie Kubernetes Cluster Autoscaler als Standalone-Programm und nicht als Cluster-Add-on verwenden, erhalten Sie vollständige Kontrolle und Verantwortung für die Konfiguration und laufende Wartung, einschließlich:

  • Installieren Sie eine Version von Kubernetes Cluster Autoscaler, die mit der auf dem Cluster ausgeführten Kubernetes-Version kompatibel ist.
  • Konfigurationsargumente werden korrekt angegeben.
  • Führen Sie beim Upgrade eines Clusters auf eine neue Kubernetes-Version ein manuelles Upgrade von Kubernetes Cluster Autoscaler aus, um sicherzustellen, dass Kubernetes Cluster Autoscaler mit der neuen Kubernetes-Version des Clusters kompatibel ist.

In den nachfolgenden Anweisungen wird beschrieben, wie Sie Kubernetes Cluster Autoscaler zum Verwalten von Knotenpools als Standalone-Programm ausführen:

Schritt 1: Instanz-Principal oder Workload Identity Principal einrichten, um Cluster Autoscaler-Zugriff auf Knotenpools zu aktivieren

Zur Verwaltung von Knotenpools führt Kubernetes Cluster Autoscaler Aktionen für andere Oracle Cloud Infrastructure-Serviceressourcen aus. Um diese Aktionen für OCI-Serviceressourcen auszuführen, verwendet Kubernetes Cluster Autoscaler die Zugangsdaten eines autorisierten Akteurs (oder Principals). Sie können derzeit die folgenden Principal-Typen einrichten, damit Kubernetes Cluster Autoscaler Aktionen für OCI-Serviceressourcen ausführen kann:

  • Instanz-Principal: Kubernetes Cluster Autoscaler verwendet die Identität der Instanz, auf der sie ausgeführt wird.
  • Workload-Identity Principal: Kubernetes Cluster Autoscaler verwendet die Identität einer Workload-Ressource, die auf einem Kubernetes-Cluster ausgeführt wird.

Beachten Sie die Verwendung von Workload Identity Principals, damit Kubernetes Cluster Autoscaler auf OCI-Services und -Ressourcen zugreifen kann:

  • wird durch erweiterte Cluster unterstützt, jedoch nicht durch einfache Cluster.
  • wird nur mit Cluster Autoscaler Version 1.26 (oder höher) unterstützt

Mit Instanz-Principals den Zugriff auf Knotenpools aktivieren

Sie können einen Instanz-Principal einrichten, damit Kubernetes Cluster Autoscaler Aktionen für OCI-Serviceressourcen ausführen kann.

So richten Sie einen Instanz-Principal ein:

  1. Melden Sie sich in der Konsole an.
  2. Erstellen Sie eine neue dynamische Gruppe auf Compartment-Ebene, die die Worker-Knoten (Compute-Instanzen) im Cluster enthält:

    1. Öffnen Sie das Navigationsmenü , und wählen Sie Identität und Sicherheit aus. Wählen Sie unter Identität die Option Domains aus. Wählen Sie unter Identitätsdomain die Option Dynamische Gruppen aus.
    2. Wählen Sie das Compartment aus, das das Cluster enthält.
    3. Befolgen Sie die Anweisungen unter So erstellen Sie eine dynamische Gruppe, und geben Sie der dynamischen Gruppe einen Namen (Beispiel: acme-oke-cluster-autoscaler-dyn-grp).
    4. Geben Sie eine Regel, die die Worker-Knoten im Compartment enthält, in folgendem Format ein:

      ALL {instance.compartment.id = '<compartment-ocid>'}

      Hierbei ist <compartment-ocid> die OCID des Compartments, zu dem das Cluster gehört.

      Beispiel:

      ALL {instance.compartment.id = 'ocid1.compartment.oc1..aaaaaaaa23______smwa'}
    5. Klicken Sie auf Dynamische Gruppe erstellen.
  3. Erstellen Sie eine Policy, mit der Worker-Knoten die Verwaltung von Knotenpools zulassen können:

    1. Öffnen Sie das Navigationsmenü , und wählen Sie Identität und Sicherheit aus. Wählen Sie unter Identität die Option Policys aus.
    2. Befolgen Sie die Anweisungen unter So erstellen Sie eine Policy, und geben Sie der Policy einen Namen (Beispiel: acme-oke-cluster-autoscaler-dyn-grp-policy).
    3. Geben Sie eine Policy-Anweisung, die Worker-Knoten zum Verwalten von Knotenpools berechtigt (sowie andere Policy-Anweisungen im Zusammenhang mit der Initialisierung von Worker-Knoten), in folgendem Format ein:

      Allow dynamic-group <dynamic-group-name> to manage cluster-node-pools in compartment <compartment-name>
      Allow dynamic-group <dynamic-group-name> to manage instance-family in compartment <compartment-name>
      Allow dynamic-group <dynamic-group-name> to use subnets in compartment <compartment-name>
      Allow dynamic-group <dynamic-group-name> to read virtual-network-family in compartment <compartment-name>
      Allow dynamic-group <dynamic-group-name> to use vnics in compartment <compartment-name>
      Allow dynamic-group <dynamic-group-name> to inspect compartments in compartment <compartment-name>

      Hierbei gilt:

      • <dynamic-group-name> ist der Name der zuvor erstellten dynamischen Gruppe. Beispiel: acme-oke-cluster-autoscaler-dyn-grp. Wenn eine dynamische Gruppe nicht in der Standardidentitätsdomain enthalten ist, stellen Sie dem Namen der dynamischen Gruppe den Namen der Identitätsdomain im Format dynamic-group '<identity-domain-name>'/'<dynamic-group-name>' voran. Sie können die dynamische Gruppe auch mit ihrer OCID im Format dynamic-group id <dynamic-group-ocid> angeben.
      • <compartment-name> ist der Name des Compartments, zu dem das Cluster gehört. Beispiel: acme-oke-cluster-autoscaler-compartment

      Beispiel:

      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to manage cluster-node-pools in compartment acme-oke-cluster-autoscaler-compartment
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to manage instance-family in compartment acme-oke-cluster-autoscaler-compartment
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use subnets in compartment acme-oke-cluster-autoscaler-compartment
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to read virtual-network-family in compartment acme-oke-cluster-autoscaler-compartment
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use vnics in compartment acme-oke-cluster-autoscaler-compartment
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to inspect compartments in compartment acme-oke-cluster-autoscaler-compartment
    4. Klicken Sie auf Erstellen, um die neue Policy zu erstellen.
    Hinweis

    Wenn ein Knotenpool zu einem Compartment gehört und die vom Knotenpool verwendeten Netzwerkressourcen zu einem anderen Compartment gehören, müssen Sie Policys wie folgt in beiden Compartments erstellen:

    • Erstellen Sie im Compartment des Knotenpools eine Policy mit Policy-Anweisungen im folgenden Format:

      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to manage cluster-node-pools in compartment <nodepool-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to manage instance-family in compartment <nodepool-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use subnets in compartment <nodepool-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use vnics in compartment <nodepool-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to inspect compartments in compartment <nodepool-compartment-name>
    • Erstellen Sie im Compartment der Netzwerkressourcen eine Policy mit Policy-Anweisungen im folgenden Format:

      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use subnets in compartment <network-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to read virtual-network-family in compartment <network-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use vnics in compartment <network-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to inspect compartments in compartment <network-compartment-name>

Mit Workload Identity Principals den Zugriff auf Knotenpools aktivieren

Sie können einen Workload Identity Principal einrichten, damit Kubernetes Cluster Autoscaler Aktionen für OCI-Serviceressourcen ausführen kann. Beachten Sie, dass Sie nur Workload-Identity Principals mit erweiterten Clustern verwenden können.

So richten Sie einen Workload Identity Principal ein:

  1. Rufen Sie die OCID des Clusters ab (z.B. mit der Registerkarte Clusterdetails in der Konsole).
  2. Öffnen Sie das Navigationsmenü , und wählen Sie Identität und Sicherheit aus. Wählen Sie unter Identität die Option Policys aus.
  3. Folgen Sie den Anweisungen unter Policy erstellen, und geben Sie der Policy einen Namen (z.B. acme-oke-cluster-autoscaler-policy).
  4. Geben Sie Policy-Anweisungen in folgendem Format ein, um die Knotenpoolverwaltung zuzulassen:

    Allow any-user to manage cluster-node-pools in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to manage instance-family in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to use subnets in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to read virtual-network-family in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to use vnics in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to inspect compartments in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'} 

    Hierbei gilt:

    • <compartment-name> ist der Name des Compartments, zu dem das Cluster gehört. Beispiel: acme-oke-cluster-autoscaler-compartment
    • <cluster-ocid> ist die OCID des Clusters, die Sie zuvor abgerufen haben.

    Beispiel:

    Allow any-user to manage cluster-node-pools in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'}
    Allow any-user to manage instance-family in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'}
    Allow any-user to use subnets in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'}
    Allow any-user to read virtual-network-family in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'}
    Allow any-user to use vnics in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'}
    Allow any-user to inspect compartments in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'} 
  5. Klicken Sie auf Erstellen, um die neue Policy zu erstellen.
Hinweis

Wenn ein Knotenpool zu einem Compartment gehört und die vom Knotenpool verwendeten Netzwerkressourcen zu einem anderen Compartment gehören, müssen Sie Policys wie folgt in beiden Compartments erstellen:

  • Erstellen Sie im Compartment des Knotenpools eine Policy mit Policy-Anweisungen im folgenden Format:

    Allow any-user to manage cluster-node-pools in compartment <nodepool-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to manage instance-family in compartment <nodepool-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to use subnets in compartment <nodepool-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to use vnics in compartment <nodepool-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to inspect compartments in compartment <nodepool-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'} 
  • Erstellen Sie im Compartment der Netzwerkressourcen eine Policy mit Policy-Anweisungen im folgenden Format:

    Allow any-user to use subnets in compartment <network-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to read virtual-network-family in compartment <network-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to use vnics in compartment <network-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to inspect compartments in compartment <network-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'} 

Schritt 2: Cluster Autoscaler-Konfigurationsdatei kopieren und anpassen

Schritt 2a: Konfigurationsdatei kopieren

  1. Erstellen Sie in einem Texteditor eine Datei namens cluster-autoscaler.yaml mit dem folgenden Inhalt:

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        k8s-addon: cluster-autoscaler.addons.k8s.io
        k8s-app: cluster-autoscaler
      name: cluster-autoscaler
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: cluster-autoscaler
      labels:
        k8s-addon: cluster-autoscaler.addons.k8s.io
        k8s-app: cluster-autoscaler
    rules:
      - apiGroups: [""]
        resources: ["events", "endpoints"]
        verbs: ["create", "patch"]
      - apiGroups: [""]
        resources: ["pods/eviction"]
        verbs: ["create"]
      - apiGroups: [""]
        resources: ["pods/status"]
        verbs: ["update"]
      - apiGroups: [""]
        resources: ["endpoints"]
        resourceNames: ["cluster-autoscaler"]
        verbs: ["get", "update"]
      - apiGroups: [""]
        resources: ["nodes"]
        verbs: ["watch", "list", "get", "patch", "update"]
      - apiGroups: [""]
        resources:
          - "pods"
          - "services"
          - "replicationcontrollers"
          - "persistentvolumeclaims"
          - "persistentvolumes"
        verbs: ["watch", "list", "get"]
      - apiGroups: ["extensions"]
        resources: ["replicasets", "daemonsets"]
        verbs: ["watch", "list", "get"]
      - apiGroups: ["policy"]
        resources: ["poddisruptionbudgets"]
        verbs: ["watch", "list"]
      - apiGroups: ["apps"]
        resources: ["statefulsets", "replicasets", "daemonsets"]
        verbs: ["watch", "list", "get"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses", "csinodes", "volumeattachments"]
        verbs: ["watch", "list", "get"]
      - apiGroups: ["batch", "extensions"]
        resources: ["jobs"]
        verbs: ["get", "list", "watch", "patch"]
      - apiGroups: ["coordination.k8s.io"]
        resources: ["leases"]
        verbs: ["create"]
      - apiGroups: ["coordination.k8s.io"]
        resourceNames: ["cluster-autoscaler"]
        resources: ["leases"]
        verbs: ["get", "update"]
      - apiGroups: [""]
        resources: ["namespaces"]
        verbs: ["watch", "list"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["csidrivers", "csistoragecapacities"]
        verbs: ["watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: cluster-autoscaler
      namespace: kube-system
      labels:
        k8s-addon: cluster-autoscaler.addons.k8s.io
        k8s-app: cluster-autoscaler
    rules:
      - apiGroups: [""]
        resources: ["configmaps"]
        verbs: ["create","list","watch"]
      - apiGroups: [""]
        resources: ["configmaps"]
        resourceNames: ["cluster-autoscaler-status", "cluster-autoscaler-priority-expander"]
        verbs: ["delete", "get", "update", "watch"]
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: cluster-autoscaler
      labels:
        k8s-addon: cluster-autoscaler.addons.k8s.io
        k8s-app: cluster-autoscaler
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-autoscaler
    subjects:
      - kind: ServiceAccount
        name: cluster-autoscaler
        namespace: kube-system
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: cluster-autoscaler
      namespace: kube-system
      labels:
        k8s-addon: cluster-autoscaler.addons.k8s.io
        k8s-app: cluster-autoscaler
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: cluster-autoscaler
    subjects:
      - kind: ServiceAccount
        name: cluster-autoscaler
        namespace: kube-system
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cluster-autoscaler
      namespace: kube-system
      labels:
        app: cluster-autoscaler
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: cluster-autoscaler
      template:
        metadata:
          labels:
            app: cluster-autoscaler
          annotations:
            prometheus.io/scrape: 'true'
            prometheus.io/port: '8085'
        spec:
          serviceAccountName: cluster-autoscaler
          containers:
            - image: iad.ocir.io/oracle/oci-cluster-autoscaler:{{ image tag }}
              name: cluster-autoscaler
              resources:
                limits:
                  cpu: 100m
                  memory: 300Mi
                requests:
                  cpu: 100m
                  memory: 300Mi
              command:
                - ./cluster-autoscaler
                - --v=4
                - --stderrthreshold=info
                - --cloud-provider=oci
                - --max-node-provision-time=25m
                - --nodes=1:5:{{ node pool ocid 1 }}
                - --nodes=1:5:{{ node pool ocid 2 }}
                - --scale-down-delay-after-add=10m
                - --scale-down-unneeded-time=10m
                - --unremovable-node-recheck-timeout=5m
                - --balance-similar-node-groups
                - --balancing-ignore-label=displayName
                - --balancing-ignore-label=hostname
                - --balancing-ignore-label=internal_addr
                - --balancing-ignore-label=oci.oraclecloud.com/fault-domain
              imagePullPolicy: "Always"
              
  2. Speichern Sie die erstellte Datei cluster-autoscaler.yaml.

Schritt 2b: Geben Sie die zu verwaltenden Knotenpools an

Geben Sie in der von Sie erstellten Datei cluster-autoscaler.yaml die Knotenpools des Clusters an, die von Kubernetes Cluster Autoscaler verwaltet werden sollen.

Sie können angeben, dass Kubernetes Cluster Autoscaler einen einzelnen oder mehrere Knotenpools verwalten soll. Es wird empfohlen, immer mindestens einen Knotenpool zu verwenden, der nicht von Kubernetes Cluster Autoscaler verwaltet wird, um kritische Cluster-Add-ons auszuführen, und sicherzustellen, dass Kubernetes Cluster Autoscaler die Knoten, auf denen er ausgeführt wird, nicht herunterskaliert. Beachten Sie, dass Sie für die manuelle Skalierung der Knotenpools verantwortlich sind, die Sie in der Konfigurationsdatei nicht angegeben haben.

Sie geben die Knotenpools an, die Kubernetes Cluster Autoscaler auf zwei Arten verwalten soll:

  • Sie können jeden zu verwaltenden Knotenpool explizit mit dem Parameter --nodes angeben, um die OCID jedes Knotenpools anzugeben.
  • Sie können angeben, dass Kubernetes Cluster Autoscaler ermitteln soll, welcher Knotenpool (oder Knotenpools) verwaltet werden soll. Verwenden Sie dazu den Parameter --node-group-auto-discovery, um die abzugleichenden Tags anzugeben. Sie können sowohl definierte Tags als auch Freiformtags angeben. Weitere Informationen zum Hinzufügen von Tags zu Knotenpools finden Sie unter Anwenden von Tags auf Knotenpools. Kubernetes Cluster Autoscaler verwaltet Knotenpools mit Tags, die den von Ihnen angegebenen Tags entsprechen. Beachten Sie, dass der Parameter node-group-auto-discovery mit Cluster Autoscaler Version 1.30.3, Version 1.31.1 und Version 1.32.0 und höher unterstützt wird.

Beachten Sie, dass Sie nicht sowohl den Parameter --nodes als auch den Parameter --node-group-auto-discovery in derselben cluster-autoscaler.yaml-Datei angeben können. Die beiden Parameter schließen sich gegenseitig aus.

So geben Sie mit dem Parameter --nodes explizit an, welche Knotenpools verwaltet werden sollen:

  1. Suchen Sie in der erstellten Datei cluster-autoscaler.yaml die folgende Vorlagenzeile:

    - --nodes=1:5:{{ node pool ocid 1 }}

    Der Parameter --nodes hat das folgende Format:

    --nodes=<min-nodes>:<max-nodes>:<nodepool-ocid>

    Hierbei gilt:

    • <min-nodes> ist die minimale Anzahl von Knoten, die im Knotenpool zulässig sind. Kubernetes Cluster Autoscaler reduziert die Anzahl der Knoten nicht unter diese Zahl.
    • <max-nodes> ist die maximale Anzahl von Knoten, die im Knotenpool zulässig sind. Kubernetes Cluster Autoscaler erhöht die Anzahl der Knoten nicht über diese Zahl. Stellen Sie sicher, dass die angegebene maximale Anzahl von Knoten die Mandantengrenzwerte für die für den Knotenpool definierte Worker-Knotenausprägung nicht überschreitet.
    • <nodepool-ocid> ist die OCID des zu verwaltenden Knotenpools.
  2. Ändern Sie den Wert des Parameters --nodes, um Folgendes anzugeben:

    • Die minimale Anzahl von Knoten, die im Knotenpool zulässig sind. Beispiel: 1.
    • Die maximale Anzahl von Knoten, die im Knotenpool zulässig sind. Beispiel: 5.
    • Die OCID des Knotenpools, der von Kubernetes Cluster Autoscaler verwaltet werden soll.

    Beispiel:

    --nodes=1:5:ocid1.nodepool.oc1.iad.aaaaaaaaaeydq...
  3. Wenn Kubernetes Cluster Autoscaler nur einen Knotenpool im Cluster verwalten soll, suchen Sie die folgende Zeile in der Datei cluster-autoscaler.yaml, und entfernen Sie sie:
    - --nodes=1:5:{{ node pool ocid 2 }}
  4. Wenn Kubernetes Cluster Autoscaler einen zweiten Knotenpool im Cluster verwalten soll, suchen Sie die folgende Zeile in der Datei cluster-autoscaler.yaml, und legen Sie entsprechende Werte für den Parameter --nodes fest:
    - --nodes=1:5:{{ node pool ocid 2 }}
  5. Wenn Kubernetes Cluster Autoscaler weitere Knotenpools verwalten soll, fügen Sie zusätzliche --nodes-Parameter in der Datei cluster-autoscaler.yaml ein, und legen Sie entsprechende Werte fest.
  6. Speichern Sie die Datei cluster-autoscaler.yaml.

So geben Sie mit dem Parameter --node-group-auto-discovery an, dass Kubernetes Cluster Autoscaler ermittelt, welche Knotenpools verwaltet werden sollen:

  1. Suchen Sie in der erstellten Datei cluster-autoscaler.yaml die folgende Vorlagenzeile:

    - --nodes=1:5:{{ node pool ocid 1 }}
  2. Löschen Sie die gesamte Zeile mit dem Parameter --nodes, und ersetzen Sie sie durch die folgende Zeile:
    - --node-group-auto-discovery=clusterId:{{ cluster ocid }},compartmentId:{{ compartment ocid }},nodepoolTags:{{ tagKey1 }}={{ tagValue1 }}&{{ tagKey2 }}={{ tagValue2 }},min:{{ min }},max:{{ max }}

    Der Parameter --node-group-auto-discovery hat das folgende Format:

    --node-group-auto-discovery=clusterId:{{<cluster-ocid>}},compartmentId:{{<compartment-ocid>}},nodepoolTags:{{<tagKey1>}}={{<tagValue1>}}&{{<tagKey2>}}={{<tagValue2>}},min:{{<min-nodes>}},max:{{<max-nodes>}}

    Hierbei gilt:

    • <cluster-ocid> ist das Cluster, in dem Kubernetes Cluster Autoscaler ausgeführt werden soll.
    • <compartment-ocid> ist die OCID des Compartments, in dem sich der Knotenpool befindet.
    • {{<tagKey1>}}={{<tagValue1>}} gibt den Namen des ersten übereinstimmenden Tags und den Wert dieses Tags an.
    • {{<tagKey2>}}={{<tagValue2>}} gibt optional den Namen eines zweiten Tags für den Abgleich und den Wert dieses Tags für den Abgleich an. Sie können beliebig viele Tags angeben (Sie sind nicht auf zwei beschränkt). Wenn Sie mehrere Tags angeben, müssen alle Tags übereinstimmen.
    • <min-nodes> ist die minimale Anzahl von Knoten, die im Knotenpool zulässig sind. Kubernetes Cluster Autoscaler reduziert die Anzahl der Knoten nicht unter diese Zahl.
    • <max-nodes> ist die maximale Anzahl von Knoten, die im Knotenpool zulässig sind. Kubernetes Cluster Autoscaler erhöht die Anzahl der Knoten nicht über diese Zahl. Stellen Sie sicher, dass die angegebene maximale Anzahl von Knoten die Mandantengrenzwerte für die für den Knotenpool definierte Worker-Knotenausprägung nicht überschreitet.
  3. Ändern Sie den Wert des Parameters --node-group-auto-discovery, um Folgendes anzugeben:

    • Das Cluster, in dem Kubernetes Cluster Autoscaler ausgeführt wird.
    • Die OCID des Compartments, in dem sich der Knotenpool befindet.
    • Mindestens ein übereinstimmender Tagname und Tagwert.
    • Die minimale Anzahl von Knoten, die im Knotenpool zulässig sind. Beispiel: 1.
    • Die maximale Anzahl von Knoten, die im Knotenpool zulässig sind. Beispiel: 5.

    Beispiel:

    --node-group-auto-discovery=clusterId:ocid1.cluster.oc1.iad.aaaaaaaa______ixq,compartmentId:ocid1.compartment.oc1..aaaaaaaa______t7a,nodepoolTags:managedby=ca,min:1,max:5
  4. Suchen Sie die folgende Zeile in der Datei cluster-autoscaler.yaml, und entfernen Sie sie:
    - --nodes=1:5:{{ node pool ocid 2 }}
  5. Wenn Kubernetes Cluster Autoscaler mehr Knotenpools, in verschiedenen Compartments oder mit unterschiedlichen Tagnamen und Tagwerten oder mit unterschiedlicher Mindest- und Höchstanzahl zulässiger Knoten verwalten soll, fügen Sie zusätzliche --node-group-auto-discovery-Parameter in die Datei cluster-autoscaler.yaml ein, und legen Sie entsprechende Werte für diese fest.

    Beispiel:

    --node-group-auto-discovery=clusterId:ocid1.cluster.oc1.iad.aaaaaaaa______ixq,compartmentId:ocid1.compartment.oc1..aaaaaaaa______t7a,nodepoolTags:managedby=ca,min:1,max:5
    --node-group-auto-discovery=clusterId:ocid1.cluster.oc1.iad.aaaaaaaa______ixq,compartmentId:ocid1.compartment.oc1..aaaaaaaa______jyv,nodepoolTags:managedby=ca,min:2,max:6
    
  6. Speichern Sie die Datei cluster-autoscaler.yaml.

Schritt 2c: Zusätzliche Konfigurationseinstellungen einschließen

  1. Fügen Sie in der erstellten Datei cluster-autoscaler.yaml Umgebungsvariablen hinzu, um anzugeben, wie Sie Kubernetes Cluster Autoscaler für den Zugriff auf OCI-Services und -Ressourcen eingerichtet haben:
    • Wenn Sie einen Instanz-Principal eingerichtet haben, damit Kubernetes Cluster Autoscaler auf OCI-Services und -Ressourcen zugreifen kann, fügen Sie nach der Zeile imagePullPolicy: "Always" am Ende der Datei Folgendes hinzu:
                env:
                - name: OKE_USE_INSTANCE_PRINCIPAL
                  value: "true"
                - name: OCI_SDK_APPEND_USER_AGENT
                  value: "oci-oke-cluster-autoscaler"

      Beispiel:

      ...
                imagePullPolicy: "Always"
                env:
                - name: OKE_USE_INSTANCE_PRINCIPAL
                  value: "true"
                - name: OCI_SDK_APPEND_USER_AGENT
                  value: "oci-oke-cluster-autoscaler"
    • Wenn Sie einen Workload-Identity Principal eingerichtet haben, damit Kubernetes Cluster Autoscaler auf OCI-Services und -Ressourcen zugreifen kann, fügen Sie nach der Zeile imagePullPolicy: "Always" am Ende der Datei Folgendes hinzu:
                env:
                - name: OKE_USE_INSTANCE_PRINCIPAL
                  value: "false"
                - name: OCI_USE_WORKLOAD_IDENTITY
                  value: "true"
                - name: OCI_RESOURCE_PRINCIPAL_VERSION
                  value: "2.2"
                - name: OCI_RESOURCE_PRINCIPAL_REGION
                  value: "<cluster-region>"
                - name: OCI_SDK_APPEND_USER_AGENT
                  value: "oci-oke-cluster-autoscaler"

      Dabei ist <cluster-region> die Region, in der sich das Cluster befindet.

      Beispiel:

      ...
                imagePullPolicy: "Always"
                env:
                - name: OKE_USE_INSTANCE_PRINCIPAL
                  value: "false"
                - name: OCI_USE_WORKLOAD_IDENTITY
                  value: "true"
                - name: OCI_RESOURCE_PRINCIPAL_VERSION
                  value: "2.2"
                - name: OCI_RESOURCE_PRINCIPAL_REGION
                  value: "us-phoenix-1"
                - name: OCI_SDK_APPEND_USER_AGENT
                  value: "oci-oke-cluster-autoscaler"
  2. Stellen Sie in der von Ihnen erstellten Datei cluster-autoscaler.yaml sicher, dass der Parameter --cloud-provider für die auf dem Cluster ausgeführte Kubernetes-Version korrekt festgelegt ist. Standardmäßig geht der Parameter davon aus, dass das Cluster die Kubernetes-Version 1.27 oder höher (oder 1.23 oder früher) ausführt und auf oci gesetzt ist. Wenn das Cluster die Kubernetes-Version 1.26, 1.25 oder 1.24 ausführt, ändern Sie den Wert des Parameters --cloud-provider in oci-oke:
    1. Suchen Sie in der Datei cluster-autoscaler.yaml die folgende Zeile:

      - --cloud-provider=oci
    2. Wenn das Cluster die Kubernetes-Version 1.26, 1.25 oder 1.24 ausführt, ändern Sie den Wert des Parameters --cloud-provider in oci-oke:
      - --cloud-provider=oci-oke
    3. Speichern Sie die Datei cluster-autoscaler.yaml.
  3. Ändern Sie in der von Ihnen erstellten Datei cluster-autoscaler.yaml den Imagepfad des Kubernetes Cluster Autoscaler-Images für den Download aus Oracle Cloud Infrastructure Registry. Images sind in mehreren Regionen verfügbar. Für eine optimale Performance wählen Sie die Region aus, die der Region am nächsten liegt, in der das Cluster bereitgestellt ist:
    1. Suchen Sie in der Datei cluster-autoscaler.yaml die folgende Vorlagenzeile:

      - image: iad.ocir.io/oracle/oci-cluster-autoscaler:{{ image tag }}
    2. Ändern Sie den Imagepfad entsprechend dem Speicherort und der Kubernetes-Version des Clusters, in dem Kubernetes Cluster Autoscaler ausgeführt werden soll:

      Bildverzeichnis Kubernetes-Version Bildpfad
      Deutschland Mitte (Frankfurt) Kubernetes 1.3 fra.ocir.io/oracle/oci-cluster-autoscaler:1.30.4-3
      Deutschland Mitte (Frankfurt) Kubernetes 1.31 fra.ocir.io/oracle/oci-cluster-autoscaler:1.31.2-1
      Deutschland Mitte (Frankfurt) Kubernetes 1.32 fra.ocir.io/oracle/oci-cluster-autoscaler:1.32.1-1
      Deutschland Mitte (Frankfurt) Kubernetes 1.33 fra.ocir.io/oracle/oci-cluster-autoscaler:1.32.1-1
      UK South (London) Kubernetes 1.3 lhr.ocir.io/oracle/oci-cluster-autoscaler:1.30.4-3
      UK South (London) Kubernetes 1.31 lhr.ocir.io/oracle/oci-cluster-autoscaler:1.31.2-1
      UK South (London) Kubernetes 1.32 lhr.ocir.io/oracle/oci-cluster-autoscaler:1.32.1-1
      UK South (London) Kubernetes 1.33 lhr.ocir.io/oracle/oci-cluster-autoscaler:1.32.1-1
      US East Kubernetes 1.3 iad.ocir.io/oracle/oci-cluster-autoscaler:1.30.4-3
      US East Kubernetes 1.31 iad.ocir.io/oracle/oci-cluster-autoscaler:1.31.2-1
      US East Kubernetes 1.32 iad.ocir.io/oracle/oci-cluster-autoscaler:1.32.1-1
      US East Kubernetes 1.33 iad.ocir.io/oracle/oci-cluster-autoscaler:1.32.1-1
      US West Kubernetes 1.3 phx.ocir.io/oracle/oci-cluster-autoscaler:1.30.4-3
      US West Kubernetes 1.31 phx.ocir.io/oracle/oci-cluster-autoscaler:1.31.2-1
      US West Kubernetes 1.32 phx.ocir.io/oracle/oci-cluster-autoscaler:1.32.1-1
      US West Kubernetes 1.33 phx.ocir.io/oracle/oci-cluster-autoscaler:1.32.1-1

      Beispiel: Wenn Sie Kubernetes Cluster Autoscaler in einem Cluster mit der Kubernetes-Version 1.32 in der Region "UK South" ausführen möchten, geben Sie das folgende Image an:

      - image: lhr.ocir.io/oracle/oci-cluster-autoscaler:1.32.1-1
      Tipp

      Wenn Sie Kubernetes Cluster Autoscaler auf einem Kubernetes-Cluster bereitstellen möchten, das sich nicht in derselben Region wie eines der Oracle-Repositorys befindet, die Cluster Autoscaler-Images enthalten, wird empfohlen, das Image wie folgt in ein Repository zu übertragen, das sich in derselben Region wie das Cluster befindet:

      i. Rufen Sie das Image mit dem Befehl docker pull aus einem Oracle-Repository ab. Siehe Images mit der Docker-CLI per Pull abrufen.

      ii. Taggen Sie das Image (mit dem Befehl docker tag), und übertragen Sie das Image dann an ein Repository in Oracle Cloud Infrastructure Registry, das sich in derselben Region wie das Cluster befindet, in dem Sie Kubernetes Cluster Autoscaler ausführen möchten (mit dem Befehl docker push). Siehe Images mit der Docker-CLI per Push übergeben.

      iii. Geben Sie den Speicherort des Images in der Datei cluster-autoscaler.yaml an.

      Hinweis

      Wenn Sie Kubernetes Cluster Autoscaler in einem Kubernetes-Cluster mit aktivierter Imageverifizierung bereitstellen möchten, können Sie nicht einfach einen Imagepfad aus einem der Oracle-Repositorys in der Datei cluster-autoscaler.yaml angeben. Führen Sie stattdessen folgende Schritte aus:

      i. Rufen Sie das Image mit dem Befehl docker pull aus einem Oracle-Repository ab. Siehe Images mit der Docker-CLI per Pull abrufen.

      ii. Taggen Sie das Image (mit dem Befehl docker tag), und übertragen Sie das Image dann an ein Repository in Oracle Cloud Infrastructure Registry, das sich in derselben Region wie das Cluster befindet, in dem Sie Kubernetes Cluster Autoscaler ausführen möchten (mit dem Befehl docker push). Siehe Images mit der Docker-CLI per Push übergeben.

      iii. Signieren Sie das Image mit einem Masterschlüssel und einer Schlüsselversion im Vault-Service, und erstellen Sie so eine Imagesignatur. Siehe Images für mehr Sicherheit signieren.

      iV. Geben Sie den Speicherort des signierten Images in der Datei cluster-autoscaler.yaml an. Referenzieren Sie das Image mit dem Imagedigest und nicht mit dem Imagetag (siehe Verwendung signierter Images aus Registry erzwingen).

    3. Speichern Sie die Datei cluster-autoscaler.yaml.
  4. Bestätigen Sie in der von Ihnen erstellten Datei cluster-autoscaler.yaml, dass die Standardwerte der Parameter für die CPU- und Speicherbegrenzung für die Anzahl der Knotenpools ausreichen, die von Kubernetes Cluster Autoscaler verwaltet werden sollen. Die Standardlimits sind relativ niedrig. Sie sollten daher die Limits erhöhen, wenn Kubernetes Cluster Autoscaler eine große Anzahl von Knotenpools verwalten soll. Beachten Sie, dass Sie dafür verantwortlich sind, die Grenzwerte auf geeignete Werte festzulegen.

    1. Suchen Sie in der Datei cluster-autoscaler.yaml die folgenden Zeilen:

                resources:
                  limits:
                    cpu: 100m
                    memory: 300Mi
    2. Legen Sie die CPU- und Arbeitsspeicherlimits auf Werte fest, die für die Anzahl der Knotenpools geeignet sind, die von Kubernetes Cluster Autoscaler verwaltet werden sollen. Beispiel:
                resources:
                  limits:
                    cpu: 200m
                    memory: 600Mi
    3. Speichern Sie die Datei cluster-autoscaler.yaml.
  5. Geben Sie in der von Ihnen erstellten Datei cluster-autoscaler.yaml weitere Parameter für Kubernetes Cluster Autoscaler an. Informationen zu den Parametern, die Sie festlegen können, finden Sie unter Unterstützte Kubernetes Cluster Autoscaler-Parameter.

  6. Speichern und schließen Sie die Datei cluster-autoscaler.yaml.

Schritt 3: Kubernetes Cluster Autoscaler im Cluster bereitstellen und erfolgreiches Deployment bestätigen

  1. Falls noch nicht geschehen, führen Sie die Schritte zum Einrichten der kubeconfig-Konfigurationsdatei des Clusters aus, und legen Sie (gegebenenfalls) die Umgebungsvariable KUBECONFIG so fest, dass sie auf die Datei verweist. Beachten Sie, dass Sie Ihre eigene kubeconfig-Datei einrichten müssen. Sie können nicht mit einer kubeconfig-Datei, die von einem anderen Benutzer eingerichtet wurde, auf ein Cluster zugreifen. Siehe Clusterzugriff einrichten.
  2. Stellen Sie Kubernetes Cluster Autoscaler im Cluster bereit, indem Sie Folgendes eingeben:
    kubectl apply -f cluster-autoscaler.yaml
  3. Zeigen Sie die Kubernetes Cluster Autoscaler-Logs an, um sicherzustellen, dass das Programm erfolgreich bereitgestellt wurde und derzeit die Workload von Knotenpools im Cluster überwacht, indem Sie Folgendes eingeben:
    kubectl -n kube-system logs -f deployment.apps/cluster-autoscaler
  4. Geben Sie an, welche der drei in der Datei cluster-autoscaler.yaml definierten Kubernetes Cluster Autoscaler-Pods aktuell Aktionen ausführen, indem Sie Folgendes eingeben:
    kubectl -n kube-system get lease
  5. Rufen Sie eine allgemeine Ansicht des Kubernetes Cluster Autoscaler-Status aus dem ConfigMap-Objekt im kube-system-Namespace ab, indem Sie Folgendes eingeben:
    kubectl -n kube-system get cm cluster-autoscaler-status -oyaml

Schritt 4: Skalierungsvorgang anzeigen

Sie können den bereitgestellten Kubernetes Cluster Autoscaler beobachten, wenn er Worker-Knoten automatisch in einem Knotenpool skaliert. Um den Skalierungsvorgang transparenter zu gestalten, können Sie die folgenden Vorschläge berücksichtigen. (Beachten Sie, dass diese nur zu Beobachtungszwecken dienen und möglicherweise im Widerspruch zu den Empfehlungen unter Empfehlungen für die Verwendung von Kubernetes Cluster Autoscaler in Produktionsumgebungen stehen):

  • Beobachten Sie ein Cluster mit einem einzelnen Knotenpool (dem Knotenpool, der von Kubernetes Cluster Autoscaler verwaltet wird).
  • Wenn das zu beobachtende Cluster mehr als einen Knotenpool aufweist, beschränken Sie die Ausführung der Pods auf Knoten in dem einzelnen Knotenpool, der von Kubernetes Cluster Autoscaler verwaltet wird. Siehe Pods zu Knoten zuweisen in der Kubernetes-Dokumentation.
  • Beginnen Sie mit einem Knoten im Knotenpool, der von Kubernetes Cluster Autoscaler verwaltet wird.
  • In der Kubernetes Cluster Autoscaler-Konfigurationsdatei geben Sie die maximale Anzahl von Knoten an, die im Knotenpool zulässig sind. Stellen Sie sicher, dass die angegebene maximale Anzahl von Knoten den Mandantengrenzwert für die für den Knotenpool definierte Worker-Knotenausprägung nicht überschreitet.

So zeigen Sie Kubernetes Cluster Autoscaler bei der automatischen Skalierung der Worker-Knoten an:

  1. Stellen Sie die aktuelle Gesamtanzahl der Worker-Knoten im Cluster fest, indem Sie Folgendes eingeben:
    kubectl get nodes
  2. Definieren Sie eine Nginx-Beispielanwendung, indem Sie in einem Texteditor eine Datei namens nginx.yaml mit dem folgenden Inhalt erstellen:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
            resources:
              requests:
                memory: "500Mi"

    Beachten Sie, dass ein Ressourcenanforderungsgrenzwert festgelegt wurde.

  3. Stellen Sie die Beispielanwendung bereit, indem Sie Folgendes eingeben:
    kubectl create -f nginx.yaml
  4. Erhöhen Sie die Anzahl der Pods im Deployment auf 100 (von 2), indem Sie Folgendes eingeben:
    kubectl scale deployment nginx-deployment --replicas=100

    Kubernetes Cluster Autoscaler fügt dem Knotenpool jetzt Worker-Knoten hinzu, um die erhöhten Workload-Anforderungen zu erfüllen.

  5. Beobachten Sie den Status des Deployments, indem Sie Folgendes eingeben:
    kubectl get deployment nginx-deployment --watch
  6. Nach ein paar Minuten können Sie die erhöhte Gesamtanzahl der Worker-Knoten im Cluster anzeigen, indem Sie Folgendes eingeben:
    kubectl get nodes

    Hinweis: Die Anzahl der angezeigten Worker-Knoten hängt von der Worker-Knotenausprägung und von der maximalen Anzahl der Knoten ab, die in der Kubernetes Cluster Autoscaler-Konfigurationsdatei angegeben ist.

Schritt 5: Bereinigung durchführen

  1. Löschen Sie die Nginx-Beispielanwendung, indem Sie Folgendes eingeben:
    kubectl delete deployment nginx-deployment
  2. Nach zehn Minuten können Sie prüfen, ob die Worker-Knoten auf die ursprüngliche Anzahl reduziert wurden, indem Sie Folgendes eingeben:
    kubectl get nodes

Hinweis: Nachdem Sie die Nginx-Beispielanwendung gelöscht und gewartet haben, werden möglicherweise weniger Worker-Knoten angezeigt, wobei die Anzahl immer noch über der ursprünglichen Anzahl liegt. Dies liegt wahrscheinlich daran, dass die Ausführung der kube-system-Pods auf diesen Knoten geplant war. Kube-system-Pods können verhindern, dass Kubernetes Cluster Autoscaler Knoten entfernt, weil der Parameter skip-nodes-with-system-pods des Autoscalers standardmäßig auf true gesetzt ist.