Este documento proporciona una introducción a Kubernetes para desarrolladores. Explica conceptos clave como contenedores, imágenes, pods, deployments y servicios. También cubre comandos básicos de Kubernetes como crear y eliminar deployments y servicios. Además, describe cómo configurar deployments mediante el uso de variables de entorno, configmaps y secrets.
3. Juan Manuel
Disruptive Lead
D4I - Industria
Lopez
Contactos
¿Que me gusta?
• Paradigmas de programación
• Arquitectura de desarrollo de
aplicaciones
• Técnicas avanzadas de
programación
• Una buena birra
Barcelona
juanmanulopez
Juan.manuel.lopez@everis.com
https://github.com/soyjuanmalopez
5. Los contenedores permiten empaquetar,
distribuir y ejecutar servicios de red con un
formato estándar con todas las
dependencias incluidas
Juan Manuel Lopez
5
Introducción a contenedores
Docker
Docker
6. 6
• 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
– Sistemas operativos soportados
• Contenedores Linux.
– Más usados y más maduros
– En linux se ejecutan directamente por el
kernel
– En win y mac se ejecutan en máquinas
virtuales gestionadas por docker
• Contenedores Windows
– Menos usados y menos maduros
– Sólo se pueden ejecutar en windows server
Introduccion a contenedores
Docker
¿Qué es docker?
7. 7
• Es una tecnología muy popular (aunque existen otras
tecnologías de contenedores)
• Inicialmente desarrollada para linux, aunque dispone de
herramientas para desarrolladores en windows y mac
• Existe un repositorio de imágenes (hub) con contenedores
públicos
Introducción a contenedores
Docker
¿Qué es docker?
8. 8
• Imagen docker
– Plantilla para un contenedor
– Contiene las herramientas del SO (ubuntu, alpine), librerías
(Java) and la aplicación en sí (webapp.jar)
– Si se quiere arrancar un contenedor partiendo de una
imagen que no está disponible, se descarga
automáticamente de un registro
• 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
Concepto docker
Docker
Contenedores
9. 9
• 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
• 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
Concepto docker
Docker
Contenedores
10. 10
Construir una Imagen :)
Docker
Comandos para crear un contenedor
docker build . -t eu.gcr.io/juanmlopez/web-sologatos:v5
docker → comando de ejecucion
build → comando que indica que se tiene que construir
. → indica que el docker file se encuentra en donde me encuentro posicionado con la consola
- t → indica que ademas de builidar la imagen tengo que tagearla esto es colocarle una marca
eu.gcr.io → es la zona donde se encuentra el proyecto
juanmlopez → es el nombre del poryecto en el cloud es el identificador de nuestro repositorio de imagenes
Web-sologatos --> es el nombre de la imagen
v5 es la version que le damos a la imagen en caso que no coloquemos nada por defecto se tagea en latest
docker push eu.gcr.io/juanmlopez/web-sologatos:v5
Git Frendly :)
11. 11
Comandos en docker
Docker
Iniciar un contenedor
• 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
12. 12
docker run --name custom_name -e AUTHOR="Your Name" -d -p 9000:80 seqvence/static-site
Networking Docker
Docker
Mas comandos de docker
--name custom-name
Nombre del contenedor
-e AUTHOR="Your Name" Pasar variables de entorno a la
aplicación que se ejecuta en el contenedor
-d Ejecuta el contenedor
en segundo plano (no
bloquea la shell durante la
ejecución)
-p 9000:80
Conecta el host
port 9000 con el
Puerto 80 del
container
14. Kubernetes
Introduccion Kubernetes
• Desarrollado inicialmente por Google (basado en
Borg)
• Es un software diferente a docker que tiene que
instalarse por separado
• Está desarrollado bajo la Cloud Native
Computing Fundation con múltiples miembros de
peso
15. Kubernetes
Introduccion Kubernetes
• Kubernetes es "un software Open Source para automatizar el despliegue, escalado y administración de aplicaciones en
contenedores“
• Conectar los contenedores a través de múltiples hosts, escalarlos cuando sea necesario, implementar aplicaciones sin tiempo de
inactividad y “service Discovery” entre otros, son desafíos realmente difíciles.
• Kubernetes aborda esos desafíos desde el principio con un conjunto de primitivos y una poderosa API.
• Usa docker internamente, pero también puede funcionar con otras tecnologías de contenedores como rkt, pero no son muy
maduras
17. 17
Kubernetes
• Imagen
– A docker image built from a Dockerfile that contains everything
a service needs to run
Kubernetes
Definición de conceptos core de kubernetes
• Container
– A container runs a docker image
– Only 1 process can run inside of a container
• POD
– A group of 1 or more containers
– Same port space
– Ports are not accessible from outside of the pod
• Replica Set
– Defines and manages how many instances of a pod should run
• Service
– Makes a port of a pod accessible to other pods
• Ingress
– Makes a service accessible to the outside of Kubernetes
• Node
– A physical server / Containers get distributed automatically
• ConfigMap
– Configuration that can be mounted inside of a container
• Volumes
– Volumes can be mounted into a container to access a
ConfigMap, Secret or a folder on the host
• Namespace
– Used to group, separate, and isolate objects, for access control,
network access control, resource management, etc.
21. Deployment file
Kubernetes
21
Deployment Arquitecture
apiVersion: extensions/v1beta1
kind: "Deployment"
metadata:
name: "client-api"
namespace: "singapur-pro"
labels:
app: "client-api"
spec:
replicas: 2
selector:
matchLabels:
app: "client-api"
template:
metadata:
labels:
app: "client-api"
spec:
containers:
# [START esp]
- name: esp
image: "gcr.io/endpoints-release/endpoints-runtime:1"
args: [
"--http_port=8081",
"--backend=127.0.0.1:8002",
"--service=client.endpoints.leroy-merlin-plataforma-sp-pro.cloud.goog",
"--rollout_strategy=managed",
]
# [END esp]
En el deployment file se indican las
configuraciones necesarias, como por
ejemplo la cantidad de pods replicados (2 en
este caso), las necesidades y restricciones de
memoria…
22. Deployment Kubernetes
Kubernetes
22
• Deployment
– Despliegue de uno o varios réplicas de un pod
kubectl create deployment web-gatos --image=eu.gcr.io/juanmlopez/web-gatos -- namespace=demo
– Consultar Deployment
kubectl get deployments
– Borrar deployments
kubectl delete deployment web-gatos -–namespace=demo
Comando básicos de deployment
23. Deployment Kubernetes
Kubernetes
23
Comando básicos
Servicios
Cada pod dispone de una IP, pero los pods pueden morir (con crash) y al volver a arrancar tienen otra IP
Un servicio crea un nombre lógico asociado a los pods de un Deployment
Permite que el pod o los pods sean
• Accesibles desde dentro del cluster con un nombre de DNS
• Accesibles desde fuera del cluster (con el tipo apropiado despliegue de uno o varios réplicas de un pod)
Crear un Servicio
kubectl expose deployment kubernetes-bootcamp --type=NodePort --port=8080
Consultar servicio
kubectl get services –namespace=demo
Información de un servicio en concreto
kubectl describe services/kubernetes-bootcam
Borrado de servicio
kubectl delete service kubernetes-bootcamp
24. Deployment Kubernetes
Kubernetes
24
• 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
Cluster IP ---------> Node Port -----------> Load Balancer ---------> External name
https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-
what-922f010849e0
Servicios
25. Deployment Kubernetes
Kubernetes
25
Tipos de servicios
Cluster IP
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
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
ExternalName
Se usa para crear un nombre interno que apunta a un servicio
externo al cluster
26. Deployment Kubernetes
Kubernetes
26
Replicas
Cluster IP
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
kubectl scale deployment/kubernetes-bootcamp --replicas=2
Cada pod tiene su propia IP
kubectl describe pod webgatos2-574465c7db-wjzf9 | grep IP | sed –E 's/IP:[[:space:]]+//'
• Si un deployment tiene asociado un servicio, cuando se accede al servicio (por IP o nombre DNS) se hace balanceo de carga
entre todos las réplicas (pods)
• Por defecto el balanceo es RoundRobin
28. Manifest Kubernetes
Kubernetes
28
Replicas
Specs (Especificaciones)
Crear los deployments y servicios por línea de comandos es
engorroso y propenso a errores
Además no permite tener la configuración de los recursos
bajo control de versiones
En general se utilizan ficheros de descripción (llamados spec)
en formato YAML de los recursos
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: juanmlopez/webgatos:v2
ports:
- containerPort: 5000
29. Manifest Kubernetes
Kubernetes
29
Resource
Como hacemos para asignar los recursos a cada pods a cada
maquina?
Como hacemos para que los pods, sepan a que nodo caer?
Los cpus se manejan en cores, y luego se transpola a 1 core 1000
milicores
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello
spec:
replicas: 3
template:
metadata:
labels:
role: hello
spec:
containers:
- name: hello
image: gcr.io/google-samples/hello-app:1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources:
requests:
memory: "64Mi"
cpu: "200m"
limits:
memory: "128Mi"
cpu: "500m"
30. Manifest Kubernetes
Kubernetes
30
Liveness and readiness
El detalle con que Kubernetes verifica que sus aplicaciones esten vivas “y
respondiendo” es exquisito en K8s que ademas haga una segunda
verificación y es que este “lista” o “no-lista” (on ready, not ready).
La diferencia es sutil sin embargo la utilidad es grandisima al tenerlos bien
configurados tienes:
• Alta disponibilidad
• Evitas aplicaciones erróneas
• Aseguras el reinicio automático de aplicaciones que fallen
El flujo es el siguiente:
• Si Readiness falla Kubernetes detiene el trafico hacia el “pod” que
falla de la aplicación
• Si Liveness falla Kubernetes reinicia el pod de la aplicación
• Si Readiness funciona Kubernetes restablece el tráfico hacia el
pod de la aplicación nuevamente
31. Configurar Deployment
Kubernetes
31
Configurando nuestras aplicaciones con variables de entorno
Para configurar las aplicaciones que vamos a desplegar usamos
variables de entorno, por ejemplo podemos ver las variables de entorno
que podemos definir para configurar la imagen docker de MariaDB.
Podemos definir un Deployment que defina un contenedor configurado
por medio de variables de entorno, mariadb-deployment.yaml:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: mariadb-deployment
labels:
app: mariadb
type: database
spec:
replicas: 1
template:
metadata:
labels:
app: mariadb
type: database
spec:
containers:
- name: mariadb
image: mariadb
ports:
- containerPort: 3306
name: db-port
env:
- name: MYSQL_ROOT_PASSWORD
value: my-password
32. Configurar Deployment
Kubernetes
32
ConfigMaps y Config Secrets
ConfigMap te permite definir un diccionario (clave,valor) para guardar información que puedes utilizar para configurar una aplicación.
Al crear un ConfigMap los valores se pueden indicar desde un directorio, un fichero o un literal.
kubectl create cm mariadb --from-literal=root_password=my-password
--from-literal=mysql_usuario=usuario
--from-literal=mysql_password=password-user
--from-literal=basededatos=test