Einschränkungsvorlagenbibliothek verwenden

Auf dieser Seite erfahren Sie, wie Sie Policy Controller-Einschränkungen mithilfe der bereits von Google bereitgestellten Einschränkungsvorlagen definieren.

Mit Policy Controller können Sie durch Definieren eines oder mehrerer Einschränkungsobjekte Richtlinien für einen Kubernetes-Cluster erzwingen. Nach der Installation einer Einschränkung werden Anfragen an den API-Server auf diese Einschränkung hin geprüft und abgelehnt, wenn sie ihr nicht entsprechen. Bereits vorhandene nicht konforme Ressourcen werden zum Prüfzeitpunkt gemeldet.

Jede Einschränkung wird durch eine Einschränkungsvorlage unterstützt, die das Schema und die Logik der Einschränkung definiert. Sie können Einschränkungsvorlagen von Google und Drittanbietern beziehen oder eigene erstellen. Weitere Informationen zum Erstellen neuer Vorlagen finden Sie unter Einschränkungsvorlage schreiben.

Hinweis

Einschränkungsvorlagenbibliothek untersuchen

Wenn Sie eine Einschränkung definieren, geben Sie die Einschränkungsvorlage an, die erweitert wird. Eine von Google entwickelte Bibliothek mit allgemeinen Einschränkungsvorlagen ist standardmäßig installiert und viele Organisationen müssen keine benutzerdefinierten Einschränkungsvorlagen direkt in Rego erstellen. Von Google bereitgestellte Einschränkungsvorlagen tragen das Label configmanagement.gke.io/configmanagement.

Verwenden Sie den folgenden Befehl, um Einschränkungen aufzulisten:

kubectl get constrainttemplates \
    -l="configmanagement.gke.io/configmanagement=config-management"

Verwenden Sie den folgenden Befehl, um eine Einschränkungsvorlage zu beschreiben und die erforderlichen Parameter zu prüfen:

kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME

Sie können auch alle Einschränkungsvorlagen in der Bibliothek ansehen.

Einschränkung definieren

Sie definieren eine Einschränkung mithilfe von YAML und müssen Rego weder verstehen noch in ihr schreiben. Stattdessen ruft eine Einschränkung eine Einschränkungsvorlage auf und stellt ihr spezifische Parameter für die Einschränkung zur Verfügung.

Wenn Sie Config Sync mit einem hierarchischen Repository verwenden, empfehlen wir, die Einschränkungen im Verzeichnis cluster/ zu erstellen.

Einschränkungen haben die folgenden Felder:

  • Das kleingeschriebene kind entspricht dem Namen einer Einschränkungsvorlage.
  • Der metadata.name ist der Name der Einschränkung.
  • Das Feld match definiert, für welche Objekte die Einschränkung gilt. Erst wenn für alle angegebenen Bedingungen eine Übereinstimmung vorliegt, fällt ein Objekt in den Gültigkeitsbereich einer Einschränkung. match-Bedingungen werden durch die folgenden untergeordneten Felder definiert:
    • kinds sind die Arten von Ressourcen, für die die Einschränkung gilt, und zwar wird dies durch zwei Felder bestimmt: apiGroups ist eine Liste der übereinstimmenden Kubernetes-API-Gruppen und kinds ist eine Liste der Arten, die übereinstimmen. "*" führt zu einer Übereinstimmung mit allem. Wenn mindestens ein apiGroup- und ein kind-Eintrag übereinstimmen, ist die Bedingung kinds erfüllt.
    • scope akzeptiert *, Cluster oder Namespaced, der angibt, ob clusterbezogene oder Namespace-bezogene Ressourcen ausgewählt sind (Standardeinstellung ist *).
    • namespaces ist eine Liste von Namespace-Namen, zu denen das Objekt gehören kann. Das Objekt muss zu mindestens einem dieser Namespaces gehören. Namespace-Ressourcen werden so behandelt, als ob sie sich selbst gehören.
    • excludedNamespaces ist eine Liste von Namespaces, zu denen das Objekt nicht gehören kann.
    • labelSelector ist eine Kubernetes-Labelauswahl, die das Objekt erfüllen muss.
    • namespaceSelector ist eine Labelauswahl für den Namespace, zu dem das Objekt gehört. Wenn der Namespace die Objektanforderungen nicht erfüllt, gibt es keine Übereinstimmung. Namespace-Ressourcen werden so behandelt, als ob sie sich selbst gehören.
  • Das Feld parameters definiert die Argumente für die Einschränkung auf Basis der Erwartungen der Einschränkungsvorlage.

