Curso Kubernetes CodeURJC PDF
Curso Kubernetes CodeURJC PDF
Software
Consultoría
Formación Master en
Cloud Computing
Desarrollo y Despliegue de
Distributed Systems Aplicaciones en la Nube
Web Technologies
Extreme Programming
Testing / Git / Jenkins
Online / Clases en directo
Software Architectures
Septiembre 2019
Concurrent Programming
http://codeurjc.es https://www.codeurjc.es/mastercloudapps/
Micael Gallego Patxi Gortázar Federico Díaz
[email protected] [email protected] [email protected]
@micael_gallego @fgortazar @nordri
3
Docker
6
Docker
7
Docker
•¿Qué son los contenedores Docker?
– Son aplicaciones empaquetadas con todas
sus dependencias
– Se pueden ejecutar en cualquier entorno
(linux, windows, mac)
– Se descargan de forma automática si no
están disponibles en el sistema
– Sólo es necesario tener instalado Docker
8
Docker
•Tipos de aplicaciones:
– Servicios de red
●
web, bbdd, colas de mensajes, cachés,
etc.
– Línea de comandos
●
compiladores, conversores de vídeo,
generadores de informes…
9
Docker
11
Conceptos
●
Imagen docker
●
Plantilla para un contenedor
●
Contiene las herramientas del SO (ubuntu, alpine),
librerías (Java) and la aplicación en sí (webapp.jar)
●
Un contenedor siempre se inicia desde una imagen
●
Si se quiere arrancar un contenedor partiendo de una
imagen que no está disponible, se descarga
automáticamente de un registro
12
Conceptos
•Docker Registry
●
Servicio remoto para subir y descargar imágenes
●
Puede guardar varias versiones (tags) de la misma
imagen
●
Las versiones de una misma imagen se almacenan
en un mismo repositorio (como Git)
●
Docker Hub es un registro público y gratuito
●
Tu puedes tener tu repositorio privado
13
Conceptos
•Algunos repositorios de DocekerHub
14
Conceptos Docker
•Contenedor Docker
●
Representa la aplicación en ejecución
●
Un contenedor se crea desde una imagen
●
Si la aplicación escribe un fichero, el fichero
queda dentro del contenedor, no se modifica
la imagen
●
Los contenedores se pueden
arrancar, pausar y parar
15
Conceptos Docker
•Docker Engine
– Servicio local usado para gestionar docker
– Gestiona las imágenes (descarga, creación,
subida, etc...)
– Gestiona los contenedores (arranque,
parada, etc..)
– Se utiliza desde el cliente docker por línea
de comandos o a través de una API REST 16
Conceptos Docker
•Docker client
– Command line interface
(CLI) herramienta por línea
de comandos para
controlar el docker engine
– Está disponible al instalar
Docker
17
Ejecución de contenedores
Ejecutar “hello-world”
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
03f4658f8b78: Pull complete
a3ed95caeb02: Pull complete
Digest:
sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc
1ca36966a7
Status: Downloaded newer image for hello-world:latest
La segunda vez se
usa la vez la imagen
se descarga
19
Imágenes docker
● Para ejecutar un contenedor es necesario tener
una imagen en la máquina
● Las imágenes se descargan de un docker
registry (registro)
● Cada registro tiene un repositorio por cada
imagen con múltiples versiones (tags)
● DockerHub es un registro gratuito en el que
cualquiera puede subir imágenes públicas
20
Imágenes docker
● DockerHub
21
Servicios de red
● Servidor web en un contenedor
22
Servicios de red
● Servidor web en un contenedor
--name static-site
23
Servicios de red
●
Servidor web en un contenedor
docker run --name static-site \
-e AUTHOR="Your Name" -d \
-p 9000:80 seqvence/static-site
-e AUTHOR="Your Name"
-d
-p 9000:80
27
Gestión de contenedores
● Contenedores en ejecución
$ docker ps
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS NAMES
a7a0e504ca3e seqvence/static-site "/bin/sh -c 'cd /usr/"
28 seconds ago Up 26 seconds
Container id es STATUS es UP
a7a0e504ca3e
Este id se usa para
referirte al contenedor
28
Gestión de contenedores
● Logs
● Obtener la salida estándar de un contenedor
29
Gestión de contenedores
● Parar y borrar contenedores
● Parar un contenedor en ejecución
$ docker rm a7a0e504ca3e
30
Servicios en producción
• Funcionalidades deseables
●
Asistencia en el despliegue y en la actualización
●
Reinicio si el servicio finaliza o no responde a las peticiones
(resiliencia)
●
Uso de más recursos hardware la carga aumenta
(escalabilidad)
●
Aprovechamiento de recursos hardware compartiendo pero
sin interferencias (multitenancy)
●
Gestión de configuraciones y secretos
●
Monitorización
Servicios en producción
• Existen diversas formas de desplegar servicios
en contenedores en producción
– Ejecución manual de contenedores en una
máquina (física o virtual)
– Instalación de un orquestador de contenedores
en un cluster de VMs
– Uso de servicios de orquestación ofrecidos por el
proveedor cloud
Servicios en producción
• Orquestadores de contenedores
– Ofrecen estas funcionalidades para desplegar
servicios en contenedores
– Gestionan cluster de nodos ofreciendo un control
uniforme
– Gestionan varios contenedores como una única
unidad lógica (aplicación)
– Varias aplicaciones se pueden desplegar en un
mismo cluster y se reparten los recursos sin
interferencias
Servicios en producción
• Orquestadores de contenedores
Kubernetes
● Desarrollado inicialmente por Google (basado en
Borg)
● Es muy maduro y existen muchas aplicaciones en
http://kubernetes.io/ https://www.cncf.io/
https://www.cncf.io/about/members/
Kubernetes
● Es un software diferente a docker que tiene que
instalarse por separado
● Usa docker internamente, pero también puede
kubectl Internet
Cliente Kubernetes
● Kubectl
● Es una tool de línea de comandos (CLI) local para controlar un
cluster Kubernetes
● Está implementada en Go, no es necesario ningún runtime o
VM para que se pueda ejecutar
● Conceptualmente es como la línea de comandos de docker,
pero las opciones son muy diferentes
● Instalación
https://kubernetes.io/docs/user-guide/prereqs/
Kubernetes en local
● Para desarrollo se puede instalar en local
● Minikube (un nodo)
● Kube-spawn (múltiples nodos)
● Docker for Windows y Mac
Kubernetes en local
● Minikube
● Una versión básica de Kubernetes para instalar en una
máquina de desarrollo
● Funciona en linux, windows y mac
● Tiene un único nodo virtualizado con VirtualBox (se
puede usar otro hypervisor)
https://github.com/kubernetes/minikube
Kubernetes en local
● Minikube
● Instalación
https://github.com/kubernetes/minikube/releases
https://cloud.google.com/kubernetes-engine/
https://www.openshift.com/learn/topics/kubernetes/
https://aws.amazon.com/es/eks/ https://azure.microsoft.com/services/container-service/
Kubernetes en producción
● También se puede instalar en clusters físicos o en
máquinas virtuales (OpenStack, VMWare...)
Kubernetes en AWS
● AWS ofrece el servicio AKS como un
Kubernetes gestionado
https://aws.amazon.com/es/eks/
Kubernetes en AWS
● AWS anunció su servicio Fargate para no pagar
por nodos, sino pagar por contenedores (no
disponible)
https://aws.amazon.com/es/fargate/
Kubernetes en AWS
● También se puede instalar Kubernetes en
instancias AWS
https://aws.amazon.com/es/quickst
art/architecture/heptio-kubernetes/ https://github.com/kubernetes/kops
Conceptos
● Pod:
● Unidad mínima de ejecución en Kubernetes
● Uno o más contenedores docker
● Pueden compartir volúmenes e IP
● Deployment:
● Ejecución de uno o varios pods del mismo tipo (réplicas)
● Control de salud de los pods y reinicio
● Servicio:
● Nombre para acceder a un deployment desde otros servicios
● Publicación del servicio para que sea accesible desde fuera del
cluster
https://kubernetes.io/docs/tutorials/kubernetes-basics/
https://kubernetes.io/docs/getting-started-guides/minikube/
Conceptos
● Deployment y Pods
● Un deployment es el responsable de mantener
ejecutándose uno o varios pods
● Se asume que los pods son long-lived, si un pod finaliza su
ejecución, el deployment es responsable de arrancarlo de
nuevo
● Cada uno de los pods de un deployment es llamado réplica
● El escalado de aplicaciones se consigue controlando el
número de réplicas
Kubernetes
● Deployment
● Despliegue de uno o varios réplicas de un pod
$ kubectl create deployment kubernetes-bootcamp \
--image=jocatalin/kubernetes-bootcamp:v1
● Consultar deployments
$ kubectl get deployments
● Borrar deployment
$ kubectl delete deployment kubernetes-bootcamp
Kubernetes
● Pod
● Un deployment inicia uno o más pod del mismo tipo
(réplicas)
● Los contenedores del pod pueden compartir volúmenes e
IP
● En un Pod puede haber un único contenedor
● Consulta de servicios
$ kubectl get services
● Información de un servicio concreto
$ kubectl describe services/kubernetes-bootcamp
● Borrado del servicio
$ kubectl delete service kubernetes-bootcamp
Kubernetes
● Servicios
● Acceso al servicio desde la máquina de desarrollo
● Comando minikube que abre un browser
$ minikube ip
192.168.99.100
$ kubectl get service kubernetes-bootcamp \
--output='jsonpath={.spec.ports[0].nodePort}'
32041
http://192.168.99.100:32041/
Kubernetes
● Servicios
Kubernetes
● Services
● Si usas NodePort:
● Podría acceder al puerto de cualquier nodo del cluster siempre que
lo permitan los grupos de seguridad
● De alguna forma habría que hacer el reparto de las peticiones
entre los nodos del cluster
● Si usas LoadBalancer:
● Se crea un LoadBalancer del proveedor cloud por cada servicio
http://a5ea04e2c633e11e896170afb7f57108-909932338.eu-west-1.elb.amazonaws.com:8080/
Kubernetes
Kubernetes
Ejercicio 1
● 1) Despliega en Kubernetes una aplicación web
“webgatos”
● Imagen: codeurjc/webgatos:v1
● Puerto: 5000
● Código de la aplicación:
https://github.com/codeurjc/Curso-Kubernetes/tree/master/ejemplo1/web-python
● 2) Crea un servicio para ella
● 3) Accede a ella desde el navegador web
Kubernetes
● Servicios
● Existen diferentes tipos de servicios con diferentes
técnicas de exportación
● Algunas sólo tienen sentido en un proveedor cloud
● Otras necesitan de un servidor DNS porque se accede por
nombre
https://kubernetes.io/docs/concepts/services-networking/service/
https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0
Kubernetes
● Tipos de servicios
● ClusterIP (por defecto)
● Expone el servicio en una IP virtual y nombre DNS usable
únicamente desde el cluster
● NodePort
● Expone el servicio en cada nodo del cluster usando su IP pública y
un puerto igual en todos los nodos
● Se crea automáticamente también un ClusterIP
Kubernetes
● Tipos de servicios
● LoadBalancer
● Crea un balanceador en el proveedor cloud para publicar el servicio
● Internamente se crea un NodePort y por tanto un ClusterIP
● En AWS se genera un nombre DNS para el servicio, en Google
Cloud se usa IP pública
● En Minikube se interpreta como NodePort
● ExternalName (No disponible en Minikube)
● Se usa para crear un nombre interno que apunta a un servicio
externo al cluster
Kubernetes
● Servicios
● Acceso al servicio desde otro pod
● Iniciamos un pod interactivo para poder ver su salida desde la
consola
/ # curl http://kubernetes-bootcamp:8080
Kubernetes
● Varias réplicas (pods)
● Desplegar varios contenedores permite escalar
horizontalmente porque cada contendor puede ejecutarse en
una máquina del cluster
● En el deployment se puede indicar el número de réplicas
$ kubectl create deployment kubernetes-bootcamp \
--image=jocatalin/kubernetes-bootcamp:v1
https://kubernetes.io/docs/concepts/services-networking/ingress/
Kubernetes
● Etiquetas
● En Kubernetes cada objeto puede tener un número
arbitrario de etiquetas.
● Estas etiquetas se usan para filtrar en cualquier tipo de
comando (listados, borrado, …)
$ kubectl get pods -l run=kubernetes-bootcamp
$ kubectl get services -l run=kubernetes-bootcamp
$ kubectl delete service -l run=kubernetes-bootcamp
https://www.mirantis.com/blog/introduction-to-yaml-creating-a-kubernetes-deployment/
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10
Kubernetes
$ kubectl create -f webgatos-minikube-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: webgatos-deploy
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: webgatos
replicas: 1 # tells deployment to run 1 pods matching the template
template: # create pods using pod definition in this template
metadata:
labels:
app: webgatos
spec:
containers:
- name: webgatos
image: codeurjc/webgatos:v1
ports:
- containerPort: 5000
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
https://github.com/codeurjc/Curso-Kubernetes/blob/master/ejemplo1/webgatos-minikube-deployment.yaml
Kubernetes
$ kubectl create -f webgatos-minikube-service.yaml
---
apiVersion: v1
kind: Service
metadata:
name: webgatos-service
labels:
app: webgatos
spec:
ports:
- port: 5000
protocol: TCP
name: webgatos-port
selector:
app: webgatos
type: NodePort
https://kubernetes.io/docs/concepts/services-networking/service/
https://github.com/codeurjc/Curso-Kubernetes/blob/master/ejemplo1/webgatos-minikube-service.yaml
Kubernetes
● Múltiples objetos en un fichero
● Podemos incluir varios objetos Kubernetes en un fichero
● Se copia el contenido completo de cada fichero (como
cada fichero comienza con tres guiones, sirve de
separador)
https://github.com/codeurjc/Curso-Kubernetes/blob/master/ejemplo1/webgatos-minikube.yaml
Kubernetes
● Configuración de pods con variables de entorno
● Se pueden poner valores directamente en el fichero de
deployment o usar ConfigMaps
...
spec:
containers:
- name: envar-demo-container
image: gcr.io/google-samples/node-hello:1.0
env:
- name: DEMO_GREETING
value: "Hello from the environment"
- name: DEMO_FAREWELL
value: "Such a sweet sorrow"
https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/
https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
Kubernetes
●
Aplicaciones con varios servicios
●
Kubernetes de forma nativa no tiene el concepto de
aplicaciones formadas por varios servicios
●
Se gestionan creando todos los objetos de la misma
aplicación (deployment, servicios…), posiblemente
asociados con el mismo valor en la label app para facilitar
su gestión
●
La herramienta Helm ofrece una gestión de aplicaciones,
su actualización y un repositorio
Ejercicio 3
● Despliega una aplicación de web de anuncios con
base de datos en Kubernetes
● Aplicación Web ● Base de datos:
● Imagen: codeurjc/java-webapp-bbdd:v2 ● Imagen: mysql:5.6
● Puerto: 8080 ● Puerto: 3306
● Variables de entorno: ● Nombre del servicio: db
● MYSQL_ROOT_PASSWORD = pass ● Variables de entorno
● MYSQL_DATABASE = test ● MYSQL_ROOT_PASSWORD=pass
● MYSQL_DATABASE=test
https://github.com/codeurjc/curso-docker/tree/master/java-webapp-bbdd-ejer
Ingress
● Una forma más avanzada de publicar servicios
● Varias aplicaciones http pueden compartir el mismo
nombre de dominio y puerto y se pueden publicar en
rutas diferentes
● Activar el ingress controller en minikube
https://kubernetes.io/docs/concepts/services-networking/ingress/
Ingress
● Uso de ingress
● Desplegamos la web de gatos (deployment y service)
$ kubectl create -f
https://raw.githubusercontent.com/codeurjc/Curso-Kubernetes/ma
ster/ejemplo1/webgatos-minikube.yaml
$ kubectl create -f
https://raw.githubusercontent.com/codeurjc/Curso-Kubernetes/ma
ster/ejemplo2/java-mysql-minikube.yaml
Ingress
ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: codeurjc-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: "/"
spec:
rules:
- host: curso.minikube.io
http:
paths:
- path: /anuncios/
backend:
serviceName: java-webapp-db-service
servicePort: 8080
- path: /gatos
backend:
serviceName: webgatos-service
servicePort: 5000
Ingress
● Crear el recurso Ingress
https://kubernetes.io/docs/concepts/storage/volumes/
Kubernetes
● Volúmenes
● Tipo “emptyDir”:
● Se crea vacío
● Los datos se mantienen siempre que el pod se ejecute en el mismo
nodo
● Si se borra el pod, los datos se pierden
● Si el contenedor se para de forma abrupta (crash), se reinicia en la
misma máquina y los datos no se pierden
● Se usa cuando se necesitan ficheros temporales en disco o para
comunicar contenedores del mismo pod
https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes
Kubernetes
● Volúmenes
● Tipo “hostPath”:
● Monta una ruta de disco
● Sirve para acceder a carpetas específicas, como /var/lib/docker
● Tipo “local”:
● Sirve para guardar datos en el disco del nodo (carpeta, disco o
partición)
● Si el nodo se llena o se desconecta del cluster, los pods que se
quieran conectar a ese volumen, no podrán ejecutarse.
https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes
Kubernetes
● Volúmenes
● glusterFS:
● Monta un volumen del sistema de ficheros en red open source
GlusterFS
● Se pueden montar varios contenedores en modo escritura de
forma simultánea
● La información no se pierde, es persistente
https://www.gluster.org/
https://github.com/kubernetes/examples/tree/master/staging/volumes/glusterfs
Kubernetes
●
Persistence Volumes en AWS
●
awsElasticBlockStore
●
Un volumen sólo puede estar conectado a un único nodo
●
Cuando un pod se despliega en otro nodo, el EBS se monta ese
nuevo nodo
●
Un Persistence Volumen EBS creado en una zona de disponibilidad,
no se puede montar en un nodo en otra zona
●
efs-provisioner
●
Usa Elastic FileSystem Service de AWS (Un NFS as a service)
●
Está en incubator
https://github.com/kubernetes-incubator/external-storage/tree/master/aws/efs
Kubernetes
● Volúmenes en el pod
● Algunos tipos de volúmenes básicos se pueden configurar
en el pod (emptyDir, hostPath...)
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: codeurjc/test-webserver:v1
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
https://github.com/codeurjc/Curso-Kubernetes/blob/master/Volumenes/emptyDir.yaml
Kubernetes
● Volúmenes en el pod
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
# this field is optional
type: Directory
Kubernetes
● PersistentVolume (PV)
● Otros tipos de volúmenes tienen un ciclo de vida no asociado
a un pod.
● Representa un recurso de almacenamiento en el cluster, como
los nodos de computación
● Para que un pod pueda usar un volumen, lo solicita con un
“reclamo” (PersistenceVolumeClaim)
● Ese reclamo se atiende con un PersistenceVolume:
● Creado de forma explícita por el admin
● Creado de forma dinámica en base a un tipo de almacenamiento
(StorageClass)
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
Kubernetes
● Ejemplo de uso de PersistentVolume (PV)
● 1) Creamos un fichero en el nodo
● Conectamos al nodo de minikube
● $ minikube ssh
● Creamos la carpeta /mnt/data
● $ sudo mkdir /mnt/data
● Creamos un fichero index.html
● $ echo 'Hello from Kubernetes storage' | \
sudo tee /mnt/data/index.html
https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
Kubernetes
● Ejemplo de uso de PersistentVolume (PV)
● 2) Creamos el PersistentVolume
● En desarrollo, se usa una carpeta del nodo como volumen
persistente (hostPath)
● En producción, se usan los servicios de datos persistentes como
AWS EBS, Azure Persistent Disk, NFS…
https://k8s.io/docs/tasks/configure-pod-container/task-pv-volume.yaml
Kubernetes
● Ejemplo de uso de PersistentVolume (PV)
● 2) Creamos el PersistentVolume
kind: PersistentVolume
apiVersion: v1
metadata:
name: task-pv-volume
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
https://github.com/codeurjc/Curso-Kubernetes/blob/master/Volumenes/persistentVolume.yaml
Kubernetes
● Ejemplo de uso de PersistentVolume (PV)
● 2) Creamos el PersistentVolume
● Creamos el PersistentVolume
● $ kubectl create -f
https://raw.githubusercontent.com/codeurjc/Curso-
Kubernetes/master/Volumenes/persistentVolume.yaml
● Vemos su información
● $ kubectl get pv task-pv-volume
Kubernetes
●
Ejemplo de uso de PersistentVolume (PV)
●
3) Creamos un PersistentVolumeClaim
●
Para que un Pod pueda usar un PV, lo tiene que “reclamar”
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: task-pv-claim Se vincula el “claim”
spec: con el PV usando el
storageClassName: manual
accessModes: storageClassName
- ReadWriteOnce
resources:
requests:
storage: 3Gi
https://kubernetes.io/docs/concepts/storage/storage-classes/
Ejercicio 4
● Despliega una web con BBDD persistente
● Guarda los datos de la BBDD del Ejercicio 3 en un
volumen persistente
● Podemos usar el mismo Persistence Volume creado
previamente (/mnt/data)
● La ruta en la que MySQL guarda los datos
(mountPath) es: /var/lib/mysql
Ejercicio 4
● Solución
● kubectl create -f https://raw.githubusercontent.com/
codeurjc/Curso-Kubernetes/master/ejemplo2/mysql-
service-with-pvc.yaml
● kubectl create -f https://raw.githubusercontent.com/
codeurjc/Curso-Kubernetes/master/ejemplo2/java-
mysql-minikube.yaml
Kubernetes
● Bases de datos replicadas y tolerantes a fallos
en Kubernetes
● Un pod puede tener un volumen persistente
● Pero un solo pod con una BBDD y un único volumen
no escala ni es tolerante a fallos
● La gestión de réplicas de un Deployment no se
pueden usar para BBDD: están diseñados para pods
stateless, efímeros, que se pueden eliminar en
cualquier momento
Kubernetes
● Bases de datos replicadas y tolerantes a fallos
en Kubernetes
● Los recursos StatefulSet proporcionan un mecanismo
similar a los Deployment pero con características
específicas para contenedores con estado:
● Identificadores de red estables y únicos por pod
● Almacenamiento persistente estable por pod
● Despliegue y escalado ordenado de pods
● Terminado y borrado ordenado de pods
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
Kubernetes
● Bases de datos replicadas y tolerantes a fallos
en Kubernetes
● Desplegar un “cluster” de instancias de una BBDD en
Kubernetes en un StatefulSet no es sencillo
● Requiere un conocimiento muy profundo del
funcionamiento de la BBDD concreta y del
funcionamiento de los StatefulSets
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
Kubernetes
● MySQL escalable y tolerante a fallos
● Ejemplo 1 (Dic2017)
● Un pod maestro y dos esclavos
● Utiliza la herramienta xtrabackup para
compleja
● Ejemplo ofrecido por Rancher
https://rancher.com/running-highly-available-wordpress-mysql-kubernetes/
Kubernetes
● MySQL escalable y tolerante a fallos
● Ejemplo 2 (Sep 2017)
● Basado en Portworx, una capa de persistencia
sobre el cloud diseñada para contenedores
● Específico para AWS con Kops
https://dzone.com/articles/mysql-kubernetes-deploying-and-running-mysql-on-ku
Kubernetes
● MySQL escalable y tolerante a fallos
● Vitess es un sistema de clusterización para el
escalado horizontal de MySQL
● Está preparado para ser desplegado en Kubernetes
https://vitess.io/
https://vitess.io/getting-started/
Kubernetes
● MySQL escalable y tolerante a fallos
● Oracle presentó una charla en la Kubeconf Dic2017
presentando cómo instalar MySQL en Kubernetes
● Es una charla muy completa
● Presenta múltiples enfoques y alternativas
https://dyn.com/blog/mysql-on-kubernetes/
https://schd.ws/hosted_files/kccncna17/4d/MySQL%20on%20Kubernetes.pdf
Kubernetes
● MySQL escalable y tolerante a fallos
● MySQL Operator (Oracle)
● Basado en el concepto de Operators de CoreOS
● Permite instalar un MySQL replicado, tolerante a fallos
https://coreos.com/blog/introducing-operators.html
https://coreos.com/operators/
https://github.com/oracle/mysql-operator
Autoescalado
● Horizontal Pod
Autoscaler
● El número de réplicas de un
deployment puede cambiar
dinámicamente en base a la
carga de CPU o de métricas
personalizadas
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
Autoescalado
● Minikube
● Habilitar los siguientes addons
$ minikube addons enable heapster
●
●
$ watch kubectl get pods \
--selector=app=php-apache
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
Autoescalado
● Cluster autoscaling
● El número de nodos de un cluster puede cambiar
dinámicamente en función del número de pods del cluster
● Si un nuevo pod que se va a crear no cabe en el cluster
(por la reserva de recursos de cada uno), se crea un nuevo
nodo en el cluster
https://kubernetes.io/docs/tasks/administer-cluster/cluster-management/#cluster-
autoscaling
https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler
Autoescalado
● Cluster autoscaling
● Hay que editar el IAM Role de los nodos para que la instancia
que ejecuta el cluster-autoscaling pueda operar con el
Autoscaling de AWS.
● Editar el AutoScaling group en AWS para aumentar el máximo
de instancias que podemos levantar.
● Instalamos el addon de cluster autoscaler en k8s
● Con el ejemplo previo de HPA, cuando ya se han ocupado
todos los recursos del cluster, los nuevos pods están en estado
pending hasta que AWS inicia un nuevo nodo
https://github.com/codeurjc/Curso-Kubernetes/tree/master/CA
Helm
●
Una aplicación completa está formada por múltiples recursos
Kubernetes:
●
Deployment del frontal web
●
Deployment de la BBDD
●
Servicio de frontal web
●
Configuración del Ingress
●
ConfigMap
●
PersistenceVolumeClaim
●
La gestión manual de todos
esos recursos es bastante tediosa
Helm
●
Helm es servicio para gestionar
aplicaciones Kubernetes
●
Se define como “El gestor de paquetes para
Kubernetes”
●
Es como un docker-compose, pero para Kubernetes
●
Dispone de un repositorio oficial de aplicaciones
(llamadas charts)
●
Se pueden tener repositorios privados
https://helm.sh/
Helm
● Las aplicaciones se pueden actualizar
y hacer rollback de forma sencilla
● Está mantenido por la CNCF
Helm
● Instalación del cliente
● Helm dispone de una parte cliente
y un pod desplegado en el cluster
● Cliente Helm: Permite instalar, actualizar y borrar los
charts en el cluster kubernetes
● Servidor Tiller: Gestiona los charts en el propio cluster.
Helm
● Instalación del cliente
● Tener kubectl conectado a un cluster
● Descargar el binario
https://github.com/kubernetes/helm/releases
$ helm help
https://docs.helm.sh/using_helm/#installing-helm
Helm
● Desplegar Tiller
● Se instala Tiller en el cluster conectado a
kubectl
$ helm init
● Se crea un pod en el namespace kube-system, donde
están los pods de management de kubernetes
https://docs.helm.sh/using_helm/#installing-helm
Helm
● Configurar Tiller
$ kubectl -n kube-system patch deployment tiller-deploy -p
'{"spec": {"template": {"spec": {"automountServiceAccountToken":
true}}}}'
https://docs.helm.sh/using_helm/#installing-helm
Helm
● Instalación de charts del repositorio oficial
● Se indica el nombre del chart (en el repositorio) y el
nombre de la release en el cluster
$ helm install --name my-drupal stable/drupal
https://github.com/kubernetes/charts/tree/master/stable/drupal
Helm
●
Gestión de releases
●
Ver el estado de una release
$ helm status my-drupal
●
Listar las releases del cluster
$ helm list
●
Borrar una release
$ helm delete my-drupal
Helm
●
Personalizar un chart en la instalación
●
Ver la lista de valores que se pueden configurar
●
Configuración por fichero o por línea de comandos
https://docs.helm.sh/using_helm/#helm-upgrade-and-helm-rollback-upgradin
g-a-release-and-recovering-on-failure
Helm
● Creación de charts
● Un char es una colección de ficheros que describen
un conjunto de recursos Kubernetes relacionados
● Un chart es una estructura de directorios que puede
ser empaquetada (en un fichero comprimido)
https://docs.helm.sh/developing_charts/
Helm
● Creación de charts
● La carpeta raíz es el nombre del chart
https://docs.helm.sh/developing_charts/
Helm
●
Creación de charts
●
Se puede generar un layout inicial para editar
https://docs.bitnami.com/kubernetes/how-to/create-your-first-helm-chart/
Helm
●
Templates
Helm
● Creación de charts
● Carpeta templates tiene los recursos kubernetes
● Se llama templates porque los ficheros son plantillas Go
porque al instalar el chart se sustituyen las variables por
valores
● Estos valores se obtienen del fichero Chart.yaml y
values.yaml
● Se puede depurar la sustitución con
$ helm install --dry-run --debug ./mychart
https://golang.org/pkg/text/template/
Helm
● Creación de charts
● El fichero values.yaml contiene valores
por defecto
● Se pueden sustituir en el momento del despliegue por
línea de comandos o por fichero
$ helm install --dry-run --debug ./mychart \
--set service.internalPort=8080
https://docs.bitnami.com/kubernetes/how-to/create-your-first-helm-chart/
Helm
● Creación de charts
● El contenido de NOTES.txt se muestra después de
instalar el chart (es una plantilla también)
● El fichero Chart.yaml contiene los metadatos de la
aplicación
https://github.com/kubernetes/helm/blob/master/docs/charts.md#the-chartyaml-file
Helm
● Chart.yaml
https://github.com/kubernetes/helm/blob/master/docs/charts.md#the-chartyaml-file
Helm
● Instalar un chart “en desarrollo”
● El comando install permite apuntar a la
carpeta del chart
https://github.com/kubernetes/helm/blob/master/docs/charts.md#the-chartyaml-file
Helm
● Empaquetar aplicaciones
● La carpeta del chart se puede empaquetar
https://github.com/kubernetes/helm/blob/master/docs/charts.md#the-chartyaml-file
Helm
● Repositorios
● Se puede ejecutar un servidor básico en local
$ helm serve
ChartMuseum
https://github.com/kubernetes-helm/chartmuseum
Ejercicio 5
● Crea un chart para la web de anuncios con base
de datos
● Instala la aplicación en minikube
Ejercicio 5
● Solución
● Clonamos el repositorio
● https://github.com/codeurjc/Curso-Kubernetes/tree
/master/ejemplo4/java-bd
● Instalamos la aplicación
● $ helm install --name java-bd ./java-bd