Cluster aktualisieren

Nachdem Sie einen Cluster mit bmctl erstellt haben, können Sie einige Aspekte der Clusterkonfiguration ändern. Führen Sie dazu die folgenden Aktionen aus:

  1. Ändern Sie die Werte bestimmter Felder in der Konfigurationsdatei des Clusters, die sich standardmäßig hier befindet: bmctl-workspace/CLUSTER-NAME/CLUSTER-NAME.yaml.

  2. Aktualisieren Sie den Cluster mit dem Befehl bmctl update.

Auf diese Weise können Sie beispielsweise Knoten in einem Cluster hinzufügen oder entfernen oder Knoten in einem Cluster ersetzen. In diesem Dokument wird beschrieben, wie Sie diese und andere Aktualisierungen für einen Cluster ausführen.

Beachten Sie jedoch, dass viele Aspekte Ihrer Clusterkonfiguration unveränderlich sind und nach dem Erstellen des Clusters nicht mehr aktualisiert werden können. Eine umfassende Liste änderbarer und unveränderlicher Felder finden Sie in der Referenz zu Feldern für die Clusterkonfiguration. Der Feldverweis ist eine sortierbare Tabelle. Klicken Sie auf die Spaltenüberschriften, um die Sortierreihenfolge zu ändern. Klicken Sie auf einen Feldnamen, um die zugehörige Beschreibung aufzurufen.

Knoten in einem Cluster hinzufügen oder entfernen

Ein Knotenpool ist eine Gruppe von Knoten innerhalb eines Clusters, die dieselbe Konfiguration haben. Beachten Sie, dass ein Knoten immer zu einem Knotenpool gehört. Um einem Cluster einen neuen Knoten hinzuzufügen, müssen Sie ihn einem bestimmten Knotenpool hinzufügen. Das Entfernen eines Knotens aus einem Knotenpool entspricht dem Entfernen des Knotens aus dem Cluster.

In GKE on Bare Metal gibt es drei Arten von Knotenpools: Steuerungsebene, Load-Balancer und Worker-Knotenpools.

Sie können einen Knoten in einen Knotenpool einfügen oder daraus entfernen, indem Sie die IP-Adresse des Knotens in einem bestimmten Abschnitt der Clusterkonfigurationsdatei hinzufügen oder entfernen. Die folgende Liste zeigt, welcher Abschnitt für einen bestimmten Knotenpool bearbeitet werden muss:

  • Worker-Knotenpool: Fügen Sie die IP-Adresse des Knotens im Abschnitt spec.nodes der Spezifikation NodePool hinzu oder entfernen Sie sie.
  • Knotenpool für Steuerungsebene: Fügen Sie der Spezifikation Cluster im Abschnitt spec.controlPlane.nodePoolSpec.nodes die IP-Adresse des Knotens hinzu oder entfernen Sie sie.
  • Load-Balancer-Knotenpool: Fügen Sie die IP-Adresse des Knotens im Abschnitt spec.loadBalancer.nodePoolSpec.nodes der Spezifikation Cluster hinzu oder entfernen Sie sie.

Beispiel: So entfernen Sie einen Worker-Knoten

Hier ist ein Beispiel für eine Clusterkonfigurationsdatei, die die Spezifikationen von zwei Worker-Knoten zeigt:

---
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
  name: nodepool1
  namespace: cluster-cluster1
spec:
  clusterName: cluster1
  nodes:
  - address: 172.18.0.5
  - address: 172.18.0.6

So entfernen Sie einen Knoten:

  1. (Optional) Wenn auf dem zu entfernenden Knoten kritische Pods ausgeführt werden, setzen Sie den Knoten zuerst in den Wartungsmodus.

    Sie können den Knotenausgleich für Worker-Knoten überwachen. Dazu rufen Sie die Felder status.nodesDrained und status.nodesDraining der Ressource NodePool auf.

  2. Löschen Sie in der Clusterkonfigurationsdatei den IP-Adresseintrag für den Knoten.

  3. Aktualisieren Sie den Cluster:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=ADMIN_KUBECONFIG
    

    Ersetzen Sie Folgendes:

    • CLUSTER_NAME: der Name des Clusters, den Sie aktualisieren möchten.
    • ADMIN_KUBECONFIG: Pfad zur kubeconfig-Datei des Administratorclusters.

    Nachdem der Befehl bmctl update erfolgreich ausgeführt wurde, dauert es einige Zeit, bis die Jobs machine-preflight und machine-init abgeschlossen sind. Sie können den Status der Knoten und ihrer jeweiligen Knotenpools anzeigen, indem Sie die im Abschnitt Updates überprüfen dieses Dokuments beschriebenen Befehle ausführen.