Die folgende Einschränkung mit dem Namen ns-must-have-geo ruft eine Einschränkungsvorlage mit dem Namen K8sRequiredLabels auf, die in der von Google bereitgestellten Einschränkungsvorlagenbibliothek enthalten ist. Die Einschränkung definiert Parameter, mit denen die Einschränkungsvorlage bewertet, ob für Namespaces das Label geo auf einen bestimmten Wert festgelegt ist.

# ns-must-have-geo.yaml

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: ns-must-have-geo
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels:
      - key: "geo"

Verwenden Sie zum Erstellen der Einschränkung kubectl apply -f:

kubectl apply -f ns-must-have-geo.yaml

Einschränkung prüfen

Wenn die Einschränkung richtig konfiguriert und installiert ist, ist ihr Feld status.byPod[].enforced auf den Wert true gesetzt. Dies gilt unabhängig davon, ob die Einschränkung dafür konfiguriert ist, die Einschränkung zu erzwingen oder sie nur zu testen.

Einschränkungen werden standardmäßig erzwungen und ein Verstoß gegen eine Einschränkung verhindert einen bestimmten Clustervorgang. Sie können die spec.enforcementAction einer Einschränkung auf dryrun setzen, um Verstöße im Feld status.violations zu melden, ohne den Vorgang zu verhindern.

Weitere Informationen zur Prüfung finden Sie unter Audit mit Einschränkungen.

Einschränkungen beim Synchronisieren von Einschränkungen

Wenn Sie Ihre Einschränkungen mit einer zentralen Quelle wie einem Git-Repository mit Config Sync oder einem anderen GitOps-ähnlichen Tool synchronisieren, beachten Sie beim Synchronisieren von Einschränkungen die folgenden Einschränkungen.

Eventual Consistency

Sie können für Einschränkungen einen Commit in eine "Source of Truth" wie ein Git-Repository ausführen und deren Auswirkungen mithilfe von ClusterSelectors oder NamespaceSelectors begrenzen. Beachten Sie die folgenden Einschränkungen, da die Synchronisierung letztendlich konsistent ist:

  • Wenn ein Clustervorgang eine Einschränkung auslöst, deren NamespaceSelector auf einen nicht synchronisierten Namespace verweist, wird die Einschränkung erzwungen und der Vorgang verhindert. Mit anderen Worten, ein fehlender Namespace "schlägt geschlossen fehl".
  • Wenn Sie die Labels eines Namespace ändern, enthält der Cache möglicherweise für kurze Zeit veraltete Daten.

Minimieren Sie die Notwendigkeit, einen Namespace umzubenennen oder seine Labels zu ändern, und testen Sie Einschränkungen, die sich auf einen umbenannten oder mit neuen Labels versehenen Namespace auswirken, um sicherzustellen, dass sie wie erwartet funktionieren.

Policy Controller für referenzielle Einschränkungen konfigurieren

Bevor Sie referenzielle Einschränkungen aktivieren können, müssen Sie eine Konfiguration erstellen, in der Policy Controller mitgeteilt wird, welche Arten von Objekten im Blick behalten werden sollen, z. B. Namespaces.

Speichern Sie das folgende YAML-Manifest in einer Datei und wenden Sie es mit kubectl an. Das Manifest konfiguriert Policy Controller so, dass Namespaces und Ingress-Instanzen im Blick behalten werden. Erstellen Sie unter spec.sync.syncOnly mit den Werten für jeden Objekttyp, den Sie im Blick behalten möchten, einen Eintrag mit group, version und kind.

apiVersion: config.gatekeeper.sh/v1alpha1
kind: Config
metadata:
  name: config
  namespace: "gatekeeper-system"
spec:
  sync:
    syncOnly:
      - group: ""
        version: "v1"
        kind: "Namespace"
      - group: "extensions"
        version: "v1beta1"
        kind: "Ingress"

Referenzielle Einschränkungen aktivieren

Eine referenzielle Einschränkung verweist in ihrer Definition auf ein anderes Objekt. Sie können beispielsweise eine Einschränkung erstellen, für die Ingress-Objekte in einem Cluster eindeutige Hostnamen haben müssen. Die Einschränkung ist referenziell, wenn ihre Einschränkungsvorlage in ihrem Rego den String data.inventory enthält.

