Außerdem wird gezeigt, wie Sie kpt mit anderen Google-Lösungen wie Config Sync und GKE Enterprise Sicherheits-Blueprints kombinieren können. Unabhängig davon, ob Sie Entwickler sind, der mit Kubernetes arbeitet, oder Plattformentwickler, der eine Kubernetes-basierte Plattform verwaltet, können Sie in dieser Anleitung lernen, wie Sie kpt in eigenen Workflows für Kubernetes verwenden. Es wird davon ausgegangen, dass Sie mit Kubernetes und Google Cloud vertraut sind.
Die deklarative Konfiguration der Cloud-Infrastruktur ist eine bewährte Praxis in der IT-Branche. Sie bietet eine leistungsstarke Abstraktion der zugrunde liegenden Systeme. Durch diese Abstraktion müssen Sie keine Konfigurationsdetails und Abhängigkeiten auf niedriger Ebene verwalten. Daher bietet die deklarative Konfiguration einen Vorteil gegenüber imperativen Ansätzen, z. B. Vorgängen, die in grafischen und Befehlszeilen-Schnittstellen ausgeführt werden.
Das Kubernetes-Ressourcenmodell hat dazu beigetragen, deklarative Konfigurationsansätze zum Mainstream zu machen. Da die Kubernetes API vollständig deklarativ ist, teilen Sie nur Kubernetes mit, was Sie möchten, und nicht, wie das erreicht werden soll. Mit der Kubernetes API können Sie die Konfiguration (gewünschte oder reale) von Vorgängen für die Konfiguration trennen, also Objekte hinzufügen, entfernen und ändern. Das heißt, im Kubernetes-Ressourcenmodell besteht die Konfiguration aus Daten und nicht aus Code.
Diese Trennung der Konfiguration von den Vorgängen hat viele Vorteile: Personen und automatisierte Systeme können die Konfiguration verstehen und damit arbeiten; die Software, die die Konfiguration ändert, kann einfach wiederverwendet werden. Dank dieser Trennung können Sie auch eine GitOps-Methode implementieren, wie in der Anleitung Continuous Delivery gemäß GitOps mit Cloud Build definiert.
In dieser Anleitung untersuchen Sie die Trennung der Konfigurationsdeklaration von den Konfigurationsvorgängen mit kpt. In dieser Anleitung werden die folgenden Features von kpt erläutert:
- Paketverwaltung: Kubernetes-Konfigurationspakete herunterladen und aktualisieren.
- Funktionen: beliebige Codeteile ausführen, um Ihre Konfigurationen zu ändern oder zu validieren.
- Funktionspipeline: eine Reihe von Funktionen, die der Paketautor in das Paket aufgenommen hat.
- Ressourcenverwaltung: Ressourcen, die Ihren Konfigurationen entsprechen, in einem Kubernetes-Cluster anwenden, aktualisieren und löschen.
Ziele
- Einen Google Kubernetes Engine-Cluster (GKE) erstellen
- Mit kpt bestehende Kubernetes-Konfigurationen herunterladen
- kpt-Funktionen verwenden, um die Konfigurationen anzupassen
- Konfiguration auf den GKE-Cluster anwenden
- Mit kpt einige vorgelagerte Änderungen für Ihre Konfiguration übernehmen
- kpt in einem realen Szenario verwenden, um den GKE-Cluster zu härten
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
- Google Kubernetes Engine
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Hinweis
- Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
-
Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
-
Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
-
Aktivieren Sie Cloud Shell in der Google Cloud Console.
Unten in der Google Cloud Console wird eine Cloud Shell-Sitzung gestartet und eine Eingabeaufforderung angezeigt. Cloud Shell ist eine Shell-Umgebung, in der das Google Cloud CLI bereits installiert ist und Werte für Ihr aktuelles Projekt bereits festgelegt sind. Das Initialisieren der Sitzung kann einige Sekunden dauern.
Konfigurieren Sie Cloud Shell für die Verwendung Ihres Projekts:
gcloud config set project PROJECT_ID
-
Aktivieren Sie in Cloud Shell Google Kubernetes Engine und Cloud Source Repositories APIs:
gcloud services enable container.googleapis.com \ sourcerepo.googleapis.com
Wenn Sie diese Anleitung abgeschlossen haben, können Sie laufende Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
GKE-Cluster erstellen
In diesem Abschnitt erstellen Sie den GKE-Cluster, in dem Sie später in der Anleitung Konfigurationen bereitstellen.
Erstellen Sie in Cloud Shell einen GKE-Cluster:
gcloud container clusters create kpt-tutorial \ --num-nodes=1 --machine-type=n1-standard-4 \ --zone=us-central1-a --enable-network-policy
Prüfen Sie, ob Sie auf den Cluster zugreifen können. Mit dem folgenden Befehl werden Informationen über die Knoten im Cluster zurückgegeben.
kubectl get nodes
kpt-Paket anwenden
In diesem Abschnitt verwenden Sie kpt, um eine Reihe von Konfigurationen herunterzuladen, anzupassen und auf den Cluster anzuwenden, den Sie im vorherigen Abschnitt erstellt haben.
kpt
sollte in Ihrer Cloud Shell-Umgebung installiert sein. Ist dies nicht der Fall, installieren Sie es mit den folgenden Befehlen:
Installieren Sie in Cloud Shell kpt:
sudo apt update && sudo apt-get install google-cloud-sdk-kpt
Beispielsatz mit Konfigurationen herunterladen. Weitere Informationen finden Sie unter
kpt pkg get
.kpt pkg get https://github.com/GoogleContainerTools/kpt.git/package-examples/wordpress@v0.9
Mit dem vorherigen Befehl wird das
wordpress
-Beispielpaket, das im kpt-GitHub-Repository verfügbar ist, unter der mitv0.9
gekennzeichneten Version heruntergeladen.Sehen Sie sich den Paketinhalt an:
kpt pkg tree
.kpt pkg tree wordpress
Die Ausgabe sieht so aus:
Package "wordpress" ├── [Kptfile] Kptfile wordpress ├── [service.yaml] Service wordpress ├── deployment │ ├── [deployment.yaml] Deployment wordpress │ └── [volume.yaml] PersistentVolumeClaim wp-pv-claim └── Package "mysql" ├── [Kptfile] Kptfile mysql ├── [deployment.yaml] PersistentVolumeClaim mysql-pv-claim ├── [deployment.yaml] Deployment wordpress-mysql └── [deployment.yaml] Service wordpress-mysql
Das Paket enthält zwei Pakete: das der obersten Ebene
wordpress
und ein Unterpaketwordpress/mysql
. Beide Pakete enthalten die MetadatendateiKptfile
.Kptfile
wird nur von kpt selbst verwendet und enthält Daten zur vorgelagerten Quelle, zur Anpassung und Validierung des Pakets.Aktualisieren Sie das Label des Pakets.
Der Autor des Pakets hat eine Rendering-Pipeline hinzugefügt, die häufig verwendet wird, um die erwarteten Anpassungen anzugeben.
less wordpress/Kptfile
Der Inhalt sollte in etwa so aussehen:
apiVersion: kpt.dev/v1 kind: Kptfile metadata: name: wordpress upstream: type: git git: repo: https://github.com/GoogleContainerTools/kpt directory: /package-examples/wordpress ref: v0.9 updateStrategy: resource-merge upstreamLock: type: git git: repo: https://github.com/GoogleContainerTools/kpt directory: /package-examples/wordpress ref: package-examples/wordpress/v0.9 commit: b9ea0bca019dafa9f9f91fd428385597c708518c info: emails: - kpt-team@google.com description: This is an example wordpress package with mysql subpackage. pipeline: mutators: - image: gcr.io/kpt-fn/set-labels:v0.1 configMap: app: wordpress validators: - image: gcr.io/kpt-fn/kubeval:v0.3
Sie können die Parameter der set-label-Funktion mit Ihrem bevorzugten Editor von
app: wordpress
inapp: my-wordpress
ändern.Bearbeiten Sie die MySQL-Bereitstellung
wordpress/mysql/deployment.yaml
mit Ihrem bevorzugten Codeeditor, um die MySQL-Version zu ändern. Um die Sicherheit weiter zu erhöhen, ändern Sie die VariableMYSQL_ROOT_PASSWORD
inMYSQL_PASSWORD
und fügen Sie die folgenden Variablen hinzu:MYSQL_USER
MYSQL_RANDOM_ROOT_PASSWORD
MYSQL_DATABASE
Vorher:
[...] containers: - name: mysql image: mysql:5.6 ports: - name: mysql protocol: TCP containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password [...]
Nachher:
[...] containers: - name: mysql image: mysql:8.0 ports: - name: mysql protocol: TCP containerPort: 3306 env: - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password - name: MYSQL_RANDOM_ROOT_PASSWORD value: '1' - name: MYSQL_USER value: wordpress - name: MYSQL_DATABASE value: wordpress [...]
Bearbeiten Sie die WordPress-Bereitstellung
wordpress/deployment/deployment.yaml
mit Ihrem bevorzugten Codeeditor, um die WordPress-Version zu ändern und eineWORDPRESS_DB_USER
-Variable hinzuzufügen.Vorher:
[...] containers: - name: wordpress image: wordpress:6.1-apache ports: - name: wordpress protocol: TCP containerPort: 80 env: - name: WORDPRESS_DB_HOST value: wordpress-mysql - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password [...]
Nachher:
[...] containers: - name: wordpress image: wordpress:4.8-apache ports: - name: wordpress protocol: TCP containerPort: 80 env: - name: WORDPRESS_DB_HOST value: wordpress-mysql - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password - name: WORDPRESS_DB_USER value: wordpress [...]
Im Gegensatz zu Tools, die nur über Parameter ausgeführt werden, können Sie mit kpt Dateien mit einem Editor bearbeiten und dann die vorgelagerten Updates zusammenführen. Sie können
deployment.yaml
direkt bearbeiten, ohne einen Patch oder eine Funktion in der Pipeline erstellen zu müssen:Versehen Sie die Konfiguration über
sample-annotation: sample-value
mit einer Annotation.kpt fn eval wordpress --image gcr.io/kpt-fn/set-annotations:v0.1 \ -- sample-annotation=sample-value
Die Ausgabe sollte in etwa so aussehen:
[RUNNING] "gcr.io/kpt-fn/set-annotations:v0.1" [PASS] "gcr.io/kpt-fn/set-annotations:v0.1"
Wenn Sie die neue Annotation sehen möchten, können Sie jeden Konfigurationswert untersuchen. Eine einfache Option ist
wordpress/service.yaml
.In diesem Beispiel haben wir eine Anpassung mit einer Funktion vorgenommen, die der Paketautor nicht geplant hat. kpt kann die deklarative und imperative Funktionsausführung unterstützen, um eine Vielzahl von Szenarien zu ermöglichen.
Wenn dieses Paket mit Infrastruktur als Code entwickelt wurde, müssen wir die Quelle des Pakets aufrufen und den Code dort bearbeiten.
Führen Sie die Pipeline aus und validieren Sie die Änderungen mit kubeval über kpt.
kpt fn render wordpress
Der Paketautor hat einen Validierungsschritt in die Pipeline aufgenommen:
... validators: - image: gcr.io/kpt-fn/kubeval:v0.3
Die erfolgreiche Ausgabe dieser Rendering-Pipeline sieht so aus:
Package "wordpress/mysql": [RUNNING] "gcr.io/kpt-fn/set-labels:v0.1" [PASS] "gcr.io/kpt-fn/set-labels:v0.1" in 1.3s Package "wordpress": [RUNNING] "gcr.io/kpt-fn/set-labels:v0.1" [PASS] "gcr.io/kpt-fn/set-labels:v0.1" in 1.3s [RUNNING] "gcr.io/kpt-fn/kubeval:v0.3" [PASS] "gcr.io/kpt-fn/kubeval:v0.3" in 3.7s Successfully executed 3 function(s) in 2 package(s).
Dieser Schritt ist ein Beispiel für die Vorteile des Kubernetes-Ressourcenmodells. Da Ihre Konfigurationen in diesem bekannten Modell dargestellt werden, können Sie vorhandene Kubernetes-Tools wie kubeval verwenden.
Untersuchen Sie die Unterschiede zwischen der lokalen Version der Konfigurationen und der vorgelagerten Konfiguration:
kpt pkg diff wordpress
Initialisieren Sie das Paket für die Bereitstellung:
kpt live init wordpress
Mit dem vorherigen Befehl wird ein Inventar der im Paket enthaltenen Konfigurationen erstellt. kpt verwendet das Inventar unter anderem, um Konfigurationen zu bereinigen, wenn Sie diese aus dem Paket entfernen. Weitere Informationen finden Sie unter
kpt live
.Erstellen Sie ein Secret mit dem MySQL-Passwort:
kubectl create secret generic mysql-pass --from-literal=password=foobar
Wenden Sie die Konfigurationen auf Ihren GKE-Cluster an:
kpt live apply wordpress
Die Ausgabe sieht so aus:
installing inventory ResourceGroup CRD. inventory update started inventory update finished apply phase started service/wordpress apply successful service/wordpress-mysql apply successful deployment.apps/wordpress apply successful deployment.apps/wordpress-mysql apply successful persistentvolumeclaim/mysql-pv-claim apply successful persistentvolumeclaim/wp-pv-claim apply successful apply phase finished reconcile phase started service/wordpress reconcile successful service/wordpress-mysql reconcile successful deployment.apps/wordpress reconcile pending deployment.apps/wordpress-mysql reconcile pending persistentvolumeclaim/mysql-pv-claim reconcile pending persistentvolumeclaim/wp-pv-claim reconcile pending persistentvolumeclaim/wp-pv-claim reconcile successful persistentvolumeclaim/mysql-pv-claim reconcile successful deployment.apps/wordpress-mysql reconcile successful deployment.apps/wordpress reconcile successful reconcile phase finished inventory update started inventory update finished apply result: 6 attempted, 6 successful, 0 skipped, 0 failed reconcile result: 6 attempted, 6 successful, 0 skipped, 0 failed, 0 timed out
Warten Sie einige Minuten und prüfen Sie dann, ob alles wie erwartet funktioniert:
kpt live status wordpress
Die Ausgabe sieht so aus:
inventory-88521939/deployment.apps/default/wordpress is Current: Deployment is available. Replicas: 1 inventory-88521939/persistentvolumeclaim/default/wp-pv-claim is Current: PVC is Bound inventory-88521939/service/default/wordpress-mysql is Current: Service is ready inventory-88521939/persistentvolumeclaim/default/mysql-pv-claim is Current: PVC is Bound inventory-88521939/deployment.apps/default/wordpress-mysql is Current: Deployment is available. Replicas: 1 inventory-88521939/service/default/wordpress is Current: Service is ready
Lokales Paket aktualisieren
In diesem Abschnitt aktualisieren Sie die lokale Version des Pakets mit einigen Änderungen aus dem vorgelagerten Paket.
Erstellen Sie ein Git-Repository für Ihre Konfigurationen und konfigurieren Sie Ihre E-Mail-Adresse und Ihren Namen. Sie benötigen ein lokales Git-Repository, um das Paket aktualisieren zu können. Ersetzen Sie
YOUR_EMAIL
durch Ihre E-Mail-Adresse undYOUR_NAME
durch Ihren Namen.cd wordpress/ git init -b main git config user.email "YOUR_EMAIL" git config user.name "YOUR_NAME"
Führen Sie ein Commit Ihrer Konfigurationen durch:
git add . git commit -m "First version of Wordpress package" cd ..
Aktualisieren Sie Ihr lokales Paket. In diesem Schritt rufen Sie die
v0.10
-Version aus Upstream-Prozessen ab.kpt pkg update wordpress@v0.10
Beachten Sie, dass Aktualisierungen aus den Upstream-Prozessen auf Ihr lokales Paket angewendet werden:
cd wordpress/ git diff
In diesem Fall wurde das Wordpress-Bereitstellungsvolumen von 3Gi in 4Gi geändert. Sie können auch Ihre eigenen Änderungen sehen.
Wenden Sie Ihre Änderungen an:
git commit -am "Update to package version v0.10"
Wenden Sie die neue Version des Pakets an:
kpt live apply .
Ressource und Paket entfernen
Da mit kpt die von kpt erstellten Ressourcen verfolgt werden, kann es Ressourcen aus dem Cluster bereinigen, wenn Sie Ressourcen aus dem Paket löschen. Es kann auch ein Paket vollständig aus dem Cluster entfernen. In diesem Abschnitt entfernen Sie eine Ressource aus dem Paket und entfernen dann das Paket.
Entfernen Sie die Datei
service.yaml
aus dem Paket:git rm service.yaml git commit -m "Remove service"
Wenden Sie die Änderung an und prüfen Sie, ob kpt den wordpress-Dienst bereinigt hat:
kpt live apply . kubectl get svc
Entfernen Sie das restliche Paket aus dem Cluster und prüfen Sie, ob der Cluster leer ist:
kpt live destroy . kubectl get deployment
GKE mithilfe von kpt härten
Der Befehl kpt live
ist nicht die einzige Möglichkeit, ein Paket auf einen Kubernetes-Cluster anzuwenden. In diesem Abschnitt verwenden Sie kpt mit Config Sync in einem einfachen, aber realistischen Szenario. Mit dem Config Sync-Tool können Sie Ihre Konfiguration zentral, einheitlich und deklarativ für alle Kubernetes-Cluster aus einem Git-Repository verwalten. Config Sync ist als eigenständiges Produkt für GKE verfügbar. GKE Enterprise (wird in dieser Anleitung verwendet) enthält Config Management.
Die GKE Enterprise-Sicherheits-Blueprints bieten eine Reihe vorkonfigurierter Sicherheitseinstellungen für Ihre GKE Enterprise-basierten Arbeitslasten. In diesem Abschnitt verwenden Sie den Blueprint zum Einschränken des Traffics und das zugehörige Verzeichnis im GitHub-Repository.
Verwenden Sie kpt, um das default-deny
-Paket herunterzuladen. Das Paket verwendet standardmäßig Kubernetes-Netzwerkrichtlinien, um Traffic in Ihrem GKE-Cluster (außer zur DNS-Auflösung) standardmäßig abzulehnen. Führen Sie einen Commit der Konfigurationen für das Git-Repository von Config Sync durch, um die Konfigurationen anzuwenden.
Config Sync installieren
In diesem Abschnitt erstellen Sie das Git-Repository, das Config Sync benötigt, und installieren dann Config Sync auf Ihrem GKE-Cluster.
Verwenden Sie in Cloud Shell Cloud Source Repositories, um ein Git-Repository für Config Sync zu erstellen:
cd ~ gcloud source repos create config-management
Generieren Sie ein SSH-Schlüsselpaar, um sich im Git-Repository zu authentifizieren:
cd ~ ssh-keygen -t rsa -b 4096 -N '' \ -f cloud_source_repositories_key
Erstellen Sie das Kubernetes-Secret, das den privaten SSH-Schlüssel für den Zugriff auf das Git-Repository enthält:
kubectl create ns config-management-system && \ kubectl create secret generic git-creds \ --namespace=config-management-system \ --from-file=ssh=cloud_source_repositories_key
Zeigen Sie den öffentlichen Schlüssel an und kopieren Sie ihn:
cat cloud_source_repositories_key.pub
Rufen Sie in Cloud Source Repositories
die Seite SSH-Schlüssel verwalten auf.
Geben Sie im Dialogfeld SSH-Schlüssel registrieren die folgenden Werte ein:
- Geben Sie im Feld Schlüsselname den Wert
config-management
ein. - Fügen Sie den öffentlichen Schlüssel in das Feld Schlüssel ein.
- Klicken Sie auf Registrieren.
- Geben Sie im Feld Schlüsselname den Wert
Klonen Sie das Git-Repository in Cloud Shell:
gcloud source repos clone config-management cd config-management git checkout -b main
Laden Sie das Config Sync-Befehlszeilentool
nomos
herunter:nomos
sollte in Ihrer Cloud Shell-Umgebung installiert werden. Ist dies nicht der Fall, installieren Sie es mit den folgenden Befehlen:sudo apt update && sudo apt-get install google-cloud-sdk-nomos
Initialisieren Sie das Config Sync-Repository:
nomos init git add . git commit -m "Config Management directory structure" git push -u origin main
Stellen Sie den Config Sync Operator-bereit.
gsutil cp gs://config-management-release/released/latest/config-management-operator.yaml /tmp/config-management-operator.yaml kubectl apply -f /tmp/config-management-operator.yaml
Config Sync konfigurieren
Erstellen Sie eine benutzerdefinierte ConfigManagement-Ressource, um Config Sync zu konfigurieren:
PROJECT=$(gcloud config get-value project) EMAIL=$(gcloud config get-value account) cat <<EOF > /tmp/config-management.yaml apiVersion: configmanagement.gke.io/v1 kind: ConfigManagement metadata: name: config-management spec: clusterName: kpt-tutorial git: syncRepo: ssh://${EMAIL}@source.developers.google.com:2022/p/${PROJECT}/r/config-management syncBranch: main secretType: ssh EOF kubectl -n config-management-system \ apply -f /tmp/config-management.yaml
Weitere Installationsoptionen finden Sie in der Config Sync-Dokumentation.
Überprüfen Sie in Cloud Shell, ob Config Sync ordnungsgemäß funktioniert:
nomos status --contexts=$(kubectl config current-context)
Dieser Befehl gibt den Status
SYNCED
zurück. Die Initialisierung von Config Sync kann einige Zeit dauern. Wenn der Status nicht aktualisiert wird, warten Sie ein paar Minuten und führen Sie den Befehl noch einmal aus.
GKE Enterprise-Sicherheits-Blueprint verwenden
In diesem Abschnitt verwenden Sie kpt, um das default-deny
-Paket des GKE Enterprise-Sicherheits-Blueprints für die Einschränkung des Traffics herunterzuladen. Anschließend wenden Sie mithilfe von Config Sync das Paket nur auf den Namespace default
an.
Laden Sie das Paket
default-deny
herunter:cd ~ kpt pkg get https://github.com/GoogleCloudPlatform/anthos-security-blueprints.git/restricting-traffic/default-deny ./
Sie können sich den Inhalt des Pakets ansehen: Die Datei
default-deny/Kptfile
enthält die Metadaten des Pakets und die Dateidefault-deny/default-deny.yaml
enthält eine Kubernetes-NetworkPolicy, die die einzige Konfiguration aus diesem Blueprint ist.Verwenden Sie kpt, um den Inhalt des Pakets in das Config Sync-Repository zu kopieren, und fügen Sie dann Labels hinzu, um ihn anzupassen:
kpt fn source default-deny/ | \ kpt fn eval - --image=gcr.io/kpt-fn/set-annotations:v0.1 -- \ anthos-security-blueprint=restricting-traffic | \ kpt fn sink ~/config-management/namespaces/default/
Wie in diesem Beispiel gezeigt, können Sie senkrechte Striche verwenden, um
kpt fn
-Befehle zu verketten. Durch das Verketten vonkpt fn
-Befehlen können Sie Konfigurationen lesen, ändern und das Ergebnis schreiben. Sie können beliebig vielekpt fn
-Befehle verketten.Erstellen Sie im Config Sync-Repository die Datei
namespace.yaml
:cat >> ~/config-management/namespaces/default/namespace.yaml <<EOF apiVersion: v1 kind: Namespace metadata: name: default EOF
Der Namespace
default
ist in Ihrem GKE-Cluster vorhanden, wird aber nicht von Config Sync verwaltet. Wenn Sie in diesem Schritt das Verzeichnis und die Datei erstellen, sorgen Sie damit dafür, dass Config Sync den Namespace verwaltet. Um das Paket auf mehrere Namespaces gleichzeitig anzuwenden, können Sie einen abstrakten Namespace erstellen.Prüfen Sie, ob die Kubernetes-NetworkPolicies in das Config Management-Repository geschrieben wurden und mit
anthos-security-blueprint: restricting-traffic
annotiert sind:cat config-management/namespaces/default/default-deny.yaml
Die Ausgabe sieht so aus:
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: # kpt-merge: /default-deny name: default-deny annotations: internal.kpt.dev/upstream-identifier: 'networking.k8s.io|NetworkPolicy|default|default-deny' anthos-security-blueprint: restricting-traffic spec: policyTypes: - Ingress - Egress podSelector: {} egress: - to: - namespaceSelector: matchLabels: k8s-namespace: kube-system podSelector: matchExpressions: - key: k8s-app operator: In values: ["kube-dns", "node-local-dns"] ports: - protocol: TCP port: 53 - protocol: UDP port: 53
Übernehmen Sie die Änderungen per Commit und übertragen Sie sie per Push:
cd ~/config-management/ git add namespaces/default/ git commit -m "Default deny" git push
Prüfen Sie, ob die neue Richtlinie angewendet wird:
kubectl get networkpolicies
Wenn die neue Richtlinie nicht vorhanden ist, warten Sie einige Sekunden und führen Sie den Befehl noch einmal aus. Config Sync aktualisiert die Konfigurationen standardmäßig alle 15 Sekunden. Wenn Sie zusätzliche Schritte zur Fehlerbehebung ausführen müssen, führen Sie den folgenden Befehl aus, um Informationen zu möglichen Config Sync-Fehlern abzurufen:
nomos status --contexts=$(kubectl config current-context)
Rufen Sie zum Testen der neuen Richtlinie eine Shell in einem Pod ab, der im Namespace
default
ausgeführt wird:kubectl -n default run -i --tty --rm test \ --image=busybox --restart=Never -- sh
Versuchen Sie,
8.8.8.8
zu kontaktieren, und beachten Sie, dass es wie erwartet nicht funktioniert:ping -c 3 -W 1 8.8.8.8
Die Ausgabe sieht so aus:
PING 8.8.8.8 (8.8.8.8): 56 data bytes --- 8.8.8.8 ping statistics --- 3 packets transmitted, 0 packets received, 100% packet loss
Fragen Sie den Kubernetes API-Server ab und beachten Sie, dass es wie erwartet nicht funktioniert:
wget --timeout=3 https://${KUBERNETES_SERVICE_HOST}
Die Ausgabe sieht so aus:
Connecting to 10.3.240.1 (10.3.240.1:443) wget: download timed out
Beenden Sie den Pod:
exit
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.
Projekt löschen
- Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.
Ressourcen löschen
Wenn Sie das in dieser Anleitung verwendete Google Cloud-Projekt beibehalten möchten, können Sie das Git-Repository und den GKE-Cluster löschen. Führen Sie in Cloud Shell die folgenden Befehle aus:
gcloud source repos delete config-management --quiet
gcloud container clusters delete kpt-tutorial \
--async --quiet --zone=us-central1-a
Nächste Schritte
- Mehr über Config Management und dessen Komponenten erfahren
- Mehr über Policy Controller zur Validierung der Bereitstellungskonfiguration Ihrer Anwendung
- Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center