Entfernung eines Knotens erzwingen

Wenn der bmctl update-Befehl einen Knoten nicht entfernen kann, müssen Sie möglicherweise das Entfernen aus dem Cluster erzwingen. Weitere Informationen finden Sie unter Entfernen fehlerhafter Knoten erzwingen.

Knoten der Steuerungsebene mit Hochverfügbarkeit ersetzen

Sie können Knoten der Steuerungsebene mit Hochverfügbarkeit in Administrator-, Nutzer-, eigenständigen und Hybrid-Clustern ersetzen.

So ersetzen Sie einen Knoten in einem Cluster:

  1. Entfernen Sie die IP-Adresse des Knotens aus der Clusterkonfigurationsdatei.
  2. Aktualisieren Sie den Cluster.
  3. Prüfen Sie den Status der Knoten im Cluster.
  4. Fügen Sie die IP-Adresse eines neuen Knotens derselben Clusterkonfigurationsdatei hinzu.
  5. Aktualisieren Sie den Cluster.

Der Rest dieses Abschnitts enthält ein Beispiel.

Hier ist ein Beispiel für eine Clusterkonfigurationsdatei mit drei Knoten der Steuerungsebene in einem Nutzercluster:

---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
 name: user-cluster
 namespace: cluster-user-cluster
spec:
  controlPlane:
   nodePoolSpec:
     nodes:
     - address: 10.200.0.11
     - address: 10.200.0.12
     - address: 10.200.0.13

Führen Sie die folgenden Schritte aus, um den letzten im Abschnitt spec.controlPlane.nodePoolSpec.nodes aufgeführten Knoten zu ersetzen:

  1. Entfernen Sie den Knoten, indem Sie den zugehörigen IP-Adresseintrag in der Clusterkonfigurationsdatei löschen. Nach dieser Änderung sollte die Clusterkonfigurationsdatei in etwa so aussehen:

    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
     name: user-cluster
     namespace: cluster-user-cluster
    spec:
      controlPlane:
       nodePoolSpec:
         nodes:
         - address: 10.200.0.11
         - address: 10.200.0.12
    
  2. Aktualisieren Sie den Cluster mit dem folgenden Befehl:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=KUBECONFIG
    

    Nehmen Sie die folgenden Änderungen vor:

    • Ersetzen Sie CLUSTER_NAME durch den Namen des Clusters, den Sie aktualisieren möchten.
    • Wenn der Cluster ein selbst verwaltender Cluster ist (z. B. Administrator- oder eigenständiger Cluster), ersetzen Sie KUBECONFIG durch den Pfad zur kubeconfig-Datei des Clusters. Wenn der Cluster ein Nutzercluster ist, wie in diesem Beispiel, ersetzen Sie KUBECONFIG durch den Pfad zur kubeconfig-Datei des admin-Clusters.
  3. Nachdem der Befehl bmctl update erfolgreich ausgeführt wurde, dauert es einige Zeit, bis die Jobs machine-preflight und machine-init abgeschlossen sind. Sie können den Status der Knoten und ihrer jeweiligen Knotenpools anzeigen, indem Sie die im Abschnitt Updates überprüfen dieses Dokuments beschriebenen Befehle ausführen. Sobald der Knotenpool und die Knoten bereit sind, können Sie mit dem nächsten Schritt fortfahren.

  4. Fügen Sie dem Knotenpool einen neuen Knoten der Steuerungsebene hinzu. Fügen Sie dazu die IP-Adresse des neuen Knotens der Steuerungsebene in den Abschnitt spec.controlPlane.nodePoolSpec.nodes der Clusterkonfigurationsdatei ein. Nach dieser Änderung sollte die Clusterkonfigurationsdatei in etwa so aussehen:

    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
     name: user-cluster
     namespace: cluster-user-cluster
    spec:
      controlPlane:
       nodePoolSpec:
         nodes:
         - address: 10.200.0.11
         - address: 10.200.0.12
         - address: 10.200.0.14
    
  5. Aktualisieren Sie den Cluster mit dem folgenden Befehl:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=KUBECONFIG
    

    Nehmen Sie die folgenden Änderungen vor:

    • Ersetzen Sie CLUSTER_NAME durch den Namen des Clusters, den Sie aktualisieren möchten.
    • Wenn der Cluster ein selbst verwaltender Cluster ist (z. B. Administrator- oder eigenständiger Cluster), ersetzen Sie KUBECONFIG durch den Pfad zur kubeconfig-Datei des Clusters. Wenn der Cluster ein Nutzercluster ist, wie in diesem Beispiel, ersetzen Sie KUBECONFIG durch den Pfad zur kubeconfig-Datei des admin-Clusters.

