= DevOps Sesión 8 (2022-03-07) k8s
== Documentación relacionada
* 2-Despliegue de Aplicaciones Kubernetes/1-Laboratorios Kubernetes 2020.pdf
* 2-Despliegue de Aplicaciones Kubernetes/2-Laboratorios basicos kubernetes .pdf
* 2-Despliegue de Aplicaciones Kubernetes/Laboratorio kubernetes Curso-DevOps.txt línea 481
== Clase
=== secretos
* 2-Despliegue de Aplicaciones Kubernetes/1-Laboratorios Kubernetes 2020.pdf pag 91
* 2-Despliegue de Aplicaciones Kubernetes/kubernetes-curso/mariadb-deployment-secret.yaml
* ''create secret...''
* docker-registry
* generic
* tls
* desde directorio, fichero o literal
* no son seguros, no están encriptados, estan en base64 -> ''kubectl get secret -o yaml'' y ''echo "...." | base64 --decode''
* si tienes privilegios administrativos, puedes verlos (no será lo normal)
* ''kubectl config get-contexts''
* kubectl create secret generic mariadb --from-literal=password=00000000
kubectl describe pod ...
kubectl delete secret mariadb
kubectl delete pod ...
kubectl describe pod ...
=== en volumenes
* 2-Despliegue de Aplicaciones Kubernetes/kubernetes-curso/deployment/helloworld-secrets-volumes.yml
* 2-Despliegue de Aplicaciones Kubernetes/kubernetes-curso/deployment/helloworld-secrets.yml
* desplegar secretos usando volúmenes, al estilo SWARM
* creamos secreto
* creamos volumen asociando al secreto
* montamos el volumen en el pod
* ##El secreto:
kubectl apply -f /vagrant/kubernetes-curso/deployment/helloworld-secrets.yml
kubectl apply -f /vagrant/kubernetes-curso/deployment/helloworld-secrets-volumes.yml
kubectl describe pod helloworld-deployment-...
kubectl exec -ti helloworld-deployment-... -- /bin/bash
#root@helloworld-deployment-78457f7dfc-zn2bf:/app# cat /etc/creds/password
#root@helloworld-deployment-78457f7dfc-zn2bf:/app# cat /etc/creds/username
=== configmap
* 2-Despliegue de Aplicaciones Kubernetes/1-Laboratorios Kubernetes 2020.pdf pag 106
* cambios de configuración en caliente (si la aplicación lo soporta)
* no encriptación, todo en texto plano
* ''kubectl create configmap''
==== lab
* 2-Despliegue de Aplicaciones Kubernetes/kubernetes-curso/mariadb-deployment-configmap.yaml
kubectl create cm mariadb --from-literal=root_password=00000000 --from-literal=mysql_usuario=usuario --from-literal=mysql_password=00000000 --from-literal=basededatos=test
kubectl get cm
kubectl describe cm mariadb
kubectl apply -f /vagrant/kubernetes-curso/mariadb-deployment-configmap.yaml
kubectl get pod
kubectl exec -it mariadb-deploy-cm-... -- mysql -u usuario -p
# show databases;
==== lab
* 2-Despliegue de Aplicaciones Kubernetes/kubernetes-curso/configmap/*
* pasar un fichero de configuración a un POD
* creamos el CM
* creamos el volumen asociado al CM
* asociamos el POD al volumen
* este POD tiene 2 contenedores (se hablan como **localhost**) y las peticiones al :80 van a :3000 (del otro contenedor). NGINX en proxypass
* asociamos el servicio al pod (en este caso, están en ficheros separados)
kubectl create configmap nginx-config --from-file=/vagrant/kubernetes-curso/configmap/reverseproxy.conf
kubectl get cm
kubectl describe cm nginx-config
kubectl get configmap nginx-config -o yaml
kubectl apply -f /vagrant/kubernetes-curso/configmap/ # desplegamos los 2 ficheros .yml
=== volúmenes
* 2-Despliegue de Aplicaciones Kubernetes/1-Laboratorios Kubernetes 2020.pdf pag 144
* muchos tipos:
* aws
* iscsi
* azure..
* emptyDir:
* no persiste (en memoria). Desaparece si cae el POD
* me permite compartir un directorio entre 2 contenedores de un POD
* hostPath:
* asociamos el volumen a un nodo
* nfs:
* Para cualquiera de ellas en Kubernetes tendremos que crear:
* PersistentVolume: Donde especificamos el volumen persistente
* PersistentVolumeClaim: Donde reclamamos espacio en el volumen
* Modos de acceso:
* ReadWriteOnce: read-write solo para un nodo (RWO)
* ReadOnlyMany: read-only para muchos nodos (ROX)
* ReadWriteMany: read-write para muchos nodos (RWX)
* Políticas de reciclaje de volúmenes son son:
* Retain: Reclamación manual
* Recycle: Reutilizar contenido
* Delete: Borrar contenido
* Estados de un volumen:
* Available: disponible para reclamación
* Bound: No disponible, se esta utilizando por una reclamación.
* Released: La reclamación del volumen se a eliminado y esta esperando otra petición del cluster.
* Failed: En estado de fallo.
==== lab
* 2-Despliegue de Aplicaciones Kubernetes/Laboratorio kubernetes Curso-DevOps.txt línea 685
* 2-Despliegue de Aplicaciones Kubernetes/kubernetes-curso/webtest-volum-emptydir.yml
* kubectl apply -f /vagrant/kubernetes-curso/webtest-volum-emptydir.yml
kubectl get pod
kubectl describe pod webtest
kubectl exec -ti webtest -c contenedor2 -- bash
# touch /web2/contenedor2
kubectl exec -ti webtest -c contenedor1 -- ash
# touch /web1/contenedor1
==== lab
* 2-Despliegue de Aplicaciones Kubernetes/Laboratorio kubernetes Curso-DevOps.txt línea 717
* 2-Despliegue de Aplicaciones Kubernetes/kubernetes-curso/mysql-affinity.yml
* en este caso se usa **affinity** (más sencillo con **nodeSelector** o **nodeName**)
* kubectl get nodes
kubectl describe nodes worker1 |grep -i labels -A 10
kubectl label nodes worker1 env=bd # Etiquetamos nuestro nodo con la variable env con el valor bd
kubectl describe nodes worker1 |grep -i labels -A 10 # Describimos el nodo para visualizar sus labels
kubectl apply -f /vagrant/kubernetes-curso/mysql-affinity.yml
kubectl exec -it mysql-... -- mysql -u root -p
mysql> create database kubernetes;
mysql> show databases;
kubectl delete deployment mysql
kubectl apply -f /vagrant/kubernetes-curso/mysql-affinity.yml
kubectl exec -it mysql-... -- mysql -u root -p
mysql> show databases;
kubectl label node worker1 env- # elimina la etiqueta (el guión final)
==== lab
* 2-Despliegue de Aplicaciones Kubernetes/Laboratorio kubernetes Curso-DevOps.txt línea 790
* 2-Despliegue de Aplicaciones Kubernetes/1-Laboratorios Kubernetes 2020.pdf pag 151
* 2-Despliegue de Aplicaciones Kubernetes/kubernetes-curso/nfs-pv-pvc.yaml
* 2-Despliegue de Aplicaciones Kubernetes/kubernetes-curso/mysql-storage-nfs.yaml
* instalar NFS en master:sudo apt install nfs-kernel-server
sudo mkdir /bd-nfs
sudo mkdir /var/shared
sudo chmod 777 /bd-nfs/
sudo chown nobody:nogroup /bd-nfs/
sudo vi /etc/exports
# /bd-nfs *(rw,no_root_squash)
# /var/shared 10.0.0.0/24(rw,sync,no_root_squash,no_all_squash)
sudo systemctl restart nfs-kernel-server
sudo systemctl status nfs-kernel-server
sudo systemctl enable nfs-kernel-server
* kubectl apply -f /vagrant/kubernetes-curso/nfs-pv-pvc.yaml
kubectl get pv,pvc
kubectl apply -f /vagrant/kubernetes-curso/mysql-storage-nfs.yml
kubectl describe pod mysql-storage-nfs-...
kubectl exec -ti mysql-storage-nfs-... -- bash
# df -h
* para controlar realmente el espacio usado, hay que usar un storageClass
* los PersistentVolume se crean dinámicamente
* ''kubectl drain worker1 %%--%%delete-local-data %%--%%ignore-daemonsets''
* ''kubectl uncordon worker1''
=== k0sctl
* 2-Despliegue de Aplicaciones Kubernetes/Install kubernetes k0sctl
* 2-Despliegue de Aplicaciones Kubernetes/Laboratorio Instalar Cluster Kubernetes Alumnos (kubeadm)
* https://k0sproject.io
* Lens (portainer para k8s)
=== extra
* ''kubectl get pod -A -o wide''
* ''kubectl -n kube-system describe pod kube-flannel...'' -> ConfigMap <- 1 pod en cada nodo (servicio global en Swarm)
* HELM:
* yum o apt en k8s
* kubeapps hub
* RBAC - reglas de acceso
* [[https://ngrok.com/]]