Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Kubernetes, realizzare un'applicazione: il data layer

Ora che abbiamo approfondito tutte le funzionalità principali di Kubernetes, utilizziamole per realizzare un'applicazione Web
Ora che abbiamo approfondito tutte le funzionalità principali di Kubernetes, utilizziamole per realizzare un'applicazione Web
Link copiato negli appunti

Dopo aver studiato molto riguardo Kubernetes ed aver appreso tutti i principi fondamentali della sua architettura è il momento di mettere questa conoscenza al lavoro creando un'applicazione.

Struttura dell'applicazione e tecnologie utilizzate

Ci dedicheremo ad un'applicazione Web composta da due strati:

  • un data layer che si occuperà della gestione dei dati basandosi su un database;
  • un'applicazione lato server, accessibile agli utenti, che si relazionerà con il database.

Tale struttura potrebbe essere stratificata ulteriormente, trattandosi della struttura minimale che può essere utilizzata. Tuttavia non siamo particolarmente interessati a realizzare un software complesso, ragioneremo invece sull'organizzazione da stabilire, sulle componenti di Kubernetes da scegliere e soprattutto sulla velocità con cui questa piattaforma mette in condizione di implementare operatività e comunicazione.

Inoltre noi, in questo caso, scegliamo di utilizzare il linguaggio di sviluppo PHP ed il database MySQL ma tutti i principi che richiameremo e gli approcci che sposeremo potranno essere adottati per qualsiasi altra tecnologia si voglia coinvolgere.

Definizione dei servizi

Rifacendoci all'architettura a microservizi, la nostra applicazione sarà imperniata su due servizi che andranno a costituire i layer di cui abbiamo parlato. Sarà proprio questo il momento in cui risulterà evidente come mai la componente di Kubernetes che offre connettività in rete prende proprio il nome di Service!

Entrambi gli strati saranno pertanto costituiti da:

  • una componente Deployment che gestirà la struttura della parte operativa attivando i Pod, gestendone il ciclo di vita e curandone il versionamento;
  • un'altra componente - un Service - che svolgerà il ruolo di connettore per i Pod retrostanti verso il resto dell'applicazione.

Per prima cosa, creeremo il data layer.

La gestione dei dati

Il database che utilizzeremo sarà basato su MySQL, pertanto avremo a che fare con uno dei protagonisti del settore del data storage. Avremo quindi a disposizione immagini Docker già pronte tra cui scegliere in base a versione e piattaforma di riferimento.

Supponiamo di aver scelto la versione 5.6 di MySQL, disponibile in DockerHub. Le problematiche principali che vanno gestite con un database sono:

  • memorizzazione persistente dei dati. Per questo, ci affideremo ai Volume di cui abbiamo studiato un'implementazione di base che può fare al caso nostro. Ciò sebbene ve ne siano altre più avanzate che si scopriranno andando avanti con l'approfondimento;
  • gestione della password, possibilmente impiegando i Secret. Anche in questo caso ci rifaremo ad argomenti che abbiamo approfondito nel corso della guida.

Diamo ora uno sguardo al codice che abbiamo scelto di usare (file data-layer.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: data-layer-deployment
spec:
  selector:
    matchLabels:
      app: mysqlsrv
  template:
    metadata:
      labels:
        app: mysqlsrv
    spec:
      containers:
        - name: mysql-server
          image: mysql:5.6
          env:
          - name: MYSQL_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                name: passwd-secret
                key: password
          volumeMounts:
            - name: data-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: data-storage
          hostPath:
             path: /datastorage
---
apiVersion: v1
kind: Service
metadata:
  name: data-layer-service
spec:
  ports:
  - port: 3306
  selector:
    app: mysqlsrv

Prima di avviarlo creiamo un Secret per conservare la password che nel nostro caso sarà "topolino" (ovviamente, si tratta solo di un esempio: cercate sempre di scegliere password che rispecchino i migliori standard di sicurezza):

$ kubectl create secret generic \
       passwd-secret --from-literal=password=topolino

e successivamente avviamo il nostro data layer:

kubectl apply -f data-layer.yaml

Fatto questo potremo verificare di avere Pod, Deployment e Service tutti in esecuzione:

$ kubectl get pods
NAME                                     READY   STATUS    RESTARTS   AGE
data-layer-deployment-7bfb95674b-hc29d   1/1     Running   0          2m
$ kubectl get deploy
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
data-layer-deployment   1/1     1            1           2m
$ kubectl get svc
NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
data-layer-service   ClusterIP      10.105.77.39      <none>     3306/TCP         2m26s
kubernetes           ClusterIP      10.96.0.1         <none>     443/TCP          16m

I dati per il test

La nostra sperimentazione principale consisterà nell'entrare nel Pod e creare alcuni dati di prova, non necessariamente finalizzati all'applicazione ma solo a scopo di test per il nostro database.
Puntiamo pertanto al Pod a disposizione invocando il client MySQL che vi è all'interno:

$ kubectl exec -it data-layer-deployment-7bfb95674b-xppqq -- mysql -u root -p
Enter password:
...
...
mysql> CREATE DATABASE scuola;
Query OK, 1 row affected (0.00 sec)
mysql> USE scuola;
Database changed
mysql> CREATE TABLE allievi(
    -> nome varchar(50),
    -> cognome varchar(50),
    -> classe int)
    -> ;
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO allievi (nome, cognome, classe) VALUES ('Silvia','Rossi',25);
Query OK, 1 row affected (0.01 sec)

Come possiamo notare, il server MySQL è operativo. Infatti abbiamo potuto creare un database, una tabella ed un record. Ora non ci resta che predisporre un'applicazione che lo sfrutti per poi ottimizzare il tutto.

Ti consigliamo anche