Kubernetes
Pods
Ciclo de vida de una aplicación
YAML
#Las cadenas no requieren comillas:
Título: Introducción a YAML
# Pero se pueden usar:
title-w-quotes: 'Introducción a YAML'
# Las cadenas multilínea comienzan con |
ejecutar: |
npm ci
npm build
prueba npm
#Secuencias
#Las secuencias nos permiten definir listas en YAML:
# Una lista de números usando guiones:
números:
- uno
- dos
- Tres
# La versión en línea:
números: [uno, dos, tres]
#Valores anidados
#Podemos usar todos los tipos anteriores para crear un objeto con valores anidados, así:
# Mil novecientos ochenta y cuatro datos nuevos.
1984:
autor: George Orwell
publicado en: 1949-06-08
recuento de páginas: 328
descripción: |
Una novela, a menudo publicada como 1984, es una novela distópica del novelista inglés George Orwell.
Fue publicado en junio de 1949 por Secker & Warburg como noveno y último b de Orwell.
#Lista de objetos
#Combinando secuencias y valores anidados podemos crear una lista de objetos.
# Hagamos una lista de libros:
- 1984:
autor: George Orwell
publicado en: 1949-06-08
recuento de páginas: 328
descripción: |
Una novela, a menudo publicada como 1984, es una novela distópica del novelista inglés George Orwell.
- el Hobbit:
autor: J. R. R. Tolkien
publicado en: 1937-09-21
recuento de páginas: 310
descripción: |
The Hobbit, o There and Back Again es una novela de fantasía para niños del autor inglés J. R. R.
Pods
pod.yaml
Fichero inicial de ejemplo para levantar un pod en Kubernetes mediante el modo declarativo
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
zone: prod
version: v1
spec:
containers:
- name: nginx
image: nginx
comandos para ver estados y opciones de pods
kubectl get pod name_pod
kubectl get pods
#Mas datos
kubectl get pod name_pod -o wide
#El estado actual y su configuración
kubectl describe pod name_pod
#En formato json o yaml para obtener un fichero de lo que hay montado actualmente
kubectl describe pod name_pod -o yaml / -o json
#Ver etiquetas asignadas
kubectl get pods --show-labels
#Desalojar todos los pods de un nodo en concreto y dejarlos como no schedulable
#Respeta los PodDisruptionObjects
kubectl drain --ignore-daemmonsets nombre-node
#Indicar a k8s que puede utilizar un nodo para asignar nuevos pods
kubectl uncordon nombre-node
Deployments
Workloads y controllers
Diferencias con Pods
Ejemplo de deployment declarativo
apiVersion: apps/v1 # i se Usa apps/v1beta2 para versiones anteriores a 1.9.0
kind: Deployment
metadata:
name: nginx-d
spec:
selector: #permite seleccionar un conjunto de objetos que cumplan las condicione
matchLabels:
app: nginx
replicas: 2 # indica al controlador que ejecute 2 pods
template: # Plantilla que define los containers
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Servicios
ClusterIp - NodePort - LoadBalancer
Porque un servicio?
Ejemplo de uso de labels
Kubeconfig
Descripción
Es un fichero yaml que usa kubectl para obtener la configuración de acceso a los cluster de Kubernetes
La ubicación de este fichero se puede configurar mediante:
- La opción kubectl --kubeconfig
- La variable de entorno $KUBECONFIG
Suele redisir en el directorio del usuario actual.
Linux: ~/.kube/config
Windows %USERPROFILE%\.kube\config
Mac ~/.kube/config
Que contiene el fichero config
Certificado de conexión creado en el momento de la instalación
Servidor donde se conectará
Nombre
Usuario
Token de usuario
#Ejemplo de contenido
apiVersion: v1
kind: Config
preferences: {}
#Datos cluster
clusters:
- cluster:
name: desarrollo
- cluster:
name: produccion
#Datos usuarios
users:
- name: usu1
- name: usu2
#Datos contextos
contexts:
- context:
name: desa
- context:
name: desa1
- context:
name: prod1
Clúster
- Contiene endpoints de un clúster de kubernetes.
- La url completa del apiserver
- autoridad certificadora
- Opción de configurar: insecure-skip-tls-verify: true, para desarrollos
Usuario
- Se definen las credenciales de cliente para conectarse al clúster.
- Credenciales disponibles:
- certificado cliente
- clave cliente
- token
- usuario/password
- El nombre de usuario/contraseña y el
token son mutuamente excluyentes, pero
los certificados y claves del cliente se
pueden combinar con ellos
Contextos
- Un contexto define un conjunto de
clúster, usuario y namespace que se utiliza
para enviar solicitudes al clúster. - Cada uno de los tres es opcional; es válido
especificar un contexto con solo unvalor
de clúster, usuario, espacio de nombres o
no especificar ninguno. - Los valores no especificados o los valores
con nombre que no tengan las entradas
correspondientes en el kubeconfig se
reemplazarán por el valor
predeterminado.
Comandos interesantes
DECLARATIVO
apiVersion: v1
clusters:
- cluster:
server: http://localhost:8080
name: local-server
contexts:
- context:
cluster: local-server
namespace: the-right-prefix
user: myself
name: default-context
current-context: default-context
kind: Config
preferences: {}
users:
- name: myself
user:
password: secret
username: admin
COMANDOS DE CONFIGURACIÓN
kubectl config set-credentials myself --username=admin --password=pass
kubectl config set-cluster local-server --server?http://localhost:8080
kubectl config set-context default-context --cluster=local-server --user=myself
kubectl use-context default-context
kubectl config set contexts.default-context.namespace the-right-prefix
kubectl config view
ConfigMaps / Secrets
ConfigMaps
Objeto de la api de kubernetes para almacenar información no confidencial en parejas clave-valor
Permite descoplar información específica del despliegue de la máquina.
Los pods pueden utilizar los configMaps como:
- Variables de entorno
- Argumentos CLI
- Ficheros de configuración
No pueden almacenar más de 1MB.
Secrets
Objeto de la Api de Kubernetes que contienen una pequeña cantidad de información sensible. Passwords, tokens i/o llaves.
Casos de uso:
- Mapear ficheros sensibles en el volumen.
- Configurar variables de entorno en un contenedor.
- Proporcionar credenciales al kubelet para poder hacer pull de la imagen de un repositorio.
Los valores de todas las claves del campo data han de estar ofuscados en base64, se puede evitar usando el campo stringDAta, que acepta valores arbitrarios.
TIPOS DE SECRETOS
- Opaque -> user-defined data
- kubernetes.io/service-account-token
- kubernetes.io/dockercfg
- kubernetes.io/dockerconfiguration
- kubernetes.io/dockerconfigjson
- kubernetes.io/basic-auth
- kubernetes.io/ssh-auth
- kubernetes.io/tls
- boostrap.kubernetes.io/token
Volums
Volums - PV - PVC
Los ephemeral volumes no nos aseguran la persistencia de los datos en caso de eliminar el POD, necesitaremos un mecanismo para definir volumenes persistentes.
Los pods en kubernetes son objetos efímeros.
PV
PersistenVolume
Un volum persistent representa una porción de almacenamiento disponible para los pods, se trata de un recurso más del cluster.
Se pueden crear de dos maneres:
- Static. El administrador del clúster crea un nombre de PV's que hacen referencia al recurso final de almacenamiento
- Dynamic. Se delega la responsabilidad de crear un PV al clúster a partir de las necesidades definidades por el administrador (PVC)
Modos de acceso a un PV
- ReadWriteone (RWO)
- Solo se puede montar como Read/Write
- Permite que multiples Pods puedan acceder al volumen.
- ReadOnlyMany (ROX)
- El volumen se puede montar para múltiples nodos en modo lectura.
- ReadWriteMany
- El volumen se puede montar para múltiples nodos en modo escritura.
- ReadWriteOncePod
- El volumen se puede montar para un único nodo.
PVC
PersistentVolumeClaim
Se trata de una petición de un volumen por un usuario de clúster. El PVC hace referencia al PV.
Si el PV no existe, el aprovisionamiento se hará dinamicamente a partir del StorageClass.
Los PODS hacen referencia al PVC
CSI
Container Storage Interface (CSI)
Extensión de k8s que simplifica la gestión del almacenamiento, es un estándar que permite exponer almacenamiento de todo tipo a los workloads de kubernetes.
aws, google cloud, etc.
Enlace para ver los drivers disponibles
https://kubernetes-csi.github.io/docs/drivers.html
Se utilizan dos cláusulas para su montaje:
- volumeMounts: Le indicamos donde montaremos dentro del POD
- volumes: Para indicarle los volúmenes que vamos a utilizar
Tipos de volumes que soporta:
- Secret
- ConfigMap
- DownwardApi
- ServiceAccountToken
TODO
Anotar apunts snapshots