In diesem Dokument wird beschrieben, wie Sie eine Anwendung in Google Distributed Cloud bereitstellen.
Hinweise
Zum Bereitstellen einer Arbeitslast benötigen Sie einen Nutzer-, Hybrid- oder eigenständigen Cluster, auf dem Arbeitslasten ausgeführt werden können.
Deployment erstellen
Mit den folgenden Schritten erstellen Sie ein Deployment in Ihrem Cluster:
Kopieren Sie dann das folgende Manifest in eine Datei mit dem Namen
my-deployment.yaml.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"Erstellen Sie das Deployment mit
kubectl apply:kubectl apply -f my-deployment.yaml --kubeconfig CLUSTER_KUBECONFIGErsetzen Sie CLUSTER_KUBECONFIG durch den Pfad der kubeconfig-Datei für Ihren Cluster.
Rufen Sie grundlegende Informationen zu Ihrem Deployment ab, um zu prüfen, ob es erfolgreich erstellt wurde:
kubectl get deployment my-deployment --kubeconfig CLUSTER_KUBECONFIGDie 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 27sListen Sie die Pods in Ihrem Deployment auf:
kubectl get pods --kubeconfig CLUSTER_KUBECONFIGDie Ausgabe zeigt, dass in Ihrem Deployment drei Pods ausgeführt werden:
NAME READY STATUS RESTARTS AGE my-deployment-869f65669b-5259x 1/1 Running 0 34s my-deployment-869f65669b-9xfrs 1/1 Running 0 34s my-deployment-869f65669b-wn4ft 1/1 Running 0 34sRufen Sie detaillierte Informationen zu Ihrem Deployment ab:
kubectl get deployment my-deployment --output yaml --kubeconfig CLUSTER_KUBECONFIGDie Ausgabe enthält Details zur Deployment-Spezifikation und zum Status des Deployments:
apiVersion: apps/v1 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: "2023-06-29T16:17:17Z" lastUpdateTime: "2023-06-29T16:17:17Z" message: Deployment has minimum availability. reason: MinimumReplicasAvailable status: "True" type: Available - lastTransitionTime: "2023-06-29T16:17:12Z" lastUpdateTime: "2023-06-29T16:17:17Z" message: ReplicaSet "my-deployment-869f65669b" has successfully progressed. reason: NewReplicaSetAvailable status: "True" type: Progressing observedGeneration: 1 readyReplicas: 3 replicas: 3 updatedReplicas: 3Beschreiben Sie Ihr Deployment:
kubectl describe deployment my-deployment --kubeconfig CLUSTER_KUBECONFIGDie Ausgabe enthält schön formatierte Details zum Deployment, einschließlich des zugehörigen ReplicaSet:
Name: my-deployment Namespace: default CreationTimestamp: Thu, 29 Jun 2023 16:17:12 +0000 Labels: <none> Annotations: deployment.kubernetes.io/revision: 1 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: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: my-deployment-869f65669b (3/3 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 6m50s deployment-controller Scaled up replica set my-deployment-869f65669b to 3
Dienst 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.
So erstellen Sie einen Dienst vom Typ LoadBalancer:
Kopieren Sie dann das folgende Manifest in eine Datei mit dem Namen
my-service.yaml.apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: metrics department: sales type: LoadBalancer ports: - port: 80 targetPort: 8080Hier sind die wichtigsten Punkte, die Sie über den Dienst in dieser Übung wissen sollten:
Jeder Pod mit dem Label
app: metricsunddepartment: salesist ein Mitglied des Dienstes. Die Pods inmy-deploymenthaben diese Labels.Wenn ein Client eine Anfrage an den Dienst über TCP-Port
80sendet, wird die Anfrage an einen Mitglieds-Pod am TCP-Port8080weitergeleitet.Jeder Mitglieds-Pod muss über einen Container verfügen, der TCP-Port
8080überwacht.
Standardmäßig überwacht der Container
hello-appden TCP-Port8080. Sie finden diese Porteinstellung im Dockerfile und im Quellcode der Anwendung.Verwenden Sie
kubectl apply, um den Dienst in Ihrem Cluster zu erstellen:kubectl apply -f my-service.yaml --kubeconfig CLUSTER_KUBECONFIGErsetzen Sie CLUSTER_KUBECONFIG durch den Pfad der kubeconfig-Datei für Ihren Cluster.
Ihren Dienst aufrufen:
kubectl get service my-service --output yaml --kubeconfig CLUSTER_KUBECONFIGDie Ausgabe sieht in etwa so aus:
apiVersion: v1 kind: Service metadata: ... name: my-service namespace: default ... spec: allocateLoadBalancerNodePorts: true clusterIP: 10.96.2.165 clusterIPs: - 10.96.2.165 externalTrafficPolicy: Cluster internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - nodePort: 31565 port: 80 protocol: TCP targetPort: 8080 selector: app: metrics department: sales sessionAffinity: None type: LoadBalancer status: loadBalancer: ingress: - ip: 192.168.1.13In der vorherigen Ausgabe sehen Sie, dass Ihr Dienst eine
clusterIPund eine externe IP-Adresse hat. Er hat auch einennodePort, einenportund einentargetPort.Die
clusterIPist für diese Übung nicht relevant. Die externe IP-Adresse (status.loadBalancer.ingress.ip) stammt aus dem Adressbereich, den Sie beim Definieren von Load Balancer-Adresspools (spec.loadBalancer.addressPools) in der Clusterkonfigurationsdatei angegeben haben.Nehmen Sie als Beispiel die in der vorherigen Ausgabe für Ihren Dienst angezeigten Werte:
- Externe IP-Adresse:
192.168.1.13 port:80nodePort:31565targetPort:8080
Ein Client sendet über TCP-Port
80eine Anfrage an192.168.1.13. Die Anfrage wird an Ihren Load Balancer weitergeleitet und von dort an einen Mitglieds-Pod an TCP-Port8080.- Externe IP-Adresse:
Rufen Sie Ihren Dienst auf:
curl INGRESS_IP_ADDRESSErsetzen Sie INGRESS_IP_ADDRESS durch die Ingress-IP-Adresse im Abschnitt
statusdes Dienstes, die Sie im vorherigen Schritt abgerufen haben (status.loadBalancer.ingress).In der Ausgabe wird die Meldung
Hello, world!angezeigt:Hello, world! Version: 2.0.0 Hostname: my-deployment-869f65669b-wn4ft
LoadBalancer-Portlimits
Der Typ LoadBalancer ist eine Erweiterung des Typs NodePort. Ein Dienst vom Typ LoadBalancer hat also eine Cluster-IP-Adresse und einen oder mehrere nodePort-Werte.
Standardmäßig weist Kubernetes Diensten vom Typ LoadBalancer Knotenports zu.
Durch diese Zuweisungen können die verfügbaren Knotenports (2.768 Ports sind Ihrem Cluster zugewiesen) schnell aufgebraucht werden. Wenn Sie Knotenports sparen möchten, deaktivieren Sie die Zuordnung von Load Balancer-Knotenports, indem Sie in der LoadBalancer-Dienstspezifikation das Feld allocateLoadBalancerNodePorts auf false festlegen. Mit dieser Einstellung verhindert Kubernetes, dass LoadBalancer-Diensten Knotenports zugewiesen werden. Weitere Informationen finden Sie in der Kubernetes-Dokumentation unter Zuweisung von NodePorts für Load Balancer deaktivieren.
Hier ist ein Manifest zum Erstellen eines Dienstes, der keine Knotenports verwendet:
apiVersion: v1
kind: Service
metadata:
name: service-does-not-use-nodeports
spec:
selector:
app: my-app
type: LoadBalancer
ports:
- port: 8000
# Set allocateLoadBalancerNodePorts to false
allocateLoadBalancerNodePorts: false
Service löschen
So löschen Sie Ihren Dienst:
Verwenden Sie
kubectl delete, um den Dienst aus Ihrem Cluster zu löschen:kubectl delete service my-service --kubeconfig CLUSTER_KUBECONFIGPrüfen Sie, ob Ihr Dienst gelöscht wurde:
kubectl get services --kubeconfig CLUSTER_KUBECONFIGDie Ausgabe zeigt
my-servicenicht mehr an.
Deployment löschen
So löschen Sie Ihr Deployment:
Verwenden Sie
kubectl delete, um das Deployment aus Ihrem Cluster zu löschen:kubectl delete deployment my-deployment --kubeconfig CLUSTER_KUBECONFIGPrüfen Sie, ob Ihr Deployment gelöscht wurde:
kubectl get deployments --kubeconfig CLUSTER_KUBECONFIGDie Ausgabe zeigt
my-deploymentnicht mehr an.