Deployment di un'applicazione

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'etichetta department: sales è un membro del Servizio. Tieni presente che i pod in my-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.

Passaggi successivi

Crea un Service e una Ingress