Despliegue de una aplicación con kubeadm.

Realiza el despliegue de una aplicación en kubernetes sobre la instalación que hemos hecho en clase con kubeadm o cualquier otra que consideres oportuna. Características que debe tener:

  • Aplicación microservicios
  • Varias réplicas
  • Utilice volúmenes para almacenamiento permanente
  • Sea accesible utilizando DNS, en lugar de IP
  • Opcionalmente utilice balanceador de carga del proveedor de cloud

La aplicación desplegada será wordpress, teniendo en cuenta que no es una aplicación microservicios.

Los equipos utlizados son:

  • gru: nodo controlador
    • 172.22.200.101
    • 2 GiB de RAM
  • stuart: “minion”
    • 172.22.200.103
    • 1 GiB de RAM
  • bob: “minion”
    • 172.22.200.105
    • 1 GiB de RAM
  • Todos los equipos corren Ubuntu 16.04

Para la instalación he hecho los pasos descritos en el post de introducción a kubernetes.

En este caso, la línea para conectar los nodos sería:

sudo kubeadm join --token 5f292b.cedd5a25d253c77d 10.0.0.9:6443 --discovery-token-ca-cert-hash sha256:a312a17c8b7f5192a852e1271bcee80fb556d6bcf975d14a218bd63ae7fb6136

Una vez instalado, configuramos los nodos para desplegar nuestra aplicación.

CREACIÓN DE VOLÚMENES

Para poder usar la aplicación con volúmenes persistentes, hay que definirlos previamente. Con el fichero volumes.yml se crearán dos volúmenes en los  directorios /k8/volume/pv-1 y /k8/volume/pv-2

Para crearlo:

sudo kubectl apply -f volumes.yml

Comprobamos que están creados:

ubuntu@gru:~$ kubectl get pv
NAME       CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM                 STORAGECLASS REASON AGE
local-pv-1 10Gi     RWO          Retain         Bound  default/wp-pv-claim                       7m
local-pv-2 10Gi     RWO          Retain         Bound  default/mysql-pv-claim                    7m

CONFIGURACIÓN DE MYSQL

Primero necesitamos una clave para mysql:

kubectl create secret generic mysql-pass --from-literal=password=ROOT_PASSWORD

Vemos que está creada:

ubuntu@gru:~$ kubectl get secrets
NAME                  TYPE                                 DATA   AGE
default-token-86fgg   kubernetes.io/service-account-token  3      22h
mysql-pass            Opaque                               1      1h

Creamos el fichero mysql.yml para desplegar la base de datos con un volumen y la clave antes creada.

Y desplegamos:

sudo kubectl create -f mysql.yml

 

Comprobamos el estado con:

ubuntu@gru:~$ kubectl get pods
NAME                             READY STATUS  RESTARTS AGE
wordpress-mysql-58cf8dc9f9-sgbdc 1/1   Running 0        14m

CONFIGURACIÓN DE WORDPRESS

Creamos el fichero wordpress.yml con los datos del despliegue.

Ejecutamos:

sudo kubectl apply -f wordpress.yml

Y comprobamos el estado:

ubuntu@gru:~$ kubectl get pods
NAME                             READY STATUS   RESTARTS  AGE
wordpress-b9cf79f9d-8jfpt        1/1   Running  0         17m
wordpress-mysql-58cf8dc9f9-sgbdc 1/1   Running  0         17m

RÉPLICAS

En los ficheros anteriores, la siguiente línea hace que pasemos de tener 1 solo pod, tengamos 3 (se pueden poner tantos como nos permitan los recursos), asegurando así el funcionamiento de la aplicación.

replicas: 2

Y obetenemos los siguientes pods:

ubuntu@gru:~$ kubectl get pods
NAME                               READY   STATUS   RESTARTS  AGE
wordpress-b9cf79f9d-5vs5p          1/1     Running  0         1h
wordpress-b9cf79f9d-frqwt          1/1     Running  0         1h
wordpress-mysql-58cf8dc9f9-fdkqz   1/1     Running  0         59m

