Anwendung bereitstellen

Dieses Dokument enthält ein Beispiel für die Bereitstellung einer Anwendung in einem Nutzercluster für Google Distributed Cloud.

Hinweise

Für das hier angegebene Beispiel benötigen Sie einen Nutzercluster, der gebündeltes MetalLB-Load-Balancing verwendet. Eine Anleitung zum Erstellen eines minimalen Nutzerclusters, der MetalLB verwendet, finden Sie unter Einfache Cluster erstellen.

Sie können die Anwendung entweder mit der Google Cloud Console oder mit dem kubectl-Befehlszeilentool auf Ihrer Administratorworkstation bereitstellen.

Console

  1. Rufen Sie in der Console die Übersichtsseite für Google Kubernetes Engine-Cluster auf.

    Zu GKE-Clustern

  2. Klicken Sie in der Liste der Cluster auf Ihren Nutzercluster und prüfen Sie, ob Sie beim Cluster angemeldet sind.

    Wenn Sie noch nicht bei Ihrem Nutzercluster angemeldet sind, melden Sie sich an. Folgen Sie dazu der Anleitung unter Cluster über die Google Cloud Console verwalten.

Container

  1. Wählen Sie unter Neuer Container die Option Vorhandenes Container-Image aus.

  2. Geben Sie als Image-Pfad us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0 ein.

  3. Klicken Sie auf Weiter.

Configuration

  1. Geben Sie als Bereitstellungsname my-deployment ein.

  2. Geben Sie als Namespace default ein.

  3. Geben Sie diese beiden Labels ein:

    • Schlüssel 1: app, Wert 1: metrics
    • Schlüssel 2: department, Wert 2 sales
  4. Wählen Sie im Drop-down-Menü Kubernetes-Cluster Ihren Cluster aus.

  5. Klicken Sie auf Weiter.

Freigeben

  1. Klicken Sie das Kästchen Bereitstellung als neuen Dienst freigeben an.

  2. Geben Sie für Port 1 den Wert 80 ein.

  3. Geben Sie für Zielport 1 den Wert 8080 ein. Dies ist der geeignete Wert, da der Container hello-app standardmäßig den TCP-Port 8080 überwacht. Sehen Sie sich dazu das Dockerfile und den Quellcode für die Anwendung an.

  4. Wählen Sie für Protokoll 1 die Option TCP aus.

  5. Wählen Sie als Servicetyp die Option LoadBalancer aus.

Klicken Sie unten auf der Seite auf die Schaltfläche Bereitstellen.

Bereitstellungs- und Dienstdetails ansehen

  1. Wenn das Deployment bereit ist, wird die Seite Bereitstellungsdetails im Abschnitt Kubernetes-Arbeitslasten der Google Cloud Console geöffnet. Auf dieser Seite sehen Sie Details zum Deployment und seinen drei Pods.

  2. Klicken Sie unter Dienste verfügbar machen auf den Namen des Dienstes, der Ihr Deployment freigibt. Für diese Übung lautet der Name my-deployment-service.

  3. Die Seite Dienstdetails wird geöffnet. Auf dieser Seite finden Sie Details zum Dienst. Sie können beispielsweise sehen, dass jeder Pod mit den Labels app: metrics und department: sales ein Mitglied des Dienstes ist. Denken Sie daran, dass die Pods in my-deployment diese Labels haben.

Sie können auch einen Wert für IP-Adresse des Load-Balancers sehen. Die IP-Adresse des Load-Balancers wurde automatisch für den Cluster-Load-Balancer konfiguriert.

Weiterleitung des Dienstes

Angenommen, ein Client außerhalb des Clusters sendet eine Anfrage an die IP-Adresse des Load-Balancers an TCP-Port 80. Die Anfrage wird an den Cluster-Load-Balancer weitergeleitet. Der Load-Balancer leitet die Anfrage über TCP-Port 8080 an einen Mitglieds-Pod weiter. Denken Sie daran, dass jeder Pod in my-deployment einen Container hat, der den TCP-Port 8080 überwacht.

