In diesem Dokument wird gezeigt, wie Sie eine Anwendung in Ihrem Nutzercluster für Anthos-Cluster auf VMware (GKE On-Prem) bereitstellen.
Hinweis
Nutzercluster erstellen (Kurzanleitung | Vollständige Anleitung).
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: "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 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
unddepartment: sales
ist ein Mitglied des Dienstes. Die Pods inmy-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 für Ihren Nutzercluster.
Wenn Sie den Dienst erstellen, konfiguriert Anthos-Cluster auf VMware automatisch die Adresse loadBalancerIP
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: 203.0.113.1 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.