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/24 09:54] – [Load balancer] 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 562: | Line 562: | ||
==== Security list ==== | ==== Security list ==== | ||
- | TODO | + | Se creó una VNC siguiendo el asistente. |
+ | |||
+ | El load balancer usa la subnet pública, " | ||
+ | |||
+ | Esta tiene una security list, que hay que retocar para que: | ||
+ | |||
+ | * No permita conexiones desde la DMZ al listener kube-apiserver | ||
+ | * Permita que lleguen los health check del load balancer a los nodos | ||
+ | |||
+ | Las IPs púbicas son inventadas | ||
+ | |||
+ | ^ Stateless ^ Source ^ IP Protocol ^ Source Port Range ^ Destination Port Range ^ Description ^ | ||
+ | | No | 0.0.0.0/0 | TCP | All | 31342 | nginx-ingress-controller-https | | ||
+ | | No | 0.0.0.0/0 | TCP | All | 32386 | nginx-ingress-controller-http | | ||
+ | | No | 0.0.0.0/0 | TCP | All | 443 | listener-https | | ||
+ | | No | 0.0.0.0/0 | TCP | All | 80 | listener-http | | ||
+ | | No | 1.2.3.5/32 | All | All | All | k8s1 | | ||
+ | | No | 1.2.3.6/32 | All | All | All | k8s2 | | ||
+ | | No | 1.2.3.7/32 | All | All | All | k8s3 | | ||
+ | |||
+ | Seguramente se puede restringir una miaja, pero así funciona. | ||
+ | |||
+ | Como se juega también con los listeners no es tab abierta como parece. Por ejemplo desde la DMZ NO se llega al puerto 31342 (porque no hay listener publicado). | ||
+ | |||
+ | |||
+ | |||
Line 1243: | 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 1559: | 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 1565: | 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 1574: | 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 1668: | 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 | + | |
- | + | ||
- | 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 | + | Reemplazar para el tipo de balanceo para el servicio |
vim deploy.yml | vim deploy.yml | ||
Line 1834: | 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 1859: | 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 1883: | 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 1904: | 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 1920: | 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 2446: | Line 2449: | ||
< | < | ||
# anyadido | # anyadido | ||
+ | #- --enable-admission-plugins=NodeRestriction | ||
+ | - --enable-admission-plugins=NodeRestriction, | ||
- --default-not-ready-toleration-seconds=30 | - --default-not-ready-toleration-seconds=30 | ||
- --default-unreachable-toleration-seconds=30 | - --default-unreachable-toleration-seconds=30 | ||
Line 3207: | Line 3212: | ||
kubectl taint nodes k8s1 node-role.kubernetes.io/ | kubectl taint nodes k8s1 node-role.kubernetes.io/ | ||
kubectl taint nodes k8s1 node-role.kubernetes.io/ | kubectl taint nodes k8s1 node-role.kubernetes.io/ | ||
+ | |||
+ | ====== Volúmenes ====== | ||
+ | |||
+ | TODO | ||
+ | |||
+ | ===== 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: | ||
+ | |||
+ | * Un [[informatica: | ||
+ | * Control Plane | ||
+ | * Workers | ||
+ | * Nodos del cluster glusterfs | ||
+ | |||
+ | |||
+ | [[https:// | ||
+ | |||
+ | 1. Crear endpoints | ||
+ | |||
+ | * " | ||
+ | * " | ||
+ | |||
+ | < | ||
+ | cat <<EOF | kubectl apply -f - | ||
+ | apiVersion: v1 | ||
+ | kind: Endpoints | ||
+ | metadata: | ||
+ | name: glusterfs-cluster | ||
+ | subsets: | ||
+ | - addresses: | ||
+ | - ip: 10.0.0.2 | ||
+ | ports: | ||
+ | - port: 1 | ||
+ | - addresses: | ||
+ | - ip: 10.0.0.3 | ||
+ | ports: | ||
+ | - port: 1 | ||
+ | - addresses: | ||
+ | - ip: 10.0.0.4 | ||
+ | ports: | ||
+ | - port: 1 | ||
+ | EOF | ||
+ | </ | ||
+ | |||
+ | Comprobar: | ||
+ | |||
+ | kubectl get endpoints | ||
+ | |||
+ | Resultado esperado similar a: | ||
+ | |||
+ | < | ||
+ | NAME ENDPOINTS | ||
+ | glusterfs-cluster | ||
+ | </ | ||
+ | |||
+ | 2. Crear servicio | ||
+ | |||
+ | < | ||
+ | cat <<EOF | kubectl apply -f - | ||
+ | apiVersion: v1 | ||
+ | kind: Service | ||
+ | metadata: | ||
+ | name: glusterfs-cluster | ||
+ | spec: | ||
+ | ports: | ||
+ | - port: 1 | ||
+ | EOF | ||
+ | </ | ||
+ | |||
+ | Comprobar: | ||
+ | |||
+ | kubectl get services | ||
+ | |||
+ | Resultado esperado similar a: | ||
+ | |||
+ | < | ||
+ | NAME TYPE CLUSTER-IP | ||
+ | glusterfs-cluster | ||
+ | </ | ||
+ | |||
+ | 3. Crear pod | ||
+ | |||
+ | * Campo " | ||
+ | |||
+ | < | ||
+ | cat <<EOF | kubectl apply -f - | ||
+ | apiVersion: v1 | ||
+ | kind: Pod | ||
+ | metadata: | ||
+ | name: glusterfs | ||
+ | spec: | ||
+ | containers: | ||
+ | - name: glusterfs | ||
+ | image: nginx | ||
+ | volumeMounts: | ||
+ | - mountPath: "/ | ||
+ | name: glusterfsvol | ||
+ | volumes: | ||
+ | - name: glusterfsvol | ||
+ | glusterfs: | ||
+ | endpoints: glusterfs-cluster | ||
+ | path: gv1 | ||
+ | readOnly: false | ||
+ | EOF | ||
+ | </ | ||
+ | |||
+ | Comprobar (puede tardar 1 minuto): | ||
+ | |||
+ | kubectl get pods | ||
+ | | ||
+ | Resultado esperado similar a: | ||
+ | |||
+ | < | ||
+ | NAME | ||
+ | glusterfs | ||
+ | </ | ||
+ | | ||
+ | **Resumen**: | ||
+ | |||
+ | * El pod " | ||
+ | * En este directorio puede escribir | ||
+ | * 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 " | ||
+ | |||
+ | **TODO**: | ||
+ | |||
+ | * Nótese que la provisión de volúmenes de glusterfs NO es dinámica. Primero se crea manualmente el volumen de glusterfs y luego se referencia, manualmente, | ||
+ | * 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 === | ||
+ | |||
+ | Vamos a instalar un cluster de Glusterfs " | ||
+ | |||
+ | 1. (Cada nodo) Editar: | ||
+ | |||
+ | sudo vim /etc/hosts | ||
+ | |||
+ | Y añadir: | ||
+ | |||
+ | < | ||
+ | 10.0.0.2 k8s1 | ||
+ | 10.0.0.3 k8s2 | ||
+ | 10.0.0.4 k8s3 | ||
+ | </ | ||
+ | |||
+ | 2. (Cada nodo) Instalar: | ||
+ | |||
+ | sudo apt install -y glusterfs-server | ||
+ | |||
+ | sudo systemctl enable glusterd --now | ||
+ | |||
+ | sudo service glusterd status | ||
+ | |||
+ | q | ||
+ | | ||
+ | 3. (Desde un nodo, en este caso k8s1) Ejecutar: | ||
+ | |||
+ | sudo gluster peer probe k8s2 | ||
+ | sudo gluster peer probe k8s3 | ||
+ | |||
+ | 4. (Desde otro nodo, en este caso k8s3) Ejecutar: | ||
+ | |||
+ | sudo gluster peer probe k8s1 | ||
+ | |||
+ | 5. (Desde cualquier nodo) Ejecutar: | ||
+ | |||
+ | sudo gluster peer status | ||
+ | |||
+ | 6. Crear brick. Estas instrucciones se pueden ejecutar desde cualquier nodo del cluster | ||
+ | |||
+ | 6.1. Ejecutar: | ||
+ | |||
+ | sudo mkdir -p / | ||
+ | |||
+ | **WARNING**: | ||
+ | |||
+ | Vamos a usar el modo disperse con redundancia 1, que significa que podemos perder un máximo de un nodo y todo seguirá funcionando. | ||
+ | |||
+ | sudo gluster volume create gv1 disperse 3 redundancy 1 k8s{1..3}:/ | ||
+ | |||
+ | sudo gluster volume start gv1 | ||
+ | |||
+ | sudo gluster volume info | ||