|
| 1 | +# Parte 3: ReplicaSets y Deployments |
| 2 | + |
| 3 | +# Empezamos creando un pod de la API go-hello-world |
| 4 | +kubectl run helloworld --image lemoncodersbc/go-hello-world |
| 5 | +# Etiquetamos el pod |
| 6 | +kubectl label pod helloworld app=helloworld |
| 7 | +# Vamos a crear un ReplicaSet. No hay manera de hacerlo imperativamente. |
| 8 | +kubectl get pod helloworld -o yaml > helloworld-pod |
| 9 | +# Borramos el pod |
| 10 | +kubectl delete pod helloworld |
| 11 | +# Limpiar "a mano" el YAML y convertirlo a un yaml de ReplicaSet |
| 12 | +# El fichero está en helloworld-rs.yaml |
| 13 | +kubectl create -f helloworld-rs.yaml |
| 14 | +# En este momento deben haber dos pods de helloworld |
| 15 | +# Vamos a crear un tercero. |
| 16 | +kubectl run helloworld --image lemoncodersbc/go-hello-world |
| 17 | +# Se ha creado? Se está ejecutando? |
| 18 | +# Etiquetamos el pod de nuevo |
| 19 | +kubectl label pod helloworld app=helloworld |
| 20 | +# Qué ha ocurrido al etiquetar el pod? Por qué? |
| 21 | + |
| 22 | +# Recuerda: El ReplicaSet gestiona determinados pods y se basa en las etiquetas que tengan esos pods. |
| 23 | +# Para el ReplicaSet dos pods que tengan la misma etiqueta son "iguales". |
| 24 | + |
| 25 | +# Vamos a exponer el RS usando un servicio. Puedes ver el yaml del servicio: |
| 26 | +kubectl expose rs/helloworld-rs --port 80 --name helloworld-svc --dry-run=client -o YAML |
| 27 | +# Vamos a aplicar dicho yaml |
| 28 | +# TIP de kubectl: Observa el create -f -. Eso significa -f <stdin> |
| 29 | +kubectl expose rs/helloworld-rs --port 80 --name helloworld-svc --dry-run=client -o YAML | kubectl create -f - |
| 30 | + |
| 31 | +# El servicio es de tipo ClusterIP. Podemos probarlo con port-forward |
| 32 | +kubectl port-forward svc/helloworld-svc 9000:80 |
| 33 | +wget -qO- localhost:9000 |
| 34 | + |
| 35 | +# Actualiza el servicio a tipo NodePort / LoadBalancer (depende de tu kubernetes) |
| 36 | +# k8s en MV: Usa NodePort |
| 37 | +# minikube: Usa LoadBalancer |
| 38 | + |
| 39 | +kubectl delete svc helloworld-svc |
| 40 | +kubectl expose rs/helloworld-rs --port 80 --name helloworld-svc --type NodePort # O LoadBalancer |
| 41 | +kubectl get svc |
| 42 | +# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE |
| 43 | +# helloworld-svc LoadBalancer 10.108.173.114 <pending> 80:30430/TCP 27s |
| 44 | + |
| 45 | +# En el caso de NodePort el segundo puerto (30430) es el puerto donde está escuchando el servicio en cualquiera |
| 46 | +# de los nodos del clúster. Haz un curl a http://<ip-nodo-cluster>:<puerto> y te responderá |
| 47 | + |
| 48 | +# En el caso de LoadBalancer el valor de EXTERNAL-IP te indica la IP a la que debes apuntar. En este caso |
| 49 | +# el puerto es 80 (el balanceador hace la redirección interna al puerto del nodo del clúster). |
| 50 | +# Minikube es especial (ya que usa LoadBalancer sin existir un balanceador real) |
| 51 | +# Debes teclear |
| 52 | +# minikube service helloworld-svc |
| 53 | +# Eso crea un tunel y te da un puerto temporal sobre localhost: |
| 54 | + |
| 55 | +#|-----------|----------------|-------------|---------------------------| |
| 56 | +#| NAMESPACE | NAME | TARGET PORT | URL | |
| 57 | +#|-----------|----------------|-------------|---------------------------| |
| 58 | +#| default | helloworld-svc | 80 | http://192.168.49.2:30430 | |
| 59 | +#|-----------|----------------|-------------|---------------------------| |
| 60 | +#🏃 Starting tunnel for service helloworld-svc. |
| 61 | +#|-----------|----------------|-------------|------------------------| |
| 62 | +#| NAMESPACE | NAME | TARGET PORT | URL | |
| 63 | +#|-----------|----------------|-------------|------------------------| |
| 64 | +#| default | helloworld-svc | | http://127.0.0.1:44319 | |
| 65 | +#|-----------|----------------|-------------|------------------------| |
| 66 | +#🎉 Opening service default/helloworld-svc in default browser... |
| 67 | +#👉 http://127.0.0.1:44319 |
| 68 | +#❗ Because you are using a Docker driver on linux, the terminal needs to be open to run it. |
| 69 | + |
| 70 | +# Escalamos la replica |
| 71 | +kubectl scale rs helloworld --replicas=4 |
| 72 | + |
| 73 | +# Deployments |
| 74 | + |
| 75 | +# Empecemos por ver el YAML de un deployment: |
| 76 | +kubectl create deployment helloworld --image=lemoncodersbc/go-hello-world --port=80 --replicas=3 --dry-run=client -o yaml |
| 77 | +# Creamos el deployment |
| 78 | +kubectl create deployment helloworld --image=lemoncodersbc/go-hello-world --port=80 --replicas=3 --dry-run=client -o yaml | kubectl create -f - |
| 79 | +kubectl get deployment # Aparece un deployment |
| 80 | +kubectl get pods # Aparecen 3 pods |
| 81 | +kubectl get rs # Aparece 1 replica set |
| 82 | +# Podemos escalar el deployment direcamente. NO HAY NECESIDAD DE INTERACCIONAR CON EL RS |
| 83 | +kubectl scale deployment helloworld --replicas=4 # Eso escala el replicaset asociado al deployment. |
| 84 | +# Exponemos el deployment |
| 85 | +kubectl expose deployment helloworld --port 80 --name helloworld-svc --type LoadBalancer |
| 86 | + |
| 87 | +# Limpieza |
| 88 | +kubectl delete svc helloworld-svc |
| 89 | +kubectl delete deploy helloworld |
| 90 | + |
| 91 | +# ROLLOUTS |
| 92 | +# Empecemos por generar el escenario inicial: Un ReplicaSet (2 replicas) y un servicio |
| 93 | +kubectl create -f rollouts-begin.yaml |
| 94 | + |
| 95 | +# Ahora actualizamos la imagen de los pods asociados al replicaset |
| 96 | +kubectl set image rs helloworld-rs *=lemoncodersbc/go-hello-world:invalidtag |
| 97 | +# No ocurre nada, ya que los pods siguen corriendo. Hay que forzar que el rs cree los pods nuevos. |
| 98 | +# Para ello escalamos a 0 y luego a 2 |
| 99 | +kubectl scale rs helloworld-rs --replicas=0 |
| 100 | +kubectl scale rs helloworld-rs --replicas=2 |
| 101 | +# ¿Resultado? Los pods están en ImageErrPull |
| 102 | +kubectl delete -f rollouts-begin.yaml # Limpieza |
| 103 | + |
| 104 | +# Vamos a verlo con deployments |
| 105 | +kubectl create -f rollouts2-begin.yaml |
| 106 | + |
| 107 | +# Actualizar la imagen del deploy |
| 108 | +kubectl set image deployment helloworld *=lemoncodersbc/go-hello-world:invalidtag |
| 109 | +# Qué ha ocurrido? |
| 110 | +# Ahora tenemos 3 pods. Uno con ImageErrPull y los 2 iniciales |
| 111 | +kubectl get po # Muestra 3 pods |
| 112 | +kubectl get rs # Muestra 2 replicasets |
| 113 | +kubectl get deploy # Muestra 1 solo deployment |
| 114 | + |
| 115 | +# Cual es el estado del rollout? |
| 116 | +kubectl rollout status deploy helloworld |
| 117 | + |
| 118 | +# Cual es el histórico de cambios |
| 119 | +kubectl rollout history deploy helloworld |
| 120 | + |
| 121 | +# Volvemos para atrás |
| 122 | +kubectl rollout undo deploy helloworld |
| 123 | + |
| 124 | +# Cual es la nueva situación? |
| 125 | +kubectl get po # Muestra 3 pods |
| 126 | +kubectl get rs # Muestra 2 replicasets. 1 (el nuevo) con 0 replicas deseadas |
| 127 | +kubectl get deploy # Muestra 1 solo deployment |
| 128 | + |
| 129 | +kubectl delete -f rollouts2-begin.yaml # Limpieza |
| 130 | + |
| 131 | +# Vamos a ver ahora un rollout correcto |
| 132 | + |
| 133 | + |
0 commit comments