Questo documento mostra come eseguire il deployment di un'applicazione nel cluster utente per i cluster Anthos su VMware (GKE On-Prem).
Prima di iniziare
Crea un cluster utente (guida rapida | istruzioni complete).
SSH nella workstation di amministrazione
Accedi a SSH nella workstation di amministrazione:
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
dove [IP_ADDRESS] è l'indirizzo IP della tua workstation di amministrazione.
Esegui tutti i passaggi rimanenti di questo argomento sulla tua workstation di amministrazione.
Creazione di un deployment
Di seguito è riportato un manifest per un 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"
Copia il manifest in un file denominato my-deployment.yaml
e crea il deployment:
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f my-deployment.yaml
dove [USER_CLUSTER_KUBECONFIG] è il percorso del file kubeconfig per il tuo cluster utente.
Ottenere informazioni di base sul tuo deployment:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get deployment my-deployment
L'output mostra che il deployment ha tre pod, tutti disponibili:
NAME READY UP-TO-DATE AVAILABLE AGE my-deployment 3/3 3 3 27s
Elenca i pod nel tuo deployment:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get pods
L'output mostra che il tuo deployment ha tre pod in esecuzione:
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
Ottieni informazioni dettagliate sul tuo deployment:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get deployment my-deployment --output yaml
L'output mostra i dettagli sulla specifica e sullo stato del deployment:
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
Descrivi il tuo deployment:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] describe deployment my-deployment
L'output mostra dettagli ben formattati sul deployment, incluso il ReplicaSet associato:
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)
Creazione di un servizio di tipo LoadBalancer
Un modo per esporre il deployment ai client esterni al cluster consiste nel creare un servizio Kubernetes di tipo LoadBalancer
.
Ecco un manifest per un servizio di tipo 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
Ai fini di questo esercizio, questi sono gli aspetti importanti da comprendere in merito al Servizio:
Qualsiasi pod con l'etichetta
app: metrics
e l'etichettadepartment: sales
è un membro del Servizio. Tieni presente che i pod inmy-deployment
hanno queste etichette.Quando un client invia una richiesta al servizio sulla porta TCP 80, la richiesta viene inoltrata al pod membro sulla porta TCP 8080.
Ogni pod membro deve avere un container in ascolto sulla porta TCP 8080.
Per impostazione predefinita, il container hello-app
rimane in ascolto sulla porta TCP
8080. Puoi verificarlo osservando il Dockerfile e il codice sorgente dell'app.
Sostituisci [SERVICE_IP_ADDRESS] con un indirizzo di tua proprietà non in uso. Ad esempio, potresti impostarlo su un indirizzo IP pubblico di proprietà della tua azienda. In alternativa, puoi impostarlo su un indirizzo privato nella tua rete aziendale.
L'indirizzo scelto deve essere instradabile dalla località di qualsiasi client che invia richieste al servizio. Ad esempio, se scegli un indirizzo privato, i client esterni non saranno in grado di inviare richieste al servizio.
Salva il manifest in un file denominato my-service.yaml
e crea il Service:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] apply -f my-service.yaml
dove [USER_CLUSTER_KUBECONFIG] è il percorso del file kubeconfig per il tuo cluster utente.
Quando crei il servizio, i cluster Anthos su VMware configurano automaticamente l'indirizzo loadBalancerIP
sul bilanciatore del carico BIG-IP di F5.
Visualizza il tuo servizio:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get service my-service --output yaml
L'output è simile al seguente:
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
Nell'output precedente, puoi vedere che il tuo servizio ha un clusterIP
e un loadBalancerIP
. Ha anche nodePort
, port
e targetPort
.
clusterIP
non è pertinente a questo esercizio. loadBalancerIP
è l'indirizzo IP che hai fornito in my-service.yaml
.
Prendi, ad esempio, i valori mostrati nell'output precedente. Ciò significa che supponiamo che il tuo servizio abbia loadBalancerIP
= 203.0.113.1, port
= 80,
nodePort
= 31919 e targetPort
= 8080.
Un client invia una richiesta a 203.0.113.1 sulla porta TCP 80. La richiesta viene instradata al bilanciatore del carico BIG-IP di F5. Il bilanciatore del carico sceglie uno dei nodi del cluster utente e inoltra la richiesta a [NODE_ADDRESS] sulla porta TCP 31919. Le regole iptables sul nodo inoltrano la richiesta a un pod membro sulla porta TCP 8080.
Chiama il servizio:
curl [SERVICE_IP_ADDRESS]
dove [SERVICE_IP_ADDRESS] è l'indirizzo specificato per
loadBalancerIP
.
L'output mostra un messaggio Hello, world!
:
curl 21.0.133.48 Hello, world! Version: 2.0.0 Hostname: my-deployment-dbd86c8c4-9wpbv
Eliminazione del servizio
Elimina il servizio:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete service my-service
Verifica che il servizio sia stato eliminato:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get services
L'output non mostra più my-service
.
Eliminazione del deployment
Elimina il tuo deployment:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete deployment my-deployment
Verifica che il deployment sia stato eliminato:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get deployments
L'output non mostra più my-deployment
.