Auf dieser Seite wird erläutert, wie Sie einen internen TCP/UDP-Load-Balancer in Google Kubernetes Engine (GKE) über VPC-Netzwerke erstellen. Machen Sie sich vor dem Lesen dieser Seite mit den folgenden Konzepten vertraut:
Hinweis
Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:
- Aktivieren Sie die Google Kubernetes Engine API. Google Kubernetes Engine API aktivieren
- Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit
gcloud components update
ab.
Internen Load-Balancer mit Private Service Connect erstellen
Als Dienstersteller können Sie Dienstanhänge verwenden, um Ihre Dienste für Dienstnutzer in anderen VPC-Netzwerken mit Private Service Connect verfügbar zu machen. Sie können Dienstanhänge mit einer benutzerdefinierten ServiceAttachment
-Ressource erstellen, verwalten und löschen.
Anforderungen und Einschränkungen
- Es gelten Einschränkungen für Private Service Connect.
- Sie können einen Dienstanhang in GKE-Versionen 1.21.4-gke.300 und höher erstellen.
- Sie können dasselbe Subnetz nicht in mehreren Konfigurationen für Dienstanhänge verwenden.
- Sie müssen einen GKE-Dienst erstellen, der einen internen Passthrough-Network-Load-Balancer verwendet.
- Sie können kein Subnetz in einem anderen Projekt (freigegebene VPC) für GKE-Versionen vor 1.22.4-gke.100 angeben. Achten Sie bei freigegebenen VPCs darauf, dass alle Anforderungen für freigegebene VPCs erfüllt sind.
ServiceAttachment
erstellen
Erstellen Sie ein Subnetz.
Sie müssen für jedes
ServiceAttachment
ein neues Subnetz erstellen.gcloud beta compute networks subnets create SUBNET_NAME \ --project PROJECT_ID \ --network NETWORK_NAME \ --region REGION \ --range SUBNET_RANGE \ --purpose PRIVATE_SERVICE_CONNECT
Dabei gilt:
SUBNET_NAME
: der Name des neuen Subnetzes. In den GKE-Versionen 1.22.4-gke.100 und höher können Sie ein Subnetz in einem anderen Projekt angeben. Verwenden Sie dazu die vollständig qualifizierte Ressourcen-URL für dieses Feld. Sie können die vollständig qualifizierte Ressourcen-URL mit dem Befehlgcloud compute networks subnets describe
abrufen.PROJECT_ID
: die ID Ihres Google Cloud-Projekts.NETWORK_NAME
: Name des VPC-Netzwerks für das Subnetz.REGION
: die Region für das neue Subnetz. Sie müssen dieselbe Region wie für den von Ihnen erstellten Dienst verwenden.SUBNET_RANGE
: der IP-Adressbereich, der für das Subnetz verwendet werden soll.
Stellen Sie eine Arbeitslast bereit.
Das folgende Manifest beschreibt eine Bereitstellung, die ein Container-Image einer Beispielwebanwendung ausführt: Speichern Sie das Manifest als
my-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: psc-ilb spec: replicas: 3 selector: matchLabels: app: psc-ilb template: metadata: labels: app: psc-ilb spec: containers: - name: whereami image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1.2.19 ports: - name: http containerPort: 8080 readinessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 5 timeoutSeconds: 1
Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f my-deployment.yaml
Einen Dienst erstellen Das folgende Manifest beschreibt einen Dienst, der einen internen Passthrough-Network-Load-Balancer an TCP-Port 8080 erstellt. Speichern Sie das Manifest als
my-service.yaml
:apiVersion: v1 kind: Service metadata: name: SERVICE_NAME annotations: networking.gke.io/load-balancer-type: "Internal" spec: type: LoadBalancer selector: app: psc-ilb ports: - port: 80 targetPort: 8080 protocol: TCP
Dabei gilt:
SERVICE_NAME
: der Name des neuen Dienstes.
Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f my-service.yaml
Erstellen Sie
ServiceAttachment
.Das folgende Manifest beschreibt ein
ServiceAttachment
, das den von Ihnen erstellten Dienst für Dienstnutzer verfügbar macht. Speichern Sie das Manifest alsmy-psc.yaml
:apiVersion: networking.gke.io/v1 kind: ServiceAttachment metadata: name: SERVICE_ATTACHMENT_NAME namespace: default spec: connectionPreference: ACCEPT_AUTOMATIC natSubnets: - SUBNET_NAME proxyProtocol: false resourceRef: kind: Service name: SERVICE_NAME
Dabei gilt:
SERVICE_ATTACHMENT_NAME
: der Name des neuen Dienstanhangs.SUBNET_NAME
: der Name des neuen Subnetzes. In den GKE-Versionen 1.22.4-gke.100 und höher können Sie ein Subnetz in einem anderen Projekt angeben. Verwenden Sie dazu die vollständig qualifizierte Ressourcen-URL für dieses Feld. Sie können die vollständig qualifizierte Ressourcen-URL mit dem Befehlgcloud compute networks subnets describe
abrufen. Verwenden Sie für eine freigegebene VPC-Konfiguration das folgende Format:projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNET_NAME
.
Weitere Informationen zu den Manifestfeldern finden Sie in den Feldern des Dienstanhangs.
Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f my-psc.yaml
Prüfen Sie, ob der Private Service Connect-Controller den Dienstanhang erstellt hat:
gcloud beta compute service-attachments list
Die Ausgabe zeigt einen Dienstanhang mit einem automatisch generierten Namen:
NAME REGION PRODUCER_FORWARDING_RULE CONNECTION_PREFERENCE k8s1-sa-... REGION_NAME a3fea439c870148bdba5e59c9ea9451a ACCEPT_AUTOMATIC
Ein ServiceAttachment
aufrufen
Mit dem folgenden Befehl können Sie die Details eines ServiceAttachment
aufrufen:
kubectl describe serviceattachment SERVICE_ATTACHMENT_NAME
Die Ausgabe sieht etwa so aus:
kubectl describe serviceattachment foo-sa
Name: <sa-name>
Namespace: default
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1beta1
Kind: ServiceAttachment
Metadata:
...
Status:
Forwarding Rule URL: https://www.googleapis.com/compute/beta/projects/<project>/regions/<region>/forwardingRules/<fr-name>
Last Modified Timestamp: 2021-07-08T01:32:39Z
Service Attachment URL: https://www.googleapis.com/compute/beta/projects/<projects>/regions/<region>/serviceAttachments/<gce-service-attachment-name>
Events: <none>
Ein ServiceAttachment
nutzen
Führen Sie die folgenden Schritte aus, um Ihren Dienst aus einem anderen Projekt zu nutzen:
Rufen Sie die URL von
ServiceAttachment
ab:kubectl get serviceattachment SERVICE_ATTACHMENT_NAME -o=jsonpath="{.status.serviceAttachmentURL}"
Die Ausgabe sieht etwa so aus:
serviceAttachmentURL: https://www.googleapis.com/compute/alpha/projects/<project>/region/<region>/serviceAttachments/k8s1-...my-sa
Mit der URL von
ServiceAttachment
einen Private Service Connect-Endpunkt erstellenBestätigen Sie, dass Sie eine Verbindung zu dem Dienst herstellen können, den Sie im Erstellerprojekt bereitgestellt haben, indem Sie einen
curl
-Befehl von einer VM im Nutzerprojekt verwenden:curl PSC_IP_ADDRESS
Ersetzen Sie
PSC_IP_ADDRESS
durch die IP-Adresse der Weiterleitungsregel im Nutzerprojekt.Die Ausgabe sieht etwa so aus:
{ "cluster_name":"cluster", "host_header":"10.128.15.200", "node_name":"gke-psc-default-pool-be9b6e0e-dvxg.c.gke_project.internal", "pod_name":"foo-7bf648dcfd-l5jf8", "pod_name_emoji":"👚", "project_id":"gke_project", "timestamp":"2021-06-29T21:32:03", "zone":"ZONE_NAME" }
ServiceAttachment
aktualisieren
Ein ServiceAttachment
lässt sich mit den folgenden Schritten aktualisieren:
Bearbeiten Sie das Manifest
ServiceAttachment
inmy-psc.yaml
:apiVersion: networking.gke.io/v1 kind: ServiceAttachment metadata: name: my-sa namespace: default spec: connectionPreference: ACCEPT_AUTOMATIC natSubnets: - my-nat-subnet proxyProtocol: false resourceRef: kind: Service name: ilb-service
Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f my-psc.yaml
ServiceAttachment
löschen
Mit einem Dienstanhang verbundene interne Network-Load-Balancer können nicht gelöscht werden. Sie müssen den Dienstanhang und den GKE-Dienst separat löschen.
So löschen Sie den Dienstanhang:
kubectl delete serviceattachment SERVICE_ATTACHMENT_NAME --wait=false
Mit diesem Befehl wird der Dienstanhang zum Löschen markiert, die Ressource ist jedoch weiterhin vorhanden. Sie können auch warten, bis der Löschvorgang abgeschlossen ist. Lassen Sie dazu das Flag
--wait
weg.Dienst löschen:
kubectl delete svc SERVICE_NAME
Löschen Sie das Subnetz:
gcloud compute networks subnets delete SUBNET_NAME
ServiceAttachment
-Felder
Das ServiceAttachment
hat die folgenden Felder:
connectionPreference
: die Verbindungsoption, die bestimmt, wie Kunden eine Verbindung zum Dienst herstellen. Sie können entweder die automatische Projektgenehmigung mitACCEPT_AUTOMATIC
oder eine explizite Projektgenehmigung mitACCEPT_MANUAL
verwenden. Weitere Informationen finden Sie unter Dienste mit Private Service Connect veröffentlichen.natSubnets
: eine Liste der Namen der Subnetzwerkressourcen, die für den Dienstanhang verwendet werden sollen.proxyProtocol
: wenn diese Option auf "true" gesetzt ist, sind die IP-Adresse der Nutzerquelle und die Verbindungs-ID von Private Service Connect in den Anfragen verfügbar. Dieses Feld ist optional und wird standardmäßig auf "false" gesetzt, wenn es nicht angegeben ist.consumerAllowList
: die Liste der Nutzerprojekte, die eine Verbindung zumServiceAttachment
herstellen dürfen. Dieses Feld kann nur verwendet werden, wennconnectionPreference
ACCEPT_MANUAL
ist. Weitere Informationen zu diesem Feld finden Sie unter Dienste mit Private Service Connect veröffentlichen.project
: die Projekt-ID oder Nummer des Nutzerprojekts.connectionLimit
: das Verbindungslimit für das Nutzerprojekt. Dieses Feld ist optional.forceSendFields
: die Feldnamen, die an API-Anfragen gesendet werden sollen. Dieses Feld ist optional.nullFields
: Die Feldnamen, die in API-Anfragen mit einem Nullwert enthalten sein sollen. Dieses Feld ist optional.
consumerRejectList
: die Liste der Nutzerprojekt-IDs oder -Nummern, die keine Verbindung zumServiceAttachment
herstellen dürfen. Dieses Feld kann nur verwendet werden, wennconnectionPreference
ACCEPT_MANUAL
ist. Weitere Informationen zu diesem Feld finden Sie unter Dienste mit Private Service Connect veröffentlichen.resourceRef
: ein Verweis auf die Kubernetes-Ressource.kind
: der Typ der Kubernetes-Ressource. Sie müssenService
verwenden.name
: der Name der Kubernetes-Ressource, die sich im selben Namespace wie der interne Passthrough-Network-Load-Balancer befinden muss.
Problembehebung
Fehlermeldungen können Sie mit dem folgenden Befehl aufrufen:
kubectl get events -n NAMESPACE
Ersetzen Sie NAMESPACE
durch den Namespace des internen Passthrough-Network-Load-Balancers.
Eine Fehlermeldung wie die folgende tritt auf, wenn Sie versuchen, einen internen Passthrough-Network-Load-Balancer zu löschen, der von einem Dienstanhang verwendet wird. Sie müssen ServiceAttachment
löschen, bevor Sie den internen Passthrough-Network-Load-Balancer löschen können.
Error syncing load balancer: failed to ensure load balancer: googleapi:
Error 400: The forwarding_rule resource '<fwd-rule-URL>' is already being used
by '<svc-attachment-URL>', resourceInUseByAnotherResource.
Nächste Schritte
- Netzwerkübersicht
- Mehr über Compute Engine-Load-Balancer erfahren
- VPC-nativen Cluster erstellen
- Autorisierte Netzwerke für Masterzugriff erstellen