Aktualisierungen überprüfen

Mit dem Befehl kubectl get können Sie den Status von Knoten und den zugehörigen Knotenpools anzeigen lassen.

Der folgende Befehl zeigt beispielsweise den Status der Knotenpools im Cluster-Namespace cluster-my-cluster an:

kubectl -n cluster-my-cluster get nodepools.baremetal.cluster.gke.io

Das System gibt Ergebnisse ähnlich der folgenden:

NAME                    READY   RECONCILING   STALLED   UNDERMAINTENANCE   UNKNOWN
cluster-my-cluster      3       0             0         0                  0
cluster-my-cluster-lb   2       0             0         0                  0
np1                     3       0             0         0                  0

Reconciling=1 bedeutet, dass der Abgleichsschritt noch läuft. Sie sollten warten, bis sich der Status in Reconciling=0 ändert.

Sie können den Status der Knoten in einem Cluster auch mit dem folgenden Befehl prüfen:

kubectl get nodes --kubeconfig=KUBECONFIG

Weitere Informationen zum Diagnostizieren von Clustern finden Sie unter Snapshots zum Diagnostizieren von Clustern erstellen.

Funktionen, die sich mit einem Update ändern können

Mit dem Befehl bmctl update können Sie nicht nur Knoten hinzufügen, entfernen oder ersetzen, sondern auch bestimmte änderbare Feldwerte, benutzerdefinierte Ressourcen (CRs) und Annotationen in der Clusterkonfigurationsdatei ändern.

Zum Aktualisieren einer Clusterressource bearbeiten Sie die Clusterkonfigurationsdatei und wenden Ihre Änderungen mit bmctl update an.

In den folgenden Abschnitten finden Sie einige allgemeine Beispiele für das Aktualisieren eines vorhandenen Clusters durch Ändern eines Feldwerts, einer Antwortvorlage oder einer Annotation.

loadBalancer.addressPools

Der Abschnitt addressPools enthält Felder zum Angeben von Load-Balancing-Pools für gebündelte Load-Balancer. Sie können jederzeit weitere Load-Balancing-Adresspools hinzufügen, aber keine vorhandenen Adresspools entfernen oder ändern.

addressPools:
- name: pool1
  addresses:
  - 192.168.1.0-192.168.1.4
  - 192.168.1.240/28
- name: pool2
  addresses:
  - 192.168.1.224/28

Versehentliches Löschen von Clustern verhindern

Wenn Sie der Clusterkonfigurationsdatei die Annotation baremetal.cluster.gke.io/prevent-deletion: "true" hinzufügen, können Sie den Cluster nicht löschen. Das Ausführen von kubectl delete cluster oder bmctl reset cluster führt beispielsweise zu einem Fehler.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: ci-10c3c6f4d9c698e
  namespace: cluster-ci-10c3c6f4d9c698e
  annotations:
    baremetal.cluster.gke.io/prevent-deletion: "true"
spec:
  clusterNetwork:

bypassPreflightCheck

Der Standardwert des Felds bypassPreflightCheck ist false. Wenn Sie dieses Feld in der Clusterkonfigurationsdatei auf true setzen, werden die internen Preflight-Prüfungen ignoriert, wenn Sie Ressourcen auf vorhandene Cluster anwenden.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
  annotations:
    baremetal.cluster.gke.io/private-mode: "true"
spec:
  bypassPreflightCheck: true

loginUser

Sie können das Feld loginUser unter der Konfiguration des Knotenzugriffs festlegen. Dieses Feld unterstützt die sudo-Funktion ohne Passwort für die Maschinenanmeldung.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
  annotations:
    baremetal.cluster.gke.io/private-mode: "true"