Para acceder nos vamos a la url

http://172.22.200.105:30000

Con estos pasos ya tenemos desplegado un wordpress con kubernetes con volúmenes persistentes y réplicas.1.png

COMANDOS ÚTILES

Para ver información más detallada de los pods, ver en qué nodo se están ejecutando o el estado de una forma más completa:

ubuntu@gru:~$ kubectl describe pods
Name: wordpress-b9cf79f9d-5vs5p
Namespace: default
Node: bob/10.0.0.5
Start Time: Wed, 07 Mar 2018 08:35:02 +0000
Labels: app=wordpress
 pod-template-hash=657935958
 tier=frontend
Annotations: <none>
Status: Running
IP: 192.168.148.211
Controlled By: ReplicaSet/wordpress-b9cf79f9d
Containers:
 wordpress:
 Container ID: docker://fcfd21cbdb2d06cc45c2c4c8abbe0d29cdbe15d07c27246170255f57d301722d
 Image: buddy/wordpress:latest
 Image ID: docker-pullable://buddy/wordpress@sha256:72588c22236f387f6a11f2a485d45e1280570d1d857518c0c03744e80b813620
 Port: 80/TCP
 State: Running
 Started: Wed, 07 Mar 2018 08:39:38 +0000
 Ready: True
 Restart Count: 0
 Environment:
 WORDPRESS_DB_HOST: wordpress-mysql
 WORDPRESS_DB_PASSWORD: <set to the key 'password' in secret 'mysql-pass'> Optional: false
 Mounts:
 /var/run/secrets/kubernetes.io/serviceaccount from default-token-86fgg (ro)
 /var/www/html from wordpress-persistent-storage (rw)
Conditions:
 Type Status
 Initialized True 
 Ready True 
 PodScheduled True 
Volumes:
 wordpress-persistent-storage:
 Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
 ClaimName: wp-pv-claim
 ReadOnly: false
 default-token-86fgg:
 Type: Secret (a volume populated by a Secret)
 SecretName: default-token-86fgg
 Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
 node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>




Name: wordpress-b9cf79f9d-frqwt
Namespace: default
Node: stuart/10.0.0.7
Start Time: Wed, 07 Mar 2018 08:35:02 +0000
Labels: app=wordpress
 pod-template-hash=657935958
 tier=frontend
Annotations: <none>
Status: Running
IP: 192.168.15.210
Controlled By: ReplicaSet/wordpress-b9cf79f9d
Containers:
 wordpress:
 Container ID: docker://f6994ed94b249ad95c351c19434a0e0eddd53790c6a6260af7941bfba6ae2d72
 Image: buddy/wordpress:latest
 Image ID: docker-pullable://buddy/wordpress@sha256:72588c22236f387f6a11f2a485d45e1280570d1d857518c0c03744e80b813620
 Port: 80/TCP
 State: Running
 Started: Wed, 07 Mar 2018 08:39:24 +0000
 Ready: True
 Restart Count: 0
 Environment:
 WORDPRESS_DB_HOST: wordpress-mysql
 WORDPRESS_DB_PASSWORD: <set to the key 'password' in secret 'mysql-pass'> Optional: false
 Mounts:
 /var/run/secrets/kubernetes.io/serviceaccount from default-token-86fgg (ro)
 /var/www/html from wordpress-persistent-storage (rw)
Conditions:
 Type Status
 Initialized True 
 Ready True 
 PodScheduled True 
Volumes:
 wordpress-persistent-storage:
 Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
 ClaimName: wp-pv-claim
 ReadOnly: false
 default-token-86fgg:
 Type: Secret (a volume populated by a Secret)
 SecretName: default-token-86fgg
 Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
 node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>




Name: wordpress-mysql-58cf8dc9f9-fdkqz
Namespace: default
Node: stuart/10.0.0.7
Start Time: Wed, 07 Mar 2018 08:36:21 +0000
Labels: app=wordpress
 pod-template-hash=1479487595
 tier=mysql