Referenzielle Einschränkungen sind standardmäßig aktiviert, wenn Sie Policy Controller mithilfe der Google Cloud Console installieren. Wenn Sie Policy Controller mithilfe der Google Cloud CLI installieren, können Sie auswählen, ob referenzielle Einschränkungen aktiviert werden sollen, wenn Sie Policy Controller installieren. Es wird nur garantiert, dass referenzielle Einschränkungen letztendlich konsistent sind, und dies birgt Risiken:

  • Auf einem überlasteten API-Server ist der Inhalt des Caches von Policy Controller möglicherweise schnell veraltet, was dazu führt, dass eine referenzielle Einschränkung "offen fehlschlägt". Dies bedeutet, dass die Erzwingungsaktion anscheinend funktioniert, wenn dies in Wahrheit nicht der Fall ist. Beispielsweise können Sie so schnell mehrere Ingress-Instanzen mit dem gleichen Hostnamen erstellen, dass der Admission-Controller die Duplikate nicht erkennen kann.

  • Die Reihenfolge, in der Einschränkungen installiert werden, und die Reihenfolge, in der der Cache aktualisiert wird, sind beide zufällig.

Sie können einen vorhandenen Cluster aktualisieren, um referenzielle Einschränkungen zuzulassen.

Console

Führen Sie die folgenden Schritte aus, um referenzielle Einschränkungen zu deaktivieren:

  1. Rufen Sie in der Google Cloud Console im Abschnitt Statusverwaltung die Seite GKE Enterprise-Richtlinie auf.

    Zur Richtlinie

  2. Wählen Sie auf dem Tab Einstellungen in der Clustertabelle in der Spalte Konfiguration bearbeiten die Option Bearbeiten aus.
  3. Maximieren Sie das Menü Policy Controller-Konfiguration bearbeiten.
  4. Klicken Sie das Kästchen Einschränkungsvorlagen aktivieren, die auf andere Objekte als das derzeit evaluierte verweisen an.
  5. Wählen Sie Änderungen speichern aus.

gcloud Policy Controller

Führen Sie den folgenden Befehl aus, um die Unterstützung für referenzielle Einschränkungen zu aktivieren:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --referential-rules

Ersetzen Sie MEMBERSHIP_NAME durch den Mitgliedschaftsnamen des registrierten Clusters, für den referenzielle Regeln aktiviert werden sollen. Sie können mehrere Mitgliedschaften durch Kommas getrennt angeben.

gcloud-ConfigManagement

Um die Unterstützung für referenzielle Einschränkungen zu aktivieren, legen Sie policyController.referentialRulesEnabled in der config-management.yaml-Datei auf true fest:

apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
  name: config-management
  namespace: config-management-system
spec:
  clusterName: my-cluster
  channel: dev
  policyController:
    enabled: true
    referentialRulesEnabled: true

Referenzielle Einschränkungen deaktivieren

Wenn Sie referenzielle Einschränkungen deaktivieren, werden alle Vorlagen, die referenzielle Einschränkungen verwenden, zusammen mit allen Einschränkungen, die diese Vorlagen verwenden, ebenfalls aus dem Cluster entfernt.

Console

Referenzielle Einschränkungen sind standardmäßig aktiviert, wenn Sie Policy Controller mit der Google Cloud Console installieren. Führen Sie die folgenden Schritte aus, um referenzielle Einschränkungen zu deaktivieren:

  1. Rufen Sie in der Google Cloud Console im Abschnitt Statusverwaltung die Seite GKE Enterprise-Richtlinie auf.

    Zur Richtlinie

  2. Wählen Sie auf dem Tab Einstellungen in der Clustertabelle in der Spalte Konfiguration bearbeiten die Option Bearbeiten aus.
  3. Maximieren Sie das Menü Policy Controller-Konfiguration bearbeiten.
  4. Entfernen Sie das Häkchen aus dem Kästchen Einschränkungsvorlagen aktivieren, die auf andere Objekte als das derzeit evaluierte verweisen.
  5. Wählen Sie Änderungen speichern aus.

gcloud Policy Controller

Führen Sie den folgenden Befehl aus, um die Unterstützung für referenzielle Einschränkungen zu deaktivieren:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --no-referential-rules

Ersetzen Sie MEMBERSHIP_NAME durch den Mitgliedschaftsnamen des registrierten Clusters, für den referenzielle Regeln aktiviert werden sollen. Sie können mehrere Mitgliedschaften durch Kommas getrennt angeben.

gcloud-ConfigManagement

Um referenzielle Einschränkungen für einen Cluster zu deaktivieren, setzen Sie policyController.referentialRulesEnabled in der config-management.yaml-Datei auf false:

apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
  name: config-management
  namespace: config-management-system
spec:
  clusterName: my-cluster
  channel: dev
  policyController:
    enabled: true
    referentialRulesEnabled: false

Alle Einschränkungen auflisten

Mit dem folgenden Befehl können Sie alle Einschränkungen auflisten, die für einen Cluster installiert sind:

kubectl get constraint

Sie können sich auch eine Übersicht über die angewendeten Einschränkungen in der Google Cloud Console ansehen. Weitere Informationen finden Sie unter Policy Controller-Messwerte.

Einschränkung entfernen

Um alle Einschränkungen zu finden, die eine Einschränkungsvorlage verwenden, listen Sie mit folgendem Befehl alle Objekte mit derselben kind wie der metadata.name der Einschränkungsvorlage auf:

kubectl get CONSTRAINT_TEMPLATE_NAME

Geben Sie zum Entfernen einer Einschränkung deren kind und name an:

kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME

Wenn Sie eine Einschränkung entfernen, wird sie nicht mehr erzwungen, sobald der API-Server die Einschränkung als gelöscht markiert.

Alle Einschränkungsvorlagen entfernen

Console

Führen Sie die folgenden Schritte aus, um die Einschränkungsvorlagenbibliothek zu deaktivieren:

  1. Rufen Sie in der Google Cloud Console im Abschnitt Statusverwaltung die Seite GKE Enterprise-Richtlinie auf.

    Zur Richtlinie

  2. Wählen Sie auf dem Tab Einstellungen in der Clustertabelle in der Spalte Konfiguration bearbeiten die Option Bearbeiten aus.
  3. Schalten Sie im Menü Richtlinien-Bundles hinzufügen/bearbeiten die Vorlagenbibliothek und alle Richtlinien-Bundles auf um.
  4. Wählen Sie Änderungen speichern aus.

gcloud Policy Controller

Führen Sie den folgenden Befehl aus, um die Einschränkungsvorlagenbibliothek zu deaktivieren:

gcloud container fleet policycontroller content templates disable \
    --memberships=MEMBERSHIP_NAME

Ersetzen Sie MEMBERSHIP_NAME durch den Mitgliedschaftsnamen des registrierten Clusters, für den die Einschränkungsvorlagenbibliothek deaktiviert werden soll. Sie können mehrere Mitgliedschaften durch Kommas getrennt angeben.

gcloud-ConfigManagement

Setzen Sie spec.policyController.templateLibraryInstalled auf false. Dadurch wird verhindert, dass der Policy Controller die Bibliothek automatisch neu installiert.

Entfernen Sie alle Einschränkungsvorlagen und alle Einschränkungen mit dem folgenden Befehl:

kubectl delete constrainttemplate --all

Einschränkungsvorlagenbibliothek wiederherstellen

Console

Führen Sie die folgenden Schritte aus, um die Einschränkungsvorlagenbibliothek zu aktivieren:

  1. Rufen Sie in der Google Cloud Console im Abschnitt Statusverwaltung die Seite GKE Enterprise-Richtlinie auf.

    Zur Richtlinie

  2. Wählen Sie auf dem Tab Einstellungen in der Clustertabelle in der Spalte Konfiguration bearbeiten die Option Bearbeiten aus.
  3. Schalten Sie im Menü Richtlinien-Bundles hinzufügen/bearbeiten die Vorlagenbibliothek auf ein. Sie können auch einige oder alle Richtlinien-Bundles aktivieren.
  4. Wählen Sie Änderungen speichern aus.

gcloud Policy Controller

Führen Sie den folgenden Befehl aus, um die Einschränkungsvorlagenbibliothek wiederherzustellen:

gcloud container fleet policycontroller content templates enable \
    --memberships=MEMBERSHIP_NAME

Ersetzen Sie MEMBERSHIP_NAME durch den Mitgliedschaftsnamen des registrierten Clusters, für den die Einschränkungsvorlagenbibliothek aktiviert werden soll. Sie können mehrere Mitgliedschaften durch Kommas getrennt angeben.

gcloud-ConfigManagement

Wenn Sie die Einschränkungsvorlagenbibliothek deaktiviert oder alle Einschränkungsvorlagen deinstalliert haben, können Sie sie wiederherstellen. Dazu setzen Sie in der Policy Controller-Konfiguration spec.policyController.templateLibraryInstalled auf true.

Verwenden Sie den folgenden Befehl, um den Operator-Pod neu zu starten:

kubectl delete pod -n config-management-system -l k8s-app=config-management-operator

Nächste Schritte