spec:
  nodeAccess:
    loginUser: abm

NetworkGatewayGroup

Die benutzerdefinierte NetworkGatewayGroup-Ressource wird verwendet, um Floating-IP-Adressen für erweiterte Netzwerkfeatures bereitzustellen, z. B. das NAT-Gateway für ausgehenden Traffic oder das gebündelte Load-Balancing Feature mit BGP. Wenn Sie die benutzerdefinierte NetworkGatewayGroup-Ressource und zugehörige Netzwerkfeatures verwenden möchten, müssen Sie beim Erstellen der Cluster clusterNetwork.advancedNetworking auf true festlegen.

apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
  name: default
  namespace: cluster-bm
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.2.100

BGPLoadBalancer

Wenn Sie gebündelte Load-Balancer mit BGP konfigurieren, verwendet das Load-Balancing der Datenebene standardmäßig dieselben externen Peers, die für das Peering der Steuerungsebene angegeben wurden. Alternativ können Sie das Load-Balancing der Datenebene separat mit der benutzerdefinierten Ressource BGPLoadBalancer und der benutzerdefinierten Ressource BGPPeer konfigurieren. Weitere Informationen finden Sie unter Gebündelte Load-Balancer mit BGP konfigurieren.

apiVersion: networking.gke.io/v1
kind: BGPLoadBalancer
metadata:
  name: default
  namespace: cluster-bm
spec:
  peerSelector:
    cluster.baremetal.gke.io/default-peer: "true"

BGPPeer

Wenn Sie gebündelte Load-Balancer mit BGP konfigurieren, verwendet das Load-Balancing der Datenebene standardmäßig dieselben externen Peers, die für das Peering der Steuerungsebene angegeben wurden. Alternativ können Sie das Load-Balancing der Datenebene separat mit der benutzerdefinierten Ressource BGPPeer und der benutzerdefinierten Ressource BGPLoadBalancer konfigurieren. Weitere Informationen finden Sie unter Gebündelte Load-Balancer mit BGP konfigurieren.

apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm
  labels:
    cluster.baremetal.gke.io/default-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

NetworkAttachmentDefinition

Mit dem Befehl bmctl update können Sie benutzerdefinierte NetworkAttachmentDefinition-Ressourcen ändern, die dem Netzwerk entsprechen.

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: gke-network-1
  namespace: cluster-my-cluster
