= DevOps Sesión 7 (2022-03-02) k8s
== Documentación relacionada
* lpi-devops-study-master -> documentación estudio
* 2-Despliegue de Aplicaciones Kubernetes/1-Laboratorio kubernetes Curso-DevOps.txt
* 2-Despliegue de Aplicaciones Kubernetes/1-Laboratorios Kubernetes 2020.pdf
* 2-Despliegue de Aplicaciones Kubernetes/2-Laboratorios basicos kubernetes .pdf
== Clase
* **~/.kube/config**: credenciales para conectar con el cluster
* Lens, the kubernetes IDE -> [[https://k8slens.dev/]]
* k8s certificación
* DCA: administrador (tipo test)
* DCK
* CKD
* CKS
=== deployment
* 2-Despliegue de Aplicaciones Kubernetes/1-Laboratorios Kubernetes 2020.pdf pàg 37
* 2-Despliegue de Aplicaciones Kubernetes/kubernetes-curso/deployment
* [[https://kubernetes.io/es/docs/concepts/workloads/controllers/deployment/]]
* desplegamos:kubectl apply -f /vagrant/kubernetes-curso/deployment/helloworld.yml --record
kubectl get deployment,rs,pod
* Debes indicar el parámetro **%%--%%record** para registrar el comando ejecutado en la anotación de recurso kubernetes.io/change-cause.Esto es útil para futuras introspecciones, por ejemplo para comprobar qué comando se ha ejecutado en cada revisión del Deployment. To be deprecated.
* apiVersion: apps/v1 # Usa apps/v1beta2 para versiones anteriores a 1.9.0
kind: Deployment
metadata:
name: helloworld-deployment
spec:
selector: #permite seleccionar un conjunto de objetos que cumplan las condicione
matchLabels:
app: helloworld
replicas: 3
template:
metadata:
labels:
app: helloworld
spec:
containers:
- name: k8s-demo
image: wardviaene/k8s-demo
ports:
- name: nodejs-port
containerPort: 3000
* expongo el servicio:kubectl expose deployment helloworld-deployment --type=NodePort --name=helloworld-deployment-service
kubectl describe service helloworld-deployment-service
* [[http://10.0.0.11:]]
* actualizo la versión:kubectl set image deployment/helloworld-deployment k8s-demo=wardviaene/k8s-demo:2 --record
* **k8s-demo** es el nombre del contenedor que quiero actualizar (así especificado en el yaml)
* mostrar history:kubectl rollout history deployment helloworld-deployment
* hacer rollout (en este caso un **undo**, por defecto k8s almacena 10 versiones):kubectl rollout undo deployment helloworld-deployment
* kubectl rollout status deployment helloworld-deployment
* hacer rollout a otra versión:kubectl rollout undo deployment helloworld-deployment --to-revision=3
* el número es el que aparece en el **history**
* también: ''kubectl annotate deployment.v1.apps/nginx-deployment kubernetes.io/change-cause="image updated to 1.9.1"''
* escalamos:kubectl scale deployment helloworld-deployment --replicas=5
kubectl edit deployments.apps helloworld-deployment
kubectl scale --replicas=4 -f /vagrant/kubernetes-curso/deployment/helloworld.yml
* eliminamos:kubectl delete deployment helloworld-deployment
kubectl delete -f /vagrant/kubernetes-curso/deployment/helloworld.yml
kubectl delete service helloworld-deployment-service
kubectl get service,deployment
=== estrategias de update:
2-Despliegue de Aplicaciones Kubernetes/Seminario kubernetes Troubleshooting Deployments Applications.pdf pag 41
2-Despliegue de Aplicaciones Kubernetes/Laboratorio-deployment-strategies/deployment-blue-green
* [[https://kubernetes.io/es/docs/concepts/workloads/controllers/deployment/#estrategia]]
* rollingupdate
* actualización continua. Se crean los de la nueva versión, y cuando estén listos, va eliminando los viejos.
* maxSurge:
* maxUnavailable
* recreate
* los PODs se eliminan antes de que los nuevos se creen.
* se cae el servicio y se levanta.
* para aplicaciones sin estado
* Canary:
* despliegue progresivo, sustituyendo 1 a 1 y siguiendo si todo va bien
* Blue-Green
* se despliegan las 2 versiones y el servicio cambia de una a otra
* se elimina la versión anterior
* A/B
* estrategia de pruebas de diferentes propotipos
* HPA = Horizontal Pod autoscaler
* defines max y mínimos y hasta donde puede ampliar los PODs
=== namespaces
2-Despliegue de Aplicaciones Kubernetes/1-Laboratorios Kubernetes 2020.pdf, pág 176
* Los namespaces (espacios de nombres) en Kubernetes permiten establecer un nivel adicional de separación entre los contenedores que comparten los recursos de un clúster.
* colisión de nombres
* limitación de recursos: memoria, cpu, objetos
* los servicios se ven a través de los namespaces (autodescubrimiento DNS)
* con **network policies** podemos restringir esa comunicación
* no cambio nombre namespace en caliente
* cluster virtual sobre cluster real
* kubectl get namespaces
kubectl get ns # idem anterior
kubectl get pod --namespace kube-system
kubectl get pod -n kube-system -o wide # idem anterior
kubectl get pods --all-namespaces
kubectl create ns formacion
kubectl describe ns formacion # muestra cuotas
kubectl run nginx --image=nginx -n formacion
kubectl get pods
kubectl get pods --all-namespaces
kubectl config get-contexts # saber namespace por defecto
kubectl config set-context --current --namespace=formacion
kubectl delete ns formacion
=== descubrimiento (Kubernetes service discovery)
2-Despliegue de Aplicaciones Kubernetes/1-Laboratorios Kubernetes 2020.pdf, pág 132
* Cada vez que se crea un nuevo servicio se crea un registro de tipo A con el nombre **..svc.cluster.local**
* Para cada puerto nombrado se crea un registro SRV del tipo **_nombre-puerto._nombre-protocolo.my-svc.my-namespace.svc.cluster.local** que resuelve el número del puerto y al CNAME: **servicio.namespace.svc.cluster.local**
* Para cada pod creado con dirección IP 1.2.3.4, se crea un registro A de la forma **1-2-3-4.default.pod.cluster.local**.
* pods en **kube-system** **coredns**
* kubectl get rs.apps -n kube-system
kubectl get pod -o wide -n kube-system
kubectl describe pod coredens -n kube-system
kubectl get service -o wide -n kube-system # DNS del cluster
==== lab
kubectl run -i --tty centos1 --image centos:centos7 --restart=Never -- bash
# en el pod:
yum install dns-utils
nslookup...
=== Healthcheck
2-Despliegue de Aplicaciones Kubernetes/1-Laboratorios Kubernetes 2020.pdf, pág 84
* Los Healthchecks son un mecanismo fundamental para cargas productivas. Es el principal mecanismo por el cual Kubernetes va a saber si nuestros Pods están funcionando correctamente o no.
* por CLI (o comando) o por HTTPGets
* 2 tipos "básicos":
* ReadinessProbe: indica si está listo para recibir tráfico
* LivenessProbe: indica que ese pod está funcionando
* Kubernetes:
* Si Readiness falla -> detiene el tráfico al POD
* Si Liveness falla -> reinica el pod
* Si Readiness funciona -> restablece el tráfico hacía el pod
* ...
containers:
- name: jboss-lab
image: docker.example.com/jboss:1
imagePullPolicy: IfNotPresent
livenessProbe:
initialDelaySeconds: 30
periodSeconds: 15
exec:
command:
- /bin/sh
- -c
- /opt/jboss/wildfly/bin/jboss-cli.sh --connect --commands=ls | grep 'server-state=running'
readinessProbe:
initialDelaySeconds: 30
periodSeconds: 5
exec:
command:
- /bin/sh
- -c
- /opt/jboss/wildfly/bin/jboss-cli.sh --connect --commands=ls | grep 'server-state=running'
livenessProbe:
httpGet:
path: /status
port: 8080
initialDelaySeconds: 30
timeoutSeconds: 10
* InitialDelaySeconds: espera X a que arranque
* timeoutSeconds: cada X comprueba de nuevo
* failure Threshold: número de veces para darlo por malo
==== lab
2-Despliegue de Aplicaciones Kubernetes/k8-for-devs-master/healthchecks
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-lab
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
timeoutSeconds: 10
kubectl apply -f /vagrant/k8-for-devs-master/healthchecks/healcheck.yaml
kubectl get pod
kubectl get deployment.apps/deployment-lab -o yaml
kubectl describe deployment.apps/deployment-lab |grep -i Liveness
# Liveness: http-get http://:80/ delay=30s timeout=10s period=10s #success=1 #failure=3
==== lab
2-Despliegue de Aplicaciones Kubernetes/2-Laboratorios basicos kubernetes .pdf pág 7
kubectl apply -f /vagrant/kubernetes-labs2/healthz/pod.yaml
kubectl describe pod hc
kubectl apply -f /vagrant/kubernetes-labs2/healthz/badpod.yaml
kubectl describe pod badpod
kubectl get pods # mirar reinicios
==== lab
kubectl create ns miercoles2
kubectl config set-context --current --namespace=miercoles2
kubectl run --image nginx --port=80 aplica1
kubectl expose pod aplica1 --type=NodePort --name aplica1-service
kubectl describe service aplica1-service
== Extra
* ''kubectl get events''
* ''kubectl logs --previous=true'': mostrar logs de pods/contenedores anteriores
* centralizar