Auf dieser Seite wird gezeigt, wie Sie ein Kubernetes-Ingress-Objekt in einem Anthos-Cluster auf VMware-GKE-Nutzercluster (GKE On-Prem) erstellen. Ein Ingress-Objekt ist einem oder mehreren Dienstobjekten zugeordnet. Diesen wiederum ist jeweils ein Pod-Satz zugeordnet.
SSH-Verbindung zur Administrator-Workstation herstellen
Stellen Sie eine SSH-Verbindung zu Ihrer Administrator-Workstation her:
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
Dabei ist [IP_ADDRESS] die IP-Adresse der Administrator-Workstation.
Führen Sie alle verbleibenden Schritte in diesem Thema auf Ihrer Administrator-Workstation aus.
Deployment erstellen
Dies ist ein Manifest für ein Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: hello-deployment spec: selector: matchLabels: greeting: hello replicas: 3 template: metadata: labels: greeting: hello spec: containers: - name: hello-world image: "gcr.io/google-samples/hello-app:2.0" env: - name: "PORT" value: "50000" - name: hello-kubernetes image: "gcr.io/google-samples/node-hello:1.0" env: - name: "PORT" value: "8080"
Für diese Übung sollten Sie die folgenden wichtigen Punkte zum Deployment-Manifest verstehen:
Jeder Pod, der zum Deployment gehört, hat das Label
greeting: hello
.Jeder Pod hat zwei Container.
Die
env
-Felder geben an, dass diehello-app
-Container TCP-Port 50000 und dienode-hello
-Container TCP-Port 8080 überwachen. Fürhello-app
können Sie die Auswirkungen der UmgebungsvariablenPORT
im Quellcode sehen.
Kopieren Sie das Manifest in eine Datei mit dem Namen hello-deployment.yaml
und erstellen Sie das Deployment:
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f hello-deployment.yaml
Dabei ist [USER_CLUSTER_KUBECONFIG] die kubeconfig-Datei für Ihren Nutzercluster.
Deployment mit einem Service verfügbar machen
Erstellen Sie einen Service, um Clients eine stabile Möglichkeit zu bieten, Anfragen an die Pods Ihres Deployments zu senden.
Hier sehen Sie ein Manifest für einen Service, der Ihr Deployment für Clients innerhalb und außerhalb Ihres Clusters verfügbar macht:
apiVersion: v1 kind: Service metadata: name: hello-service spec: type: NodePort selector: greeting: hello ports: - name: world-port protocol: TCP port: 60000 targetPort: 50000 - name: kubernetes-port protocol: TCP port: 60001 targetPort: 8080
Kopieren Sie das Manifest in eine Datei mit dem Namen hello-service.yaml
und erstellen Sie den Service:
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f hello-service.yaml
Lassen Sie den Service anzeigen:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get service hello-service --output yaml
Die Ausgabe zeigt die nodePort
-Werte, die dem Service zugewiesen wurden:
apiVersion: v1 kind: Service metadata: ... name: hello-service namespace: default ... spec: clusterIP: 10.105.252.237 externalTrafficPolicy: Cluster ports: - name: world-port nodePort: 31807 port: 60000 protocol: TCP targetPort: 50000 - name: kubernetes-port nodePort: 30734 port: 60001 protocol: TCP targetPort: 8080 selector: greeting: hello sessionAffinity: None type: NodePort status: loadBalancer: ingress: - {}
In der vorherigen Ausgabe ist das Feld ports
ein Array von ServicePort-Objekten: eines mit dem Namen world-port
und eines mit dem Namen kubernetes-port
.
So kann ein Client den Service mit world-port
aufrufen:
Ein Client, der auf einem der Clusterknoten ausgeführt wird, kann eine Anfrage an die
clusterIP
amport
senden. In diesem Beispiel: 10.105.252.237:60000. Die Anfrage wird an einen Mitglieds-Pod amtargetPort
weitergeleitet. In diesem Beispiel: [POD_IP_ADDRESS]:50000.Ein Client kann eine Anfrage an die IP-Adresse eines beliebigen Clusterknotens am
nodePort
senden. In diesem Beispiel: [NODE_IP_ADDRESS]:31807. Die Anfrage wird an einen Mitglieds-Pod amtargetPort
weitergeleitet. In diesem Beispiel: [POD_IP_ADDRESS]:50000.
So kann ein Client den Service mit kubernetes-port
aufrufen:
Ein Client, der auf einem der Clusterknoten ausgeführt wird, kann eine Anfrage an die
clusterIP
amport
senden. In diesem Beispiel: 10.105.252.237:60001. Die Anfrage wird an einen Mitglieds-Pod amtargetPort
weitergeleitet. In diesem Beispiel: [POD_IP_ADDRESS]:8080.Ein Client kann eine Anfrage an die IP-Adresse eines beliebigen Clusterknotens am
nodePort
senden. In diesem Beispiel: [NODE_IP_ADDRESS]:30734. Die Anfrage wird an einen Mitglieds-Pod amtargetPort
weitergeleitet. In diesem Beispiel: [POD_IP_ADDRESS]:8080.
Ingress erstellen
Hier ist ein Manifest für ein Ingress:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress spec: rules: - http: paths: - path: /greet-the-world backend: serviceName: hello-service servicePort: 60000 - path: /greet-kubernetes backend: serviceName: hello-service servicePort: 60001
Kopieren Sie das Manifest in eine Datei mit dem Namen my-ingress.yaml
und erstellen Sie das Ingress-Objekt:
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f my-ingress.yaml
Beim Erstellen Ihres Nutzerclusters haben Sie eine virtuelle IP-Adresse (VIP) für eingehenden Traffic angegeben, indem Sie einen Wert für usercluster.vips.ingressvip
in Ihrer Nutzercluster-Konfigurationsdatei festgelegt haben.
Wenn ein Client eine Anfrage an die Nutzercluster-VIP für eingehenden Traffic sendet, wird die Anfrage an Ihren F5 BIG-IP-Load-Balancer geleitet. Der Load-Balancer leitet die Anfrage an einen Service für eingehenden Traffic weiter, der in Ihrem Nutzercluster ausgeführt wird. Der Service für eingehenden Traffic ist so konfiguriert, dass er die Anfrage je nach Pfad in der Anfrage-URL an verschiedene Back-Ends weiterleitet.
Es ist wichtig zu verstehen, dass es zwei verschiedene Services im Zusammenhang mit den Schritten in diesem Thema gibt:
Ihren Service mit dem Namen
hello-service
. Dies ist ein Service, den Sie erstellt haben, um die Pods Ihreshello-deployment
-Deployments verfügbar zu machen.Den Service für eingehenden Traffic, der im Namespace
gke-system
Ihres Nutzerclusters ausgeführt wird. Dieser Service ist Teil Ihrer Clusterinfrastruktur.
Der /greet-the-world
-Pfad
In Ihrem Ingress-Manifest sehen Sie eine Regel, die besagt, dass der Pfad /greet-the-world
mit serviceName: hello-service
und servicePort: 60000
verknüpft ist. Beachten Sie, dass 60000 der port
-Wert im Feld world-port
Ihres hello-service
-Services ist.
- name: world-port nodePort: 31807 port: 60000 protocol: TCP targetPort: 50000
Der Service für eingehenden Traffic wählt einen Clusterknoten aus und leitet die Anfrage an den Knoten am nodePort
weiter. In diesem Beispiel: [NODE_IP_ADDRESS]:31807. Die iptables-Regeln auf dem Knoten leiten die Anfrage an einen Mitglieds-Pod an Port 50000 weiter. Der Container, der Port 50000 überwacht, zeigt die Meldung Hello World!
an.
Der /greet-kubernetes
-Pfad
In Ihrem Ingress-Manifest sehen Sie eine Regel, die besagt, dass der Pfad /greet-kubernetes
mit serviceName: hello-service
und servicePort: 60001
verknüpft ist. Beachten Sie, dass 60001 der port
-Wert im Feld kubernetes-port
Ihres hello-service
-Services ist.
- name: kubernetes-port nodePort: 30734 port: 60001 protocol: TCP targetPort: 8080
Der Service für eingehenden Traffic wählt einen Clusterknoten aus und leitet die Anfrage an den Knoten am nodePort
weiter. In diesem Beispiel: [NODE_IP_ADDRESS]:30734. Die iptables-Regeln auf dem Knoten leiten die Anfrage an einen Member-Pod an Port 8080 weiter.
Der Container, der Port 8080 überwacht, zeigt eine die Meldung Hello Kubernetes!
an.
Ingress testen
Testen Sie das Ingress-Objekt mit dem Pfad /greet-the-world
:
curl [USER_CLUSTER_INGRESS_VIP]/greet-the-world
In der Ausgabe wird die Meldung Hello, world!
angezeigt:
Hello, world! Version: 2.0.0 Hostname: ...
Testen Sie Ingress mit dem Pfad /greet-kubernetes
:
curl [USER_CLUSTER_INGRESS_VIP]/greet-kubernetes
In der Ausgabe wird die Meldung Hello, Kubernetes!
angezeigt:
Hello Kubernetes!
Bereinigen
Löschen Sie das Ingress-Objekt:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete ingress my-ingress
Löschen Sie den Service:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete service hello-service
Löschen Sie Ihr Deployment:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete deployment hello-deployment