spec:
  config: '{
  "type": "ipvlan",
  "master": "enp2342",
  "mode": "l2",
  "ipam": {
    "type": "whereabouts",
    "range": "172.120.0.0/24"

Nachdem Sie die Konfigurationsdatei geändert haben, aktualisieren Sie den Cluster mit dem folgenden bmctl update-Befehl:

bmctl update cluster -c CLUSTER_NAME --kubeconfig=KUBECONFIG

Nehmen Sie die folgenden Änderungen vor:

  • Ersetzen Sie CLUSTER_NAME durch den Namen des Clusters, den Sie aktualisieren möchten.
  • Wenn der Cluster ein selbst verwaltender Cluster ist (z. B. Administrator- oder eigenständiger Cluster), ersetzen Sie KUBECONFIG durch den Pfad zur kubeconfig-Datei des Clusters. Wenn der Cluster ein Nutzercluster ist, ersetzen Sie KUBECONFIG durch den Pfad zur kubeconfig-Datei des admin-Clusters.

Schreibgeschützten Kubelet-Port deaktivieren

Ab Version 1.15.0 deaktiviert GKE on Bare Metal standardmäßig den schreibgeschützten Kubelet-Port 10255. Alle Kundenarbeitslasten, die für das Lesen von Daten aus diesem unsicheren Kubelet-Port 10255 konfiguriert sind, sollten zum sicheren Kubelet-Port 10250 migriert werden.

Nur bei Clustern, die mit Version 1.15.0 oder höher erstellt wurden, ist dieser Port standardmäßig deaktiviert. Der schreibgeschützte Kubelet-Port 10255 bleibt für Cluster zugänglich, die mit einer niedrigeren Version als 1.15.0 erstellt wurden, auch nach einem Clusterupgrade auf Version 1.15.0 oder höher.

Diese Änderung wurde vorgenommen, weil das Kubelet Informationen mit geringer Vertraulichkeit über den nicht authentifizierten Port 10255 preisgibt. Die Informationen umfassen die vollständigen Konfigurationsinformationen für alle auf einem Knoten ausgeführten Pods, die für einen Angreifer wertvoll sein können. Außerdem werden Messwerte und Statusinformationen offengelegt, die für Ihr Unternehmen sensible Informationen liefern.

Das Deaktivieren des schreibgeschützten Kubelet-Ports wird in der CIS-Kubernetes-Benchmark empfohlen. Führen Sie die folgenden Schritte aus, um den Port in Version 1.14 manuell zu deaktivieren:

  1. Bearbeiten Sie die Clusterkonfigurationsdatei und fügen Sie die folgende Annotation hinzu:

    baremetal.cluster.gke.io/enable-kubelet-read-only-port: "false"
    

    Das folgende Beispiel einer Clusterkonfigurationsdatei zeigt, dass diese Annotation hinzugefügt wurde:

    [...]
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-my-cluster
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      annotations:
        baremetal.cluster.gke.io/enable-kubelet-read-only-port: "false"
      name: my-cluster
      namespace: cluster-my-cluster
    [...]
    
  2. Bearbeiten Sie die Clusterressource für die Cluster-Webhook-Validierung:

    kubectl edit validatingwebhookconfigurations lcm-validating-webhook-configuration
    
  3. Deaktivieren Sie vorübergehend die Webhook-Validierung. Löschen Sie dazu die Zeile mit dem Verb UPDATE:

    - admissionReviewVersions:
    - v1
    clientConfig:
      caBundle: 
      service:
        name: lcm-webhook-service
        namespace: kube-system
        path: /validate-baremetal-cluster-gke-io-v1-cluster
        port: 443
    failurePolicy: Fail
    matchPolicy: Equivalent
    name: vcluster.kb.io
    namespaceSelector: {}
    objectSelector: {}
    rules:
    - apiGroups:
      - baremetal.cluster.gke.io
      apiVersions:
      - v1
      operations:
      - CREATE
      - UPDATE # <- DELETE THIS LINE
      - DELETE
      resources:
      - clusters
      scope: '*'
    sideEffects: None
    timeoutSeconds: 10
    
  4. Fügen Sie der benutzerdefinierten Clusterressource die Annotation hinzu:

    kubectl edit clusters CLUSTER_NAME --kubeconfig KUBECONFIG_PATH
    

    Nehmen Sie die folgenden Änderungen vor:

    • Ersetzen Sie CLUSTER_NAME durch den Namen des Clusters, den Sie aktualisieren möchten.
    • Ersetzen Sie KUBECONFIG_PATH durch den Pfad zur kubeconfig-Datei des Clusters.
  5. Fügen Sie die Annotation hinzu, wie im folgenden Beispiel einer aktualisierten benutzerdefinierten Clusterressource gezeigt:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      annotations:
        baremetal.cluster.gke.io/enable-kubelet-read-only-port: "false"
    [...]
    
  6. Speichern und schließen Sie die benutzerdefinierte Clusterressource.

  7. Aktivieren Sie die Webhook-Validierung wieder, indem Sie das Verb UPDATE wieder der Clusterressource für die Cluster-Webhook-Validierung hinzufügen:

    kubectl edit validatingwebhookconfigurations lcm-validating-webhook-configuration
    

    Fügen Sie in der benutzerdefinierten Ressource das Verb UPDATE im Abschnitt operations wieder hinzu:

    - admissionReviewVersions:
    - v1
    clientConfig:
      caBundle: 
      service:
        name: lcm-webhook-service
        namespace: kube-system
        path: /validate-baremetal-cluster-gke-io-v1-cluster
        port: 443
    failurePolicy: Fail
    matchPolicy: Equivalent
    name: vcluster.kb.io
    namespaceSelector: {}
    objectSelector: {}
    rules:
    - apiGroups:
      - baremetal.cluster.gke.io
      apiVersions:
      - v1
      operations:
      - CREATE
      - UPDATE # <- ADD THIS LINE BACK
      - DELETE
      resources:
      - clusters
      scope: '*'
    sideEffects: None
    timeoutSeconds: 10
    

    Speichern und schließen Sie die benutzerdefinierte Clusterressource.

Diese Änderungen werden beibehalten, wenn Sie ein Upgrade auf Version 1.15.0 oder höher ausführen.