Diferències
Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
| info:cursos:pue:devops2022:s7 [09/02/2022 09:20] – mate | info:cursos:pue:devops2022:s7 [09/03/2022 07:39] (actual) – mate | ||
|---|---|---|---|
| Línia 1: | Línia 1: | ||
| - | = DevOps Sesión 7 (2022-03-02) | + | = DevOps Sesión 7 (2022-03-02) |
| == Documentación relacionada | == Documentación relacionada | ||
| + | <callout type=" | ||
| + | * lpi-devops-study-master -> documentación estudio | ||
| + | * 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | * 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | * 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | </ | ||
| + | |||
| == Clase | == Clase | ||
| - | == TODO | + | * **~/ |
| - | <callout type=" | + | * Lens, the kubernetes IDE -> [[https:// |
| + | * k8s certificación | ||
| + | * DCA: administrador (tipo test) | ||
| + | * DCK | ||
| + | * CKD | ||
| + | * CKS | ||
| + | |||
| + | === deployment | ||
| + | <callout type=" | ||
| + | * 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | * 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | </ | ||
| + | * [[https:// | ||
| + | * desplegamos:< | ||
| + | kubectl get deployment, | ||
| + | * Debes indicar el parámetro **%%--%%record** para registrar el comando ejecutado en la anotación de recurso kubernetes.io/ | ||
| + | * <code yaml> | ||
| + | kind: Deployment | ||
| + | metadata: | ||
| + | name: helloworld-deployment | ||
| + | spec: | ||
| + | selector: | ||
| + | matchLabels: | ||
| + | app: helloworld | ||
| + | replicas: 3 | ||
| + | template: | ||
| + | metadata: | ||
| + | labels: | ||
| + | app: helloworld | ||
| + | spec: | ||
| + | containers: | ||
| + | - name: k8s-demo | ||
| + | image: wardviaene/ | ||
| + | ports: | ||
| + | - name: nodejs-port | ||
| + | containerPort: | ||
| + | * expongo el servicio:< | ||
| + | kubectl describe service helloworld-deployment-service</ | ||
| + | * [[http:// | ||
| + | * actualizo la versión:< | ||
| + | * **k8s-demo** es el nombre del contenedor que quiero actualizar (así especificado en el yaml) | ||
| + | * mostrar history:< | ||
| + | * hacer rollout (en este caso un **undo**, por defecto k8s almacena 10 versiones):< | ||
| + | * <code bash> | ||
| + | * hacer rollout a otra versión:< | ||
| + | * el número es el que aparece en el **history** | ||
| + | * también: '' | ||
| + | * escalamos:< | ||
| + | kubectl edit deployments.apps helloworld-deployment | ||
| + | kubectl scale --replicas=4 -f / | ||
| + | * eliminamos:< | ||
| + | kubectl delete -f / | ||
| + | kubectl delete service helloworld-deployment-service | ||
| + | kubectl get service, | ||
| + | === estrategias de update: | ||
| + | <callout type=" | ||
| + | 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | </ | ||
| + | * [[https:// | ||
| + | * 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 | ||
| + | <callout type=" | ||
| + | 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | </ | ||
| + | * 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 | ||
| + | * <code bash> | ||
| + | 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) | ||
| + | <callout type=" | ||
| + | 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | </ | ||
| + | * Cada vez que se crea un nuevo servicio se crea un registro de tipo A con el nombre **< | ||
| + | * 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** | ||
| + | * <code bash> | ||
| + | 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 | ||
| + | <code bash> | ||
| + | # en el pod: | ||
| + | yum install dns-utils | ||
| + | nslookup... | ||
| + | </ | ||
| + | |||
| + | === Healthcheck | ||
| + | <callout type=" | ||
| + | 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | </ | ||
| + | * 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 " | ||
| + | * ReadinessProbe: | ||
| + | * LivenessProbe: | ||
| + | * 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 | ||
| + | * <code yaml> | ||
| + | containers: | ||
| + | - name: jboss-lab | ||
| + | image: docker.example.com/ | ||
| + | imagePullPolicy: | ||
| + | |||
| + | | ||
| + | initialDelaySeconds: | ||
| + | periodSeconds: | ||
| + | exec: | ||
| + | command: | ||
| + | - /bin/sh | ||
| + | - -c | ||
| + | - / | ||
| + | |||
| + | | ||
| + | initialDelaySeconds: | ||
| + | periodSeconds: | ||
| + | exec: | ||
| + | command: | ||
| + | - /bin/sh | ||
| + | - -c | ||
| + | - / | ||
| + | |||
| + | livenessProbe: | ||
| + | httpGet: | ||
| + | path: /status | ||
| + | port: 8080 | ||
| + | initialDelaySeconds: | ||
| + | timeoutSeconds: | ||
| + | * InitialDelaySeconds: | ||
| + | * timeoutSeconds: | ||
| + | * failure Threshold: número de veces para darlo por malo | ||
| + | |||
| + | ==== lab | ||
| + | <callout type=" | ||
| + | 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | </ | ||
| + | <code yaml> | ||
| + | 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: | ||
| + | livenessProbe: | ||
| + | httpGet: | ||
| + | path: / | ||
| + | port: 80 | ||
| + | initialDelaySeconds: | ||
| + | timeoutSeconds: | ||
| + | <code bash> | ||
| + | kubectl get pod | ||
| + | |||
| + | kubectl get deployment.apps/ | ||
| + | |||
| + | kubectl describe deployment.apps/ | ||
| + | # Liveness: http-get http://:80/ delay=30s timeout=10s period=10s #success=1 # | ||
| + | </ | ||
| + | |||
| + | ==== lab | ||
| + | <callout type=" | ||
| + | 2-Despliegue de Aplicaciones Kubernetes/ | ||
| + | </ | ||
| + | <code bash> | ||
| + | kubectl describe pod hc | ||
| + | kubectl apply -f / | ||
| + | kubectl describe pod badpod | ||
| + | kubectl get pods # mirar reinicios | ||
| + | </ | ||
| + | |||
| + | ==== lab | ||
| + | <code bash> | ||
| + | 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 | ||
| + | * '' | ||
| + | * '' | ||
| + | * centralizar | ||