Un Esercizio Completo

Progetto

Exprog

Preparazione

Sulla macchina host:

Scaricare le immagini mongo e mongo-express e porle nel registry locale:

docker pull mongo
docker pull mongo-express
docker tag mongo localhost:5000/mongo
docker push localhost:5000/mongo
docker tag mongo-express localhost:5000/mongo-express
docker push localhost:5000/mongo-express

Avere le immagini nel registry locale velocizza le operazioni di creazione dei pod

1. Deployment del Database mongo

Editare il manifest ~/scripts/mongodb-deployment.yml

vim ~/scripts/mongodb-deployment.yml
apiVersion: apps/v1
kind: Deployment          
metadata:                 
  name: mongodb-deployment
  labels:       
    app: mongodb
spec:             
  replicas: 1   
  selector:       
    matchLabels:  
      app: mongodb  
  template:  
    metadata:       
      labels:        
        app: mongodb
    spec:           
      containers:   
      - name: mongodb
        image: localhost:5000/mongo
        ports:                       
        - containerPort: 27017
        env:                       
        - name: MONGO_INITDB_ROOT_USERNAME
          value: username                 
        - name: MONGO_INITDB_ROOT_PASSWORD
          value: password

Creare il deployment e verificare:

kubectl create -f ~/scripts/mongodb-deployment.yml

kubectl get pods
NAME                                 READY   STATUS    RESTARTS   AGE
mongodb-deployment-f974c5bdd-b7dc8   1/1     Running   0          41s
kubectl get deployments
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
mongodb-deployment   1/1     1            1           46s

Non è bello avere username e password in chiaro. Creiamo un file di Secrets

2. Secrets

Stringhe Base64 per username e password:

echo -n 'username' | base64
dXNlcm5hbWU=
echo -n 'password' | base64
cGFzc3dvcmQ=

File di specifiche ~/scripts/mongodb-secret.yml:

vim ~/scripts/mongodb-secret.yml
apiVersion: v1
kind: Secret
metadata:
  name: mongodb-secret
type: Opaque
data:
  mongo-root-username: dXNlcm5hbWU=
  mongo-root-password: cGFzc3dvcmQ=

Secrfile

Creazione del secret:

kubectl apply -f ~/scripts/mongodb-secret.yml

Modifica a ~/scripts/mongodb-deployment.yml:

     ......
        env:                       
        - name: MONGO_INITDB_ROOT_USERNAME
          valueFrom: 
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-username                 
        - name: MONGO_INITDB_ROOT_PASSWORD
          valueFrom: 
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-password

Secrmod

Applicare i cambiamenti:

kubectl delete -f ~/scripts/mongodb-deployment.yml
kubectl create -f ~/scripts/mongodb-deployment.yml

Non si può fare un apply perchè value e valueFrom non possono esistere simultaneamente

3. Servizio per mongodb

File di manifest ~/scripts/mongodb-service.yml:

vim ~/scripts/mongodb-service.yml
apiVersion: v1
kind: Service
metadata:
  name: mongodb-service
spec:
  selector:
    app: mongodb
  ports:
    - protocol: TCP
      port: 27017
      targetPort: 27017

Creare il servizio:

kubectl create -f ~/scripts/mongodb-service.yml

Verificare:

kubectl get services
kubectl describe service mongodb-service

4. Configmap per mongo-express

File di specifiche ~/scripts/mongodb-configmap.yml:

vim ~/scripts/mongodb-configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mongodb-configmap
data:
  database_url: mongodb-service

Creazione del ConfigMap:

kubectl create -f ~/scripts/mongodb-configmap.yml

5. Deployment per mongo-express

File di manifest ~/scripts/mongo-express-deployment.yml:

vim ~/scripts/mongo-express-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-express-deployment
  labels:
    app: mongo-express
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo-express
  template:
    metadata:
      labels:
        app: mongo-express
    spec:
      containers:
      - name: mongo-express
        image: localhost:5000/mongo-express
        ports:
        - containerPort: 8081
        env:
        - name: ME_CONFIG_BASICAUTH_USERNAME
          value: admin
        - name: ME_CONFIG_BASICAUTH_PASSWORD
          value: admin                              
        - name: ME_CONFIG_MONGODB_ADMINUSERNAME
          valueFrom:                           
            secretKeyRef:                      
              name: mongodb-secret             
              key: mongo-root-username         
        - name: ME_CONFIG_MONGODB_ADMINPASSWORD
          valueFrom:                           
            secretKeyRef:                      
              name: mongodb-secret             
              key: mongo-root-password         
        - name: ME_CONFIG_MONGODB_SERVER       
          valueFrom:                           
            configMapKeyRef:                   
              name: mongodb-configmap          
              key: database_url

Mongodb-express ultima versione è dotato anche di un'autenticazione di accesso Basic, per cui occorrono configurare le due variabili d'ambiente:

        - name: ME_CONFIG_BASICAUTH_USERNAME
          value: admin
        - name: ME_CONFIG_BASICAUTH_PASSWORD
          value: admin

Creare il deployment:

kubectl create -f ~/scripts/mongo-express-deployment.yml

6. Servizio per mongo-express

File di definizione ~/scripts/mongo-express-service.yml:

vim ~/scripts/mongo-express-service.yml
apiVersion: v1
kind: Service
metadata:
  name: mongo-express-service
spec:
  selector:
    app: mongo-express
  ports:
    - protocol: TCP
      port: 8081
      targetPort: 8081

Creare il servizio:

kubectl create -f ~/scripts/mongo-express-service.yml

Verificare:

kubectl get services
kubectl describe service mongo-express-service

7. Servizio esterno

Editare la configurazione del servizio ~/scripts/mongo-express-service.yml:

vim ~/scripts/mongo-express-service.yml
apiVersion: v1
kind: Service
metadata:
  name: mongo-express-service
spec:
  selector:
    app: mongo-express
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 8081
      targetPort: 8081
      nodePort: 30000

Applicare i cambiamenti:

kubectl apply -f ~/scripts/mongo-express-service.yml

Accesso al servizio``

Vedere l’indirizzo del servizio:

kubectl get service
NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
kubernetes              ClusterIP      10.96.0.1       <none>           443/TCP          45m
mongo-express-service   LoadBalancer   10.96.193.136   172.18.255.200   8081:30000/TCP   4s
mongodb-service         ClusterIP      10.96.237.220   <none>           27017/TCP        16m

Dal browser sullo host connettersi a: 172.18.255.200:8081

Sommario

Il LoadBalancer Metallb è attivo.

Sequenza di comandi per il nostro applicativo:

kubectl create -f ~/scripts/mongodb-secret.yml
kubectl create -f ~/scripts/mongodb-deployment.yml
kubectl create -f ~/scripts/mongodb-service.yml
kubectl create -f ~/scripts/mongodb-configmap.yml
kubectl create -f ~/scripts/mongo-express-deployment.yml
kubectl create -f ~/scripts/mongo-express-service.yml

Conviene creare due procedure shell per il setup e il teardown del nostro applicativo mongo.

vim ~/scripts/mongo-setup.sh
kubectl apply -f ~/scripts/mongodb-secret.yml
kubectl apply -f ~/scripts/mongodb-deployment.yml
kubectl apply -f ~/scripts/mongodb-service.yml
kubectl apply -f ~/scripts/mongodb-configmap.yml
kubectl apply -f ~/scripts/mongo-express-deployment.yml
kubectl apply -f ~/scripts/mongo-express-service.yml
echo "App mongo created"
vim ~/scripts/mongo-teardown.sh
kubectl delete -f ~/scripts/mongo-express-service.yml
kubectl delete -f ~/scripts/mongo-express-deployment.yml
kubectl delete -f ~/scripts/mongodb-configmap.yml
kubectl delete -f ~/scripts/mongodb-service.yml
kubectl delete -f ~/scripts/mongodb-deployment.yml
kubectl delete -f ~/scripts/mongodb-secret.yml
echo "App mongo deleted"
chmod +x ~/scripts/mongo-setup.sh ~/scripts/mongo-teardown.sh