Annotations: <none>
Status: Running
IP: 192.168.15.209
Controlled By: ReplicaSet/wordpress-mysql-58cf8dc9f9
Containers:
 mysql:
 Container ID: docker://af78c670958c6c9ced35e4be060563893255f04d89341a125d2efe9c6e9efb8e
 Image: mysql:5.6
 Image ID: docker-pullable://mysql@sha256:ed2bb560e3188817a3c838ce50e5ac9af520e046d660747dfa6fd15296f1a911
 Port: 3306/TCP
 State: Running
 Started: Wed, 07 Mar 2018 08:39:22 +0000
 Ready: True
 Restart Count: 0
 Environment:
 MYSQL_ROOT_PASSWORD: <set to the key 'password' in secret 'mysql-pass'> Optional: false
 Mounts:
 /var/lib/mysql from mysql-persistent-storage (rw)
 /var/run/secrets/kubernetes.io/serviceaccount from default-token-86fgg (ro)
Conditions:
 Type Status
 Initialized True 
 Ready True 
 PodScheduled True 
Volumes:
 mysql-persistent-storage:
 Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
 ClaimName: mysql-pv-claim
 ReadOnly: false
 default-token-86fgg:
 Type: Secret (a volume populated by a Secret)
 SecretName: default-token-86fgg
 Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
 node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>

Si queremos ver esta información de un solo pod:

ubuntu@gru:~$ kubectl get pods
NAME                              READY  STATUS   RESTARTS  AGE
wordpress-b9cf79f9d-5vs5p         1/1    Running  0         1h
wordpress-b9cf79f9d-frqwt         1/1    Running  0         1h
wordpress-mysql-58cf8dc9f9-fdkqz  1/1    Running  0         1h

ubuntu@gru:~$ kubectl describe pods wordpress-b9cf79f9d-frqwt
Name: wordpress-b9cf79f9d-frqwt
Namespace: default
Node: stuart/10.0.0.7
Start Time: Wed, 07 Mar 2018 08:35:02 +0000
Labels: app=wordpress
 pod-template-hash=657935958
 tier=frontend
Annotations: <none>
Status: Running
IP: 192.168.15.210
Controlled By: ReplicaSet/wordpress-b9cf79f9d
Containers:
 wordpress:
 Container ID: docker://f6994ed94b249ad95c351c19434a0e0eddd53790c6a6260af7941bfba6ae2d72
 Image: buddy/wordpress:latest
 Image ID: docker-pullable://buddy/wordpress@sha256:72588c22236f387f6a11f2a485d45e1280570d1d857518c0c03744e80b813620
 Port: 80/TCP
 State: Running
 Started: Wed, 07 Mar 2018 08:39:24 +0000
 Ready: True
 Restart Count: 0
 Environment:
 WORDPRESS_DB_HOST: wordpress-mysql
 WORDPRESS_DB_PASSWORD: <set to the key 'password' in secret 'mysql-pass'> Optional: false
 Mounts:
 /var/run/secrets/kubernetes.io/serviceaccount from default-token-86fgg (ro)
 /var/www/html from wordpress-persistent-storage (rw)
Conditions:
 Type Status
 Initialized True 
 Ready True 
 PodScheduled True 
Volumes:
 wordpress-persistent-storage:
 Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
 ClaimName: wp-pv-claim
 ReadOnly: false
 default-token-86fgg:
 Type: Secret (a volume populated by a Secret)
 SecretName: default-token-86fgg
 Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
 node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>

Si queremos eliminar todo lo que hemos desplegado con el fichero yaml:

sudo kubectl delete -f fichero.yml

Si cambiamos algo en el fichero, en vez de create, ponemos apply:

sudo kubectl apply -f fichero.yml

https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/

https://buddy.works/guides/how-run-wordpress-on-kubernetes#configure-the-docker-file

https://www.mirantis.com/blog/introduction-to-yaml-creating-a-kubernetes-deployment/

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s