Dienst testen

Rufen Sie eine Maschine auf, auf der die IP-Adresse des Load-Balancers weitergeleitet werden kann.

Geben Sie die IP-Adresse des Load-Balancers in einen Browser ein oder verwenden Sie einen Befehl wie curl, um Ihren Dienst aufzurufen. Beispiel:

curl [LOAD_BALANCER_IP]:80

Die Ausgabe zeigt die Nachricht Hello, world!. Beispiel:

curl 203.0.113.1:80
Hello, world!
Version: 2.0.0
Hostname: my-deployment-dbd86c8c4-9wpbv

Deployment löschen

Rufen Sie in der Console im Abschnitt Kubernetes Engine die Seite Arbeitslasten auf.

Zur Seite „Arbeitslasten“

Wählen Sie in der Liste der Deployments die Option my-deployment aus.

Klicken Sie oben auf der Seite auf Löschen. Dadurch werden sowohl das Deployment als auch der verfügbar gemachte Dienst gelöscht.

Befehlszeile

Verbindung zu Ihrer Administrator-Workstation herstellen

Rufen Sie eine SSH-Verbindung zu Ihrer Administrator-Workstation ab: Führen Sie die folgenden Schritte auf Ihrer Administratorworkstation aus.

Deployment erstellen

Hier ist ein Manifest für ein Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: metrics
      department: sales
  replicas: 3
  template:
    metadata:
      labels:
        app: metrics
        department: sales
    spec:
      containers:
      - name: hello
        image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"

Kopieren Sie das Manifest in eine Datei mit dem Namen my-deployment.yaml und erstellen Sie das Deployment:

kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-deployment.yaml

Dabei ist USER_CLUSTER_KUBECONFIG der Pfad der kubeconfig-Datei für Ihren Nutzercluster.

Grundlegende Informationen zu Ihrem Deployment abrufen:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployment my-deployment

Die Ausgabe zeigt, dass das Deployment über drei Pods verfügt, die alle verfügbar sind:

NAME            READY   UP-TO-DATE   AVAILABLE   AGE
my-deployment   3/3     3            3           27s

Listen Sie die Pods in Ihrem Deployment auf:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get pods

Die Ausgabe zeigt, dass in Ihrem Deployment drei Pods ausgeführt werden:

NAME                             READY   STATUS    RESTARTS   AGE
my-deployment-54944c8d55-4srm2   1/1     Running   0          6s
my-deployment-54944c8d55-7z5nn   1/1     Running   0          6s
my-deployment-54944c8d55-j62n9   1/1     Running   0          6s

Rufen Sie detaillierte Informationen zu Ihrem Deployment ab:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployment my-deployment --output yaml

Die Ausgabe enthält Details zur Deployment-Spezifikation und zum Status des Deployments:

kind: Deployment
metadata:
  ...
  generation: 1
  name: my-deployment
  namespace: default
  ...
spec:
  ...
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: metrics
      department: sales
  ...
    spec:
      containers:
      - image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
        imagePullPolicy: IfNotPresent
        name: hello
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 3
  conditions:
  ‑ lastTransitionTime: "2019-11-11T18:44:02Z"
    lastUpdateTime: "2019-11-11T18:44:02Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  ‑ lastTransitionTime: "2019-11-11T18:43:58Z"
    lastUpdateTime: "2019-11-11T18:44:02Z"
    message: ReplicaSet "my-deployment-54944c8d55" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
  readyReplicas: 3
  replicas: 3
  updatedReplicas: 3

Beschreiben Sie Ihr Deployment:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG describe deployment my-deployment

Die Ausgabe enthält schön formatierte Details zum Deployment, einschließlich des zugehörigen ReplicaSet:

