Guida Rubrica KUBE 4: Creazione della prima applicazione su Kubernetes

Kode

Utente Emerald
10 Dicembre 2013
1,226
81
371
623
kube_1.jpg



All'interno di questo capitolo dedicato alla rubrica su Kubernetes, andiamo a creare la prima applicazione Kubernetes chiamata Hello MiniKube! che avrà come scopo principale quello di creare un primo contatto con l'ambiente in modo da definire la prima applicazione verso il percorso che ci porterà, nelle lezioni successivi, a definire applicazioni stateless e stateful di natura semplice e complessa.

IV. Capitoli
1.
Introduzione a Kubernetes: cos'è, infrastruttura su cui si basa, vantaggi, caratteristiche e nomenclatura.
2. Architettura di Kubernetes: Architettura Cluster, Container, Pods, Admin Cluster, Storage e Scheduling.
3. Configurazione di un ambiente Kubernetes: Set up, configurazione dei container, dei pods ed esecuzione di applicazioni.
4. Creazione della prima applicazione su Kubernetes: Hello MiniKube!
5.
Creazione di un'applicazione stateless su Kubernetes
(*) La rubrica potrebbe subire delle estensioni in caso il progetto riceva un buon feedback.



1. Introduzione
Per poter eseguire questo tutorial, diamo per scontato che tu abbia già impostato l'ambiente di sviluppo discusso nella lezione 3. Questo perchè tra gli elementi di ambiente abbiamo proprio la virtualizzazione dell'infrastruttura di Kubernetes tramite minikube.

Prima di cominciare dobbiamo definire alcuni passi preliminari:

Aprire il Terminale nella tua VM Ubuntu.

1. Digitare come segue:

Codice:
minikube start

2. Aprire la dashboard da Browser Web dopo aver digitato nel terminale:

Codice:
minikube dashboard



2. Creare un Deployment

Anticipiamo che nell'applicazione che stiamo andando a creare si utilizza un singolo pods, esso è gestito da un Deployment che ha lo scopo di soddisfare le richieste del pods, gestire la tolleranza ai malfunzionamenti e allo scaling dell'applicazione.

1. Per creare un deployment basta eseguire il comando:

Codice:
kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4

2. Visualizza il deployment:

Codice:
kubectl get deployments

Se il comando è andato a buon fine si otterrà il seguente output:

Codice:
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           1m

4. Visualizzato il Pod creato dal Deployment:

Codice:
kubectl get pods

5. Visualizza gli eventi del cluster Kubernetes:

Codice:
kubectl get events

L' output che si visualizzerà è uguale a:

Codice:
LAST SEEN   TYPE     REASON                    OBJECT                             MESSAGE
13s         Normal   Scheduled                 pod/hello-node-7dc7987866-c4rlj    Successfully assigned default/hello-node-7dc7987866-c4rlj to minikube
12s         Normal   Pulling                   pod/hello-node-7dc7987866-c4rlj    Pulling image "k8s.gcr.io/echoserver:1.4"
11s         Normal   Pulled                    pod/hello-node-7dc7987866-c4rlj    Successfully pulled image "k8s.gcr.io/echoserver:1.4"
11s         Normal   Created                   pod/hello-node-7dc7987866-c4rlj    Created container echoserver
11s         Normal   Started                   pod/hello-node-7dc7987866-c4rlj    Started container echoserver
13s         Normal   SuccessfulCreate          replicaset/hello-node-7dc7987866   Created pod: hello-node-7dc7987866-c4rlj
13s         Normal   ScalingReplicaSet         deployment/hello-node              Scaled up replica set hello-node-7dc7987866 to 1
3m8s        Normal   NodeHasSufficientMemory   node/minikube                      Node minikube status is now: NodeHasSufficientMemory
3m8s        Normal   NodeHasNoDiskPressure     node/minikube                      Node minikube status is now: NodeHasNoDiskPressure
3m9s        Normal   NodeHasSufficientPID      node/minikube                      Node minikube status is now: NodeHasSufficientPID
2m55s       Normal   Starting                  node/minikube                      Starting kubelet.
2m55s       Normal   NodeHasSufficientMemory   node/minikube                      Node minikube status is now: NodeHasSufficientMemory
2m55s       Normal   NodeHasNoDiskPressure     node/minikube                      Node minikube status is now: NodeHasNoDiskPressure
2m55s       Normal   NodeHasSufficientPID      node/minikube                      Node minikube status is now: NodeHasSufficientPID
2m55s       Normal   NodeAllocatableEnforced   node/minikube                      Updated Node Allocatable limit across pods
2m52s       Normal   RegisteredNode            node/minikube                      Node minikube event: Registered Node minikube in Controller
2m50s       Normal   Starting                  node/minikube                      Starting kube-proxy.
2m45s       Normal   NodeReady                 node/minikube                      Node minikube status is now: NodeReady

