Dienst und Ingress erstellen

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 die hello-app-Container TCP-Port 50000 und die node-hello-Container TCP-Port 8080 überwachen. Für hello-app können Sie die Auswirkungen der Umgebungsvariablen PORT 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 am port senden. In diesem Beispiel: 10.105.252.237:60000. Die Anfrage wird an einen Mitglieds-Pod am targetPort 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 am targetPort 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 am port senden. In diesem Beispiel: 10.105.252.237:60001. Die Anfrage wird an einen Mitglieds-Pod am targetPort 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 am targetPort 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 Ihres hello-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