Der Hierarchy Controller sorgt für eine bessere Beobachtbarkeit Ihrer Arbeitslasten. Dafür werden die Namespaces hierarchisch und abstrakt in Ihrem Cluster verwendet. Dies erreichen Sie, indem Sie die Strukturlabels des Clusters an Ihre Pods verteilen und für jedes System verfügbar machen, das Kubernetes-Labels aufnehmen kann. Dazu gehören:
- Native Kubernetes-Abfragen für Pods
- Cloud Logging
- GKE-Nutzungsmessung
Beispiel: Eine Arbeitslast wird in einem Namespace aus dem Beispiel-Repository für die Namespace-Übernahme ausgeführt. Das Beispiel-Repository für die Namespace-Übernahme hat die folgende Architektur:
├── namespaces # Namespace directory
│ ├── eng # Namespace directory
│ │ ├── analytics # Abstract namespace directory
│ │ └── gamestore # Abstract namespace directory
│ ├── rnd # Namespace directory
│ │ ├── incubator-1 # Abstract namespace directory
│ │ └── incubator-2 # Abstract namespace directory
| |── network-policy-default-deny-all.yaml
| |── viewers-rolebinding.yaml
Mit dem Hierarchie-Controller können Sie Pods, Logs oder die Nutzungsmessung auswählen, die von jeder Arbeitslast generiert werden, die ein untergeordnetes Element von eng
, rnd
oder einem anderen abstrakten Namespace ist. Dies umfasst nicht nur die Arbeitslasten in Namespaces im Git-Repository, z. B. gamestore
, sondern auch einen beliebigen untergeordneten Namespace des Hierarchy Controllers, den Sie möglicherweise als untergeordnetes Element dieser Namespaces erstellen.
Hierarchische Beobachtbarkeit aktivieren
Die hierarchische Beobachtbarkeit wird vom Hierarchy Controller bereitgestellt. So aktivieren Sie die hierarchische Beobachtbarkeit:
Legen Sie in der Konfigurationsdatei für den Config Management Operator im Objekt
spec.hierarchyController
den WertenablePodTreeLabels
auftrue
fest:# config-management.yaml apiVersion: configmanagement.gke.io/v1 kind: ConfigManagement metadata: name: config-management spec: hierarchyController: enabled: true # Set to true to enable hierarchical observability: enablePodTreeLabels: true # ...other fields...
Wenden Sie die Konfiguration an:
kubectl apply -f config-management.yaml
Nach etwa einer Minute können Sie den Hierarchy Controller und die hierarchische Beobachtbarkeit in Ihrem Cluster verwenden.
Wenn die hierarchische Beobachtbarkeit aktiviert ist, installiert der Hierarchy Controller einen mutierenden Zulassungs-Webhook, um den Pods die Strukturlabels hinzuzufügen. So können Sie prüfen, ob dieser Webhook ordnungsgemäß funktioniert:
Starten Sie eine Arbeitslast in einem beliebigen Namespace. Beispiel:
kubectl run websvr --image=nginx --namespace default --generator=run-pod/v1
Prüfen Sie den Pod und vergewissern Sie sich, dass er das Label
default.tree.hnc.x-k8s.io/depth
enthält:kubectl describe pod --namespace default websvr
Ausgabe:
Name: websvr Namespace: default # ...other fields... Labels: default.tree.hnc.x-k8s.io/depth=0 # This is the Pod tree label # ...other labels... # ...other fields...
Bereinigen Sie die Arbeitslast:
kubectl delete pod --namespace default websvr
Vorhandene Pods erhalten die Pod-Strukturlabels nicht. Diese Labels werden nur neuen Pods hinzugefügt. Weitere Informationen finden Sie weiter unten in diesem Dokument unter Einschränkungen.
Hierarchische Beobachtbarkeit der Arbeitslast verwenden
Wenn Pod-Baumlabels aktiviert sind, können diese verwendet werden, um die hierarchische Beobachtbarkeit von Arbeitslasten sowohl in Clustern als auch in anderen Google Cloud-Produkten zu verbessern.
Pods nach Hierarchie abfragen
Jeder Kubernetes-Vorgang, der eine Labelauswahl enthält, kann zum Abfragen von Pod-Strukturlabels verwendet werden. Wenn Sie beispielsweise alle Pods in allen Namespaces anzeigen möchten, die in einem untergeordneten Namespace des Typs default
ausgeführt werden, verwenden Sie die folgende Abfrage:
kubectl get pods --all-namespaces -l default.tree.hnc.x-k8s.io/depth
Ausgabe basierend auf der Beispielarbeitslast, die wir erstellt haben, um die Installation zu prüfen:
NAMESPACE NAME READY STATUS RESTARTS AGE
default websvr 1/1 Running 0 70s
Cloud Logging nach Hierarchie abfragen
Cloud Logging unterstützt ein etwas anderes Format für Labels als Kubernetes. Wenn Sie beispielsweise nach einer Arbeitslast suchen möchten, die in einem untergeordneten Element des Namespace default
ausgeführt wird, erwartet Cloud Logging anstelle des Kubernetes-Labels default.tree.hnc.x-k8s.io/depth
eine Abfrage ähnlich der folgenden in der Google Cloud Console:
resource.type="k8s_container" labels.k8s-pod/default_tree_hnc_x-k8s_io/depth!=""
Alternativ können Sie einen ähnlichen Filter im Google Cloud CLI verwenden:
gcloud logging read "resource.type=k8s_container AND labels.k8s-pod/default_tree_hnc_x-k8s_io/depth!=''"
GKE-Nutzungsmessung nach Hierarchie abfragen
Mithilfe von Pod-Strukturlabels können Sie Anfragen und Nutzungen von GKE-Nutzungsmessungen zu Namespace-Strukturen zuordnen. So aktivieren Sie die hierarchische Nutzungsmessung:
Aktivieren Sie die reguläre GKE-Nutzungsmessung für Ihren Cluster.
Prüfen Sie, ob die Daten in BigQuery aufgenommen werden. Wechseln Sie in der Google Cloud Console zu BigQuery.
Achten Sie auf
gke_cluster_resource_consumption
.Folgen Sie den Voraussetzungen zum Aktivieren der GKE-Clusternutzungsmessung, um die Visualisierung für die GKE-Nutzungsmessung zu aktivieren.
Öffnen Sie Looker Studio, klicken Sie auf Leerer Bericht und wählen Sie BigQuery als Datenquelle aus.
Wählen Sie Benutzerdefinierte Abfrage aus und suchen Sie nach Ihrer Projekt-ID. Geben Sie in das Textfeld rechts Ihre benutzerdefinierte Abfrage ein. Beispiele für benutzerdefinierte Abfragen finden Sie in den folgenden Abschnitten.
Beispiel: Gesamtnutzung aller Unterstrukturen
Diese Abfrage gibt die Verwendung für jeden regulären, abstrakten und hierarchischen Namespace im Cluster zurück, einschließlich aller Nachfolgerelemente:
SELECT
REGEXP_EXTRACT(label.key, r"^[a-zA-Z0-9\-]+") as subtree,
resource_name,
usage.unit,
SUM(usage.amount) AS usage_amount
FROM
`PROJECT_NAME.DATASET_NAME.TABLE_NAME`,
UNNEST(labels) AS label
WHERE
regexp_contains(label.key, "tree.hnc.x-k8s.io/depth")
GROUP BY
subtree,
resource_name,
usage.unit
ORDER BY
resource_name ASC,
subtree ASC
Teilbeispielausgabe:
subtree | resource_name | Einheit | usage_amount |
---|---|---|---|
a | CPU | Sekunden | 0,09 |
a1 | CPU | Sekunden | 0,09 |
a2 | CPU | Sekunden | 0 |
a | Arbeitsspeicher | byte-seconds | 6.315.303.690.240 |
a1 | Arbeitsspeicher | byte-seconds | 1.355.268.587.520 |
a2 | Arbeitsspeicher | byte-seconds | 4.960.035.102.720 |
In diesem Beispiel beinhaltet die Nutzung des Namespace a
die Verwendung der untergeordneten Namespaces a1
und a2
, die ebenfalls zu sehen sind.
Beispiel: Verwendung einer einzelnen Unterstruktur
Diese Abfrage zeigt die Gesamtnutzung unter dem Namespace a
und allen untergeordneten Namespaces an:
SELECT
resource_name,
usage.unit,
SUM(usage.amount) AS usage_amount
FROM
`PROJECT_NAME.DATASET_NAME.TABLE_NAME`,
UNNEST(labels) AS label
WHERE
label.key="SUBTREE_NAME.tree.hnc.x-k8s.io/depth"
GROUP BY
resource_name,
usage.unit
Beispielausgabe für Namespace a
:
resource_name | Einheit | usage_amount |
---|---|---|
CPU | Sekunden | 0,09 |
Arbeitsspeicher | byte-seconds | 6.315.303.690.240 |
Beispiel: Verwendung aller Namespaces in einer Unterstruktur
Diese Abfrage zeigt die Einzelnutzung jedes Namespace in einer bestimmten Unterstruktur an:
SELECT
namespace,
resource_name,
SUM(usage.amount) AS usage_amount
FROM
`PROJECT_NAME.DATASET_NAME.TABLE_NAME`,
UNNEST(labels) AS label
WHERE
label.key="SUBTREE_NAME.tree.hnc.x-k8s.io/depth"
GROUP BY
namespace,
resource_name
Beispielausgabe für Namespace a
:
Namespace | resource_name | usage_amount |
---|---|---|
a2 | Arbeitsspeicher | 4.960.035.102.720 |
a1 | Arbeitsspeicher | 1.355.268.587.520 |
a2 | CPU | 0 |
a1 | CPU | 0,09 |
Der Namespace a
selbst enthält keine Nutzung, daher wird er nicht in den Ergebnissen dieser Abfrage aufgeführt.
Einschränkungen des hierarchischen Monitorings
Im Folgenden sind die Einschränkungen für das hierarchische Monitoring beschrieben.
Änderungen an der Hierarchie werden ignoriert
Pod-Strukturlabels werden Pods bei ihrer Erstellung hinzugefügt und nicht geändert, nachdem der Pod gestartet wurde. Das bedeutet, dass Pods, die vor der Aktivierung des hierarchischen Monitorings gestartet wurden, keine Pod-Strukturlabels erhalten.
Darüber hinaus werden Pods, deren Hierarchie nach dem Start des Pods geändert wird, z. B. mithilfe des Hierarchiecontrollers, nicht geändert, um das übergeordnete Element eines Namespace zu ändern. Hierarchieänderungen sind in der Regel recht selten. Wenn dies aber der Fall ist und dadurch ein Problem verursacht wird, müssen Sie alle betroffenen Pods neu starten, nachdem Sie die Hierarchie geändert haben.
Pods werden auch dann erstellt, wenn Labels nicht angewendet werden können
Das hierarchische Monitoring gilt nicht für Pods, die in wichtigen System-Namespaces wie kube-system
oder hnc-system
ausgeführt werden. In der Webhook-Konfiguration selbst können diese Namespaces jedoch nicht ausgeschlossen werden. Wenn der Hierarchy Controller ein Problem ermittelt, könnte sich dies auf die Erstellung von Pods in allen Namespaces auswirken.
Statt einen clusterweiten Ausfall zu riskieren, schlägt der Webhook dann fehl und ermöglicht die Erstellung des Pods ohne Label, wenn der Hierarchy Controller einen Pod nicht innerhalb von zwei Sekunden verarbeiten kann. Solche Webhook-Fehler können über den Kubernetes API-Server überwacht werden. Dazu müssen Sie nach Fehlern des mutierenden Zulassungs-Webhooks podlabel.hierarchycontroller.configmanagement.gke.io
suchen.
Nächste Schritte
Weitere Informationen zu gängigen Aufgaben, für deren Durchführung Sie HNC verwenden können, finden Sie im HNC-Nutzerhandbuch: Anleitungen.