informatica:linux:docker:kubernetes
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
informatica:linux:docker:kubernetes [2022/06/25 08:48] – [Persistentes] javi | informatica:linux:docker:kubernetes [2022/07/09 17:52] – [Nginx NodePort daemonset (usar este)] javi | ||
---|---|---|---|
Line 529: | Line 529: | ||
Resumen de máquinas, nombres, IPs, etc. (las IPs públicas están cambiadas) | Resumen de máquinas, nombres, IPs, etc. (las IPs públicas están cambiadas) | ||
- | ^ DNS ^ IP privada | + | ^ DNS ^ IP pública |
| k8s.legido.com | | k8s.legido.com | ||
| k8s1 | 1.2.3.5 | 10.0.0.2 | Primer control plane | | | k8s1 | 1.2.3.5 | 10.0.0.2 | Primer control plane | | ||
- | | k8s2 | 1.2.3.6 | 10.0.0.2 | Segundo control plane | | + | | k8s2 | 1.2.3.6 | 10.0.0.3 | Segundo control plane | |
- | | k8s3 | 1.2.3.7 | 10.0.0.2 | Tercer control plane | | + | | k8s3 | 1.2.3.7 | 10.0.0.4 | Tercer control plane | |
==== Load balancer ==== | ==== Load balancer ==== | ||
Line 1269: | Line 1269: | ||
* IPs privadas de los workers del clúster | * IPs privadas de los workers del clúster | ||
- | * Puertos en los que escuchan los Nodeport tanto HTTP como HTTPS. Ver paso 8 de [[informatica: | + | * Puertos en los que escuchan los Nodeport tanto HTTP como HTTPS. Ver paso 8 de [[informatica: |
* [[https:// | * [[https:// | ||
Line 1585: | Line 1585: | ||
[[https:// | [[https:// | ||
- | ==== Nginx NodePort | + | ==== Nginx NodePort |
Con este procedimiento podremos obtener la IP de origen en los pods, con las otras aproximaciones todavía no lo he conseguido. | Con este procedimiento podremos obtener la IP de origen en los pods, con las otras aproximaciones todavía no lo he conseguido. | ||
Line 1591: | Line 1591: | ||
Características: | Características: | ||
- | * Usaremos [[https:// | + | * Usaremos [[https:// |
- | * Usaremos | + | * Usaremos |
* Usaremos " | * Usaremos " | ||
- | * La contrapartida a la regla anterior es que usaremos [[https:// | ||
1. Conectarse al master | 1. Conectarse al master | ||
Line 1600: | Line 1599: | ||
ssh k8s2 | ssh k8s2 | ||
- | 2. Obtener el [[https:// | + | 2. Obtener el [[https:// |
- | wget https:// | + | wget https:// |
- | + | ||
- | 3. Añadir réplicas, tantas como worker nodes, en este ejemplo 3. Editar: | + | |
- | + | ||
- | vim deploy.yaml | + | |
- | + | ||
- | Y añadir ' | + | |
- | + | ||
- | < | + | |
- | # Source: ingress-nginx/ | + | |
- | apiVersion: apps/v1 | + | |
- | kind: Deployment | + | |
- | metadata: | + | |
- | labels: | + | |
- | helm.sh/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | name: ingress-nginx-controller | + | |
- | namespace: ingress-nginx | + | |
- | spec: | + | |
- | </ | + | |
- | + | ||
- | Por: | + | |
- | + | ||
- | < | + | |
- | # Source: ingress-nginx/ | + | |
- | apiVersion: apps/v1 | + | |
- | kind: Deployment | + | |
- | metadata: | + | |
- | labels: | + | |
- | helm.sh/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | name: ingress-nginx-controller | + | |
- | namespace: ingress-nginx | + | |
- | spec: | + | |
- | # Tantas replicas como node worker | + | |
- | replicas: 3 | + | |
- | </ | + | |
| | ||
- | 4. Forzar que los pods solo envien tráfico a los deployments, | + | 3. Forzar que los pods solo envien tráfico a los deployments, |
vim deploy.yaml | vim deploy.yaml | ||
Line 1694: | Line 1649: | ||
</ | </ | ||
- | 5. Forzar que solo haya un pod de tipo nginx ingress controller corriendo en cada worker node, y que no levante ninguno de esos pods en los control plane. Lo hacemos añadiendo la clave ' | + | 4. **AVISO** En la última versión ya es " |
- | vim deploy.yml | + | Reemplazar para el tipo de balanceo para el servicio |
- | + | ||
- | Y cambiar: | + | |
- | + | ||
- | < | + | |
- | # Source: ingress-nginx/ | + | |
- | apiVersion: apps/v1 | + | |
- | kind: Deployment | + | |
- | metadata: | + | |
- | labels: | + | |
- | helm.sh/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | name: ingress-nginx-controller | + | |
- | namespace: ingress-nginx | + | |
- | spec: | + | |
- | # We need one pod running on each node | + | |
- | replicas: 3 | + | |
- | selector: | + | |
- | matchLabels: | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | revisionHistoryLimit: | + | |
- | minReadySeconds: | + | |
- | template: | + | |
- | metadata: | + | |
- | labels: | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | spec: | + | |
- | </ | + | |
- | + | ||
- | Por: | + | |
- | + | ||
- | < | + | |
- | # Source: ingress-nginx/ | + | |
- | apiVersion: apps/v1 | + | |
- | kind: Deployment | + | |
- | metadata: | + | |
- | labels: | + | |
- | helm.sh/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | name: ingress-nginx-controller | + | |
- | namespace: ingress-nginx | + | |
- | spec: | + | |
- | # We need one pod running on each node | + | |
- | replicas: 3 | + | |
- | selector: | + | |
- | matchLabels: | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | revisionHistoryLimit: | + | |
- | minReadySeconds: | + | |
- | template: | + | |
- | metadata: | + | |
- | labels: | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | spec: | + | |
- | affinity: | + | |
- | # Prevent starting pod in a node which already have one pod started | + | |
- | podAntiAffinity: | + | |
- | requiredDuringSchedulingIgnoredDuringExecution: | + | |
- | - labelSelector: | + | |
- | matchExpressions: | + | |
- | - key: app.kubernetes.io/ | + | |
- | operator: In | + | |
- | values: | + | |
- | - controller | + | |
- | topologyKey: | + | |
- | # Prevent starting pod in the master node | + | |
- | nodeAffinity: | + | |
- | requiredDuringSchedulingIgnoredDuringExecution: | + | |
- | nodeSelectorTerms: | + | |
- | - matchExpressions: | + | |
- | - key: node-role.kubernetes.io/ | + | |
- | operator: DoesNotExist | + | |
- | </ | + | |
- | + | ||
- | 6. Reemplazar para el tipo de balanceo para el servicio | + | |
vim deploy.yml | vim deploy.yml | ||
Line 1860: | Line 1725: | ||
</ | </ | ||
- | 7. Instalar. Ejecutar: | + | 5. Instalar. Ejecutar: |
kubectl apply -f deploy.yaml | kubectl apply -f deploy.yaml | ||
- | 8. Probar | + | 6. Probar |
- | 8.1. Ejecutar: | + | 6.1. Ejecutar: |
kubectl get pods \ | kubectl get pods \ | ||
Line 1885: | Line 1750: | ||
**IMPORTANTE**: | **IMPORTANTE**: | ||
- | 8.2. Verificar que efectivamente cada servicio (ingress controller) corre en un node worker distinto. Ejecutar: | + | 6.2. Verificar que efectivamente cada servicio (ingress controller) corre en un node worker distinto. Ejecutar: |
kubectl get nodes | kubectl get nodes | ||
Line 1909: | Line 1774: | ||
Todo correcto, cada worker tiene al menos un pod corriendo. | Todo correcto, cada worker tiene al menos un pod corriendo. | ||
- | 8.3. Comprobar la versión. Ejecutar: | + | 6.3. Comprobar la versión. Ejecutar: |
< | < | ||
Line 1930: | Line 1795: | ||
</ | </ | ||
- | 9. Obtener los puertos expuestos. Esto es necesario para instalar y configura el edge router. Ejecutar: | + | 7. Obtener los puertos expuestos. Esto es necesario para instalar y configura el edge router. Ejecutar: |
kubectl get services -n ingress-nginx --field-selector metadata.name=ingress-nginx-controller | kubectl get services -n ingress-nginx --field-selector metadata.name=ingress-nginx-controller | ||
Line 1946: | Line 1811: | ||
* HTTPS => 30893 | * HTTPS => 30893 | ||
- | 10. [[informatica: | + | 8. **AVISO** Este paso está deprecated. Solo hay que hacerlo si se va a usar un edge router con balanceador capa 7. NO hay que hacerlo, eso lo hice en un primer intento. El balanceador que hay que poner en el edge router tiene que ser capa 4, por tanto NO hay que habilitar proxy protocol. |
+ | [[informatica: | ||
+ | |||
+ | ==== Actualizar nginx ingress controller ==== | ||
+ | |||
+ | 1. Comprobar si es posible una actualización | ||
+ | |||
+ | 1.1. Obtemer la versión actual del nginx ingress controller | ||
+ | |||
+ | kubectl describe daemonsets.apps -n ingress-nginx ingress-nginx-controller | ||
+ | |||
+ | Resultado esperado similar a: | ||
+ | |||
+ | < | ||
+ | app.kubernetes.io/ | ||
+ | </ | ||
+ | |||
+ | Por tanto la versión actual es " | ||
+ | |||
+ | 1.2. Determinar si hay una nueva versión: | ||
+ | |||
+ | https:// | ||
+ | |||
+ | La hay, " | ||
+ | |||
+ | <code | ||
+ | 1.23, 1.22, 1.21, 1.20, 1.19 | ||
+ | </ | ||
+ | |||
+ | 1.3. Determinar la versión actual de kubectl: | ||
+ | |||
+ | kubectl version --short | ||
+ | |||
+ | Resultado esperado similar a: | ||
+ | |||
+ | < | ||
+ | Client Version: v1.24.2 | ||
+ | Kustomize Version: v4.5.4 | ||
+ | Server Version: v1.24.2 | ||
+ | </ | ||
+ | |||
+ | Tenemos kubectl versión " | ||
+ | |||
+ | 2. Actualizar la versión de la imagen del daemonset (recordad que cambiamos el " | ||
+ | |||
+ | 2.1. Comprobar que la imagen de docker (tag) existe, y obtener el SHA256, todo esto desde la máquina local | ||
+ | |||
+ | docker pull registry.k8s.io/ | ||
+ | |||
+ | Resultado esperado similar a: | ||
+ | |||
+ | < | ||
+ | v1.2.1: Pulling from ingress-nginx/ | ||
+ | 8663204ce13b: | ||
+ | 897a18b2d257: | ||
+ | 3cb02f360cf3: | ||
+ | 2b63816a7692: | ||
+ | d61ce16aa3b6: | ||
+ | 4391833fbf2c: | ||
+ | 4f4fb700ef54: | ||
+ | bb397308bcd5: | ||
+ | 803395581751: | ||
+ | 153d402a7263: | ||
+ | c815f058cf7b: | ||
+ | a872540e4aca: | ||
+ | 4972574251d0: | ||
+ | 30197fe775a6: | ||
+ | b059831ea274: | ||
+ | Digest: sha256: | ||
+ | Status: Downloaded newer image for registry.k8s.io/ | ||
+ | registry.k8s.io/ | ||
+ | </ | ||
+ | |||
+ | La imagen existe, y el SHA256 es: | ||
+ | |||
+ | sha256: | ||
+ | |||
+ | 2.2. Limpieza | ||
+ | |||
+ | docker image rm registry.k8s.io/ | ||
+ | |||
+ | 3. (k8s server) Actualizar la versión de la imagen del daemonset (paso 1.2.) y el SHA256 (paso 2.1.) | ||
+ | |||
+ | 3.1. Actualizar el daemonset: | ||
+ | |||
+ | < | ||
+ | kubectl set image daemonsets/ | ||
+ | controller=registry.k8s.io/ | ||
+ | -n ingress-nginx | ||
+ | </ | ||
+ | |||
+ | 3.2. Verificar: | ||
+ | |||
+ | kubectl get pods -n ingress-nginx -o wide | ||
+ | |||
+ | ETA: 3' | ||
+ | |||
+ | Resultado esperado similar a: | ||
+ | |||
+ | < | ||
+ | NAME | ||
+ | | ||
+ | ingress-nginx-admission-create-zxqvn | ||
+ | < | ||
+ | ingress-nginx-admission-patch-c9t4w | ||
+ | < | ||
+ | ingress-nginx-controller-6thbj | ||
+ | < | ||
+ | ingress-nginx-controller-tv9zd | ||
+ | < | ||
+ | ingress-nginx-controller-zgfw5 | ||
+ | < | ||
+ | </ | ||
==== Nginx LoadBalancer ==== | ==== Nginx LoadBalancer ==== | ||
Line 3241: | Line 3218: | ||
===== Persistentes ===== | ===== Persistentes ===== | ||
+ | |||
+ | ==== kadalu (usar este) ==== | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | 1. Instalar cliente glusterfs. | ||
+ | |||
+ | **TODO**: igual solo con el cliente mejor, pero así funciona | ||
+ | |||
+ | sudo apt install -y glusterfs-server | ||
+ | |||
+ | 2. Instalar kadalu | ||
+ | |||
+ | curl -fsSL https:// | ||
+ | |||
+ | Comprobar: | ||
+ | |||
+ | kubectl kadalu version | ||
+ | |||
+ | Salida esperada similar a: | ||
+ | |||
+ | < | ||
+ | kubectl-kadalu plugin: 0.8.15 | ||
+ | </ | ||
+ | |||
+ | Listar pods: | ||
+ | |||
+ | kubectl get pods -n kadalu | ||
+ | |||
+ | Salida esperada similar a: | ||
+ | |||
+ | < | ||
+ | NAME READY | ||
+ | kadalu-csi-nodeplugin-h8nm8 | ||
+ | kadalu-csi-nodeplugin-kfp5c | ||
+ | kadalu-csi-nodeplugin-sfgn9 | ||
+ | kadalu-csi-provisioner-0 | ||
+ | operator-57b47b555f-h6gdm | ||
+ | </ | ||
+ | |||
+ | 3. (En cada uno de los nodos de kubernetes) Crear directorio donde se almacenará el cluster de glusterfs | ||
+ | |||
+ | sudo mkdir -p / | ||
+ | |||
+ | 4. Crear el volumen del cluster de glusterfs | ||
+ | |||
+ | < | ||
+ | kubectl kadalu storage-add \ | ||
+ | storage-pool1 \ | ||
+ | --verbose \ | ||
+ | --type=Disperse \ | ||
+ | --data 2 \ | ||
+ | --redundancy 1 \ | ||
+ | --path k8s1:/ | ||
+ | --path k8s2:/ | ||
+ | --path k8s3:/ | ||
+ | </ | ||
+ | |||
+ | Salida esperada similar a: | ||
+ | |||
+ | < | ||
+ | The following nodes are available: | ||
+ | k8s1, k8s2, k8s3 | ||
+ | |||
+ | Storage Yaml file for your reference: | ||
+ | |||
+ | apiVersion: " | ||
+ | kind: " | ||
+ | metadata: | ||
+ | name: " | ||
+ | spec: | ||
+ | type: " | ||
+ | storage: | ||
+ | - node: " | ||
+ | path: "/ | ||
+ | - node: " | ||
+ | path: "/ | ||
+ | - node: " | ||
+ | path: "/ | ||
+ | disperse: | ||
+ | data: 2 | ||
+ | redundancy: 1 | ||
+ | |||
+ | Is this correct? | ||
+ | </ | ||
+ | |||
+ | Teclear " | ||
+ | |||
+ | Salida esperada similar a: | ||
+ | |||
+ | < | ||
+ | Storage add request sent successfully | ||
+ | kadalustorage.kadalu-operator.storage/ | ||
+ | </ | ||
+ | |||
+ | Listar pods: | ||
+ | |||
+ | kubectl get pods -n kadalu -o wide | ||
+ | |||
+ | Salida esperada similar a: | ||
+ | |||
+ | < | ||
+ | NAME READY | ||
+ | kadalu-csi-nodeplugin-h8nm8 | ||
+ | kadalu-csi-nodeplugin-kfp5c | ||
+ | kadalu-csi-nodeplugin-sfgn9 | ||
+ | kadalu-csi-provisioner-0 | ||
+ | operator-57b47b555f-h6gdm | ||
+ | server-storage-pool1-0-0 | ||
+ | server-storage-pool1-1-0 | ||
+ | server-storage-pool1-2-0 | ||
+ | </ | ||
+ | |||
+ | 5. Repetir para cada pod: | ||
+ | |||
+ | 5.1. Crear PVC (Persistent Volume Claim): | ||
+ | |||
+ | **IMPORTANTE**: | ||
+ | |||
+ | < | ||
+ | cat <<EOF | kubectl apply -f - | ||
+ | kind: PersistentVolumeClaim | ||
+ | apiVersion: v1 | ||
+ | metadata: | ||
+ | name: persistent-volume-claim-1 | ||
+ | spec: | ||
+ | storageClassName: | ||
+ | accessModes: | ||
+ | - ReadWriteMany | ||
+ | resources: | ||
+ | requests: | ||
+ | storage: 1Gi | ||
+ | EOF | ||
+ | </ | ||
+ | |||
+ | Un nuevo volumen persistente se ha creado: | ||
+ | |||
+ | kubectl get persistentvolume | ||
+ | |||
+ | Salida esperada similar a: | ||
+ | |||
+ | < | ||
+ | NAME | ||
+ | pvc-5df9ed7d-e77d-4910-b73b-a6145efb9c96 | ||
+ | </ | ||
+ | |||
+ | Una nueva reclamación de volumen persistente se ha creado: | ||
+ | |||
+ | kubectl get persistentvolumeclaims | ||
+ | |||
+ | Salida esperada similar a: | ||
+ | |||
+ | < | ||
+ | NAME STATUS | ||
+ | SS MODES | ||
+ | persistent-volume-claim-1 | ||
+ | | ||
+ | </ | ||
+ | |||
+ | 5.2. Crear el pod referenciando la reclamación de volumen persistente: | ||
+ | |||
+ | < | ||
+ | cat <<EOF | kubectl apply -f - | ||
+ | apiVersion: v1 | ||
+ | kind: Pod | ||
+ | metadata: | ||
+ | name: nginx-test | ||
+ | spec: | ||
+ | containers: | ||
+ | - name: nginx-test | ||
+ | image: nginx | ||
+ | volumeMounts: | ||
+ | - mountPath: "/ | ||
+ | name: nginx-test-volume | ||
+ | volumes: | ||
+ | - name: nginx-test-volume | ||
+ | persistentVolumeClaim: | ||
+ | claimName: persistent-volume-claim-1 | ||
+ | EOF | ||
+ | </ | ||
+ | |||
+ | ==== Usando glusterfs externo ==== | ||
Requisitos: | Requisitos: | ||
Line 3350: | Line 3509: | ||
NAME | NAME | ||
glusterfs | glusterfs | ||
- | < | + | </code> |
| | ||
**Resumen**: | **Resumen**: | ||
Line 3358: | Line 3517: | ||
* Lo que escriba se escribirá en el volumen " | * Lo que escriba se escribirá en el volumen " | ||
* Se pueden montar más pods, o este mismo si se tiene que recrear (porque se arrancla con " | * Se pueden montar más pods, o este mismo si se tiene que recrear (porque se arrancla con " | ||
- | |||
**TODO**: | **TODO**: | ||
Line 3365: | Line 3523: | ||
* Parece ser que para que se pueda provisionar dinámicamente parece ser que se requiere Heketi, que es un proyecto que está de capa caída | * Parece ser que para que se pueda provisionar dinámicamente parece ser que se requiere Heketi, que es un proyecto que está de capa caída | ||
- | ==== Cluster externo Glusterfs | + | === Cluster externo Glusterfs === |
Vamos a instalar un cluster de Glusterfs " | Vamos a instalar un cluster de Glusterfs " |