Ihre erste Anwendung erstellen

Auf dieser Seite wird gezeigt, wie Sie eine Anwendung in Ihrem Nutzercluster bereitstellen.

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

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: "gcr.io/google-samples/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: gcr.io/google-samples/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:        gcr.io/google-samples/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
  loadBalancerIP: [SERVICE_IP_ADDRESS]
  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.

Ersetzen Sie [SERVICE_IP_ADDRESS] durch eine Adresse, die Ihnen gehört und nicht bereits verwendet wird. Sie können beispielsweise eine öffentliche IP-Adresse festlegen, die Ihrem Unternehmen gehört. Sie können die Adresse auch in Ihrem Unternehmensnetzwerk auf eine private Adresse setzen.

Die von Ihnen ausgewählte Adresse muss von dem Standort eines Clients, der Anfragen an den Dienst sendet, routingfähig sein. Wenn Sie beispielsweise eine Privatadresse auswählen, können externe Clients keine Anfragen an den Dienst senden.

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 Ihres Nutzerclusters.

Wenn Sie den Dienst erstellen, konfiguriert GKE On-Prem die loadBalancerIP-Adresse auf Ihrem F5 BIG-IP-Load-Balancer.

Ihren Dienst aufrufen:

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

Die Ausgabe sieht etwa so aus:

apiVersion: v1
kind: Service
metadata:
  ...
  name: my-service
  namespace: default
  ...
spec:
  clusterIP: 10.107.84.202
  externalTrafficPolicy: Cluster
  loadBalancerIP: 21.0.133.48
  ports:
  - nodePort: 31919
    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. Er hat auch eine nodePort, eine port und eine targetPort.

Die clusterIP ist für diese Übung nicht relevant. Die loadBalancerIP ist die IP-Adresse, die Sie in my-service.yaml angegeben haben.

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

Ein Client sendet über TCP-Port 80 eine Anfrage an 203.0.113.1. Die Anfrage wird an den F5 BIG-IP-Load-Balancer weitergeleitet. Der Load-Balancer wählt einen Ihrer Nutzerclusterknoten aus und leitet die Anfrage an [NODE_ADDRESS] am TCP-Port 31919 weiter. Die iptables-Regeln auf dem Knoten leiten die Anfrage an einen Mitglieds-Pod am TCP-Port 8080 weiter.

Rufen Sie Ihren Dienst auf:

curl [SERVICE_IP_ADDRESS]

Dabei ist [SERVICE_IP_ADDRESS] die Adresse, die Sie für loadBalancerIP angegeben haben.

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

curl 21.0.133.48
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.