Name:                   my-deployment
Namespace:              default
CreationTimestamp:      Mon, 11 Nov 2019 10:43:58 -0800
Labels:                 
...
Selector:               app=metrics,department=sales
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=metrics
           department=sales
  Containers:
    hello:
    Image:        us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
    Port:         
    Host Port:    
    Environment:  
    Mounts:       
  Volumes:        
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  
NewReplicaSet:   my-deployment-54944c8d55 (3/3 replicas created)

Service vom Typ LoadBalancer erstellen

Eine Möglichkeit, Ihr Deployment für Clients außerhalb des Clusters bereitzustellen, besteht darin, einen Kubernetes-Dienst des Typs LoadBalancer zu erstellen.

Hier ist ein Manifest für einen Service vom Typ LoadBalancer:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: metrics
    department: sales
  type: LoadBalancer
  ports:
  ‑ port: 80
    targetPort: 8080

Zum Zweck dieser Übung sollten Sie diese wichtigen Punkte in Bezug auf den Dienst berücksichtigen:

  • Jeder Pod mit dem Label app: metrics und department: sales ist ein Mitglied des Dienstes. Die Pods in my-deployment haben diese Labels.

  • Wenn ein Client eine Anfrage an den Dienst über TCP-Port 80 sendet, wird die Anfrage an einen Mitglieds-Pod am TCP-Port 8080 weitergeleitet.

  • Jeder Mitglieds-Pod muss über einen Container verfügen, der TCP-Port 8080 überwacht.

Standardmäßig überwacht der Container hello-app den TCP-Port 8080. Sehen Sie sich das Dockerfile und den Quellcode für die Anwendung an.

Speichern Sie das Manifest in einer Datei mit dem Namen my-service.yaml und erstellen Sie den Dienst:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-service.yaml

Dabei ist USER_CLUSTER_KUBECONFIG der Pfad der kubeconfig-Datei für Ihren Nutzercluster.

Wenn Sie den Dienst erstellen, konfiguriert GKE on VMware automatisch die loadBalancerIP-Adresse für den Cluster-Load-Balancer.

Ihren Dienst aufrufen:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get service my-service --output yaml

Die Ausgabe sieht etwa so aus:

kind: Service
metadata:
  ...
  name: my-service
  namespace: default
  ...
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.96.1.39
  clusterIPs:
  - 10.96.1.39
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 31184
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: metrics
    department: sales
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 203.0.113.1

In der vorherigen Ausgabe sehen Sie, dass Ihr Dienst eine clusterIP und eine loadBalancerIP hat. Es hat auch eine port und eine targetPort.

Die clusterIP ist für diese Übung nicht relevant. loadBalancerIP ist die IP-Adresse, über die Clients außerhalb des Clusters den Dienst aufrufen können.

Nehmen Sie als Beispiel die in der vorherigen Ausgabe angezeigten Werte. Angenommen, Ihr Dienst hat loadBalancerIP = 203.0.113.1, port = 80 und targetPort = 8080.

Ein Client sendet über TCP-Port 80 eine Anfrage an 203.0.113.1. Die Anfrage wird an den Cluster-Load-Balancer weitergeleitet. Der Load-Balancer leitet die Anfrage über TCP-Port 8080 an einen Mitglieds-Pod weiter.

Rufen Sie Ihren Dienst auf:

curl LOAD_BALANCER_IP

In der Ausgabe wird die Meldung Hello, world! angezeigt:

curl 203.0.113.1
Hello, world!
Version: 2.0.0
Hostname: my-deployment-dbd86c8c4-9wpbv

Dienst löschen

Löschen Sie den Service:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete service my-service

Prüfen Sie, ob Ihr Dienst gelöscht wurde:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get services

Die Ausgabe zeigt my-service nicht mehr an.

Deployment löschen

Löschen Sie Ihr Deployment:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete deployment my-deployment

Prüfen Sie, ob Ihr Deployment gelöscht wurde:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployments

Die Ausgabe zeigt my-deployment nicht mehr an.

Nächste Schritte

Service und Ingress erstellen