6. Se si vuole visualizzare il file di configurazione di kubectl:

Codice:
kubectl config view

Si otterrà in echo il documento:

Codice:
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /root/.minikube/ca.crt
    server: https://172.17.0.50:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /root/.minikube/client.crt
    client-key: /root/.minikube/client.key



3. Creare un Service

Con le impostazioni di default, un Pod è accessibile solamente dagli indirizzi IP interni al Kubernetes cluster. Per far si che il Container hello-node sia accessibile dall'esterno del Kubernetes virtual network, è necessario esporre il Pod utilizzando un Kubernetes Service.

1. Esponi il Pod su internet untilizzando il comando kubectl expose:

Codice:
kubectl expose deployment hello-node --type=LoadBalancer --port=8080

Il flag --type=LoadBalancer indica l'esposizione del Service all'esterno del Kubernetes Cluster, questo ci fa capire che dalla configurazione possiamo definire non solo lo scope dell'applicazione ma anche in che modo esso viene esposto.
Inoltro, esporre il Service all'esterno del Kubernetes cluster.

2. Visualizza il Servizio appena creato:

Codice:
kubectl get services

Ciò che si riceverà in output è il seguente:

Codice:
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.108.144.78   <pending>     8080:30369/TCP   21s
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          23m

Kubernetes in genere lavora su cloud providers che supportano i servizi basati su load balancers. Viene fornito un indirizzo IP pubblico per l'accesso al Service su cui è basata la comunicazione logica di Kubernetes. Su MiniKube, il service di tipo LoadBalancer rende il service accessibile tramite minikube al comando minikube service.

3. Eseguire il comando:

Codice:
minikube service hello-node

Questo comando fa visualizzare una scheda di rete in cui si ha la visualizzazione delle richieste ricevute dall'applicazione. Ricordiamo che la porta è uguale a quella visualizzata nell'output di kubectl get services per la porta TCP legata alla 8080.

Nella pagina browser che comparirà in seguito all'invio del comando sopra descritto, se ne visualizzerà una di tipo html contenente un contenuto simile a quello sottostante:

Codice:
CLIENT VALUES:
client_address=172.18.0.1
command=GET
real path=/
query=nil
request_version=1.1
request_uri=myrequest_uri

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding=gzip
accept-language=en-GB,en;q=0.9
dnt=1
host=myhost
referer=myreferer
sec-fetch-dest=document
sec-fetch-mode=navigate
sec-fetch-site=same-site
sec-fetch-user=?1
upgrade-insecure-requests=1
user-agent=myuser-agent
via=1.1 google
x-client-data=CgTHzpsV
x-cloud-trace-context=5e66b48a6a42a05c09a2eed2f5500984/13803785842611108158
x-forwarded-for=5.170.75.25, 35.201.124.219, 130.211.2.252, 35.198.154.152, 172.17.0.11
x-forwarded-proto=https
x-katacoda-host=ollie07
x-real-ip=myip
BODY:
-no body in request-

Abbiamo cosi avviato il nostro hello-node andando a visualizzarne l'output su una pagina web! Ovviamente ciò che abbiamo fatto è definire una request



4. Reset dell'ambiente

1. Per ritornare ad un sistema pulito, basta eseguire i seguenti comandi:

Codice:
kubectl delete service hello-node
kubectl delete deployment hello-node


2. Fermare MiniKube:

Codice:
minikube stop


3. Cancellare la VM di MiniKube

Codice:
minikube delete


NOTA: Se si vuole, è possibile eseguire lo stesso tutorial anche da Kataconda, come descritto anche nella documentazione ufficiale.

Fonti:
https://kubernetes.io/docs/home/