A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Curso de Kubernetes

Curso de Kubernetes

Marcos Lilljedahl

Marcos Lilljedahl

Desplegando nuestra app en k8s

18/33
Recursos

Aportes 23

Preguntas 6

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Para los que quieren reproducir todo en local, hice lo siguiente:

Instalar Kind
Kind permite crear clusters en local con multiples nodos. Pueden seguir este video, donde al comienzo explican como instalarlo: https://www.youtube.com/watch?v=4p4DqdTDqkk

Crear el cluster
Guarden esta configuracion en un .yaml

# a cluster with 1 control-plane nodes and 5 workers
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
- role: worker
- role: worker

Creamos el cluster con kind

kind create cluster --config kind-config.yaml

Y seguimos los pasos de la clase de platzi
Exponer servicio
Posiblemente, al seguir la clase y querer acceder al WebUI colocando en el browser localhost:<<NodePort>>, se encuentren con un connnection refused. Esto, creo, sucede por que el puerto no mapea desde el localhost o 127.0.0.1, sino que Kind hace un bind con una direccion local de la maquina. Para saber cual es la direccion ip, arme este comando

docker inspect -f "{{ .NetworkSettings.IPAddress }}" $(docker ps --filter "name=kind-control-plane" -q)

Con el output, ya pueden ir al browser y acceder. EJ: http://172.17.0.7:31104

En mi caso, estoy usando Linux. Por lo que he leido, puede que en Mac o Windows no se exponga el puerto, por lo que pueden explorar crear los clusters usando extraPortMapping

listo

kubectl create deployment redis --image=redis
kubectl get all
kubectl delete service httpenv
kubectl get all
kubectl get pods
kubectl delete service httpenv
kubectl get pods
kubectl create deployment hasher --image=dockercoins/hasher:v0.1
kubeclt get pods
kubectl get pods
kubectl create deployment rng --image=dockercoins/rng:v0.1
kubectl get pods
kubectl create deployment webui --image=dockercoins/webui:v0.1
kubectl get pods
kubectl create deployment worker --image=dockercoins/worker:v0.1
kubectl logs deploy/rng
kubectl logs deploy/worker
kubectl expose deployment redis --port 6379
kubectl expose deployment rng --port 80
kubectl expose deployment hasher --port 80
kubectl expose deploy/webui --type=NodePort --port=80

Para aquellos que estamos utilizando minikube, al momento de exponer el servicio webui para ingresar a la aplicaci贸n DockerCoin, tuve que ejecutar un comando de minikube para que me expusiera el servicio, y es el siguiente:

minikube service webui

Con esto minikube realiza un tunel para que podamos ingresar al servicio webui desde localhost.

Yo lo trabaj茅 de forma local en Mac con Kind.

Para instalarlo se pueden seguir los pasos en la p谩gina: https://kind.sigs.k8s.io/docs/user/quick-start/

Para poder ver el webui desde la m谩quina local hay que exponer el puerto en el cluster por medio de extraPortMappings. Este es el archivo de configuraci贸n que utilic茅 para trabajar con 5 nodos:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4

nodes:
  - role: control-plane
    extraPortMappings:
    - containerPort: 31671
      hostPort: 31671
  - role: worker
  - role: worker
  - role: worker
  - role: worker

Para crear el cluster se ejecuta la siguiente l铆nea (config.yml es el nombre del archivo yaml):

kind create cluster --config config.yml

Para exponer el servicio de webui el nodePort del servicio debe ser el mismo que se configur贸 en el cluster, yo lo realic茅 por medio de un archivo yaml con la siguiente configuraci贸n:

apiVersion: v1
kind: Service
metadata:
  name: webui
  labels:
    run: webui
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 31671
      protocol: TCP
  selector:
    app: webui

Para crear final mente el servicio se ejecuta la l铆nea (webui-svc.yml es el nombre del archivo yaml):

kubectl apply -f webui-svc.yml

Para todas las personas que siguen el curso con minikube les informo que deben crear el cluster con los nodos desde el inicio. Si se agrega el nodo luego de que se cree el cluster default con un nodo 煤nico tendran problemas al referenciar los servicios con su nombre, por ejemplo, no funcionar谩 poner 鈥榬edis:6379鈥 en lugar de la ip del servicio.


El comando a utilizar es:

minikube start --nodes 2 -p multinode-demo

Donde 鈥2鈥 es el n煤mero de nodos que se desea agregar y 鈥渕ultinode-demo鈥 es el nombre del cluster.


Si ya se tiene un cluster creado y no queremos utilizar mucho espacio en disco podemos usar el siguiente comando para borralo.

minikube delete -p cluster-name

Adicionalmente Kubernetes agrega las ip de los servicios en variables de entorno, les recomiendo este post de la documentaci贸n oficial.

Si alguien quiere ver el resultado en minikube pueden preguntar por el servicio de la siguiente manera: minikube service webui

Para quienes esten utilizando estos servicios desde un pc externo, pueden usar una external IP. Esto hace que puedan apuntar al localhost por ejemplo. Estar pendiente de que el firewall lo permita, o para fines de prueba tenerlo desactivado.

utilizar el flag --external-ip=

kubectl expose deploy/webui --type=NodePort --port=80 --external-ip=<localhost-ip> 

Como bien comentan en los aportes, quienes usamos minikube podemos utilizar el comando

minikube service webui 

Pero antes debemos tener cargado el perfil en minikube, usar el siguiente comando para obtener la lista de perfiles

minikube profile list

y para cargar el perfil usar el siguiente comando

minikube profile <nombre del perfil>

en la terminal se mostrar谩 el siguiente mensaje

鉁  minikube profile was successfully set to <nombre del perfil>

y ya con eso podemos correr el servicio desde minikube

para los que tengan problemas con redis y la webui usen la v2 de la webui en lugar de --image=webui:v0.1 usen --image=webui:v0.2

Hello!

Para quienes tienen problemas accediendo a la webui desde EKS en AWS les recomiendo hacer ->

kubectl expose deploy/webui --type LoadBalancer --port 80

Esto les dara una direccion DNS que en cuestion de minutos les estara funcionando directamente por el puerto 80! el load balaancer hace la enrutacion,.

Nota: AWS crea un Clasic load balancer para esto.

Me pas贸 algo muy extra帽o.
Segu铆 paso a paso todo y funcion贸 correctamente HASTA QUE llegu茅 al 煤ltimo paso de conectarse al webui a trav茅s de la ip del cluster.
No me fue posible conectarme y al darle:

kubectl logs deploy/webui

Apareci贸 el siguiente mensaje de error:

Buenas clases ahora si鈥 mejor explicado

#Desplegar redis
kubectl create deployment redis --image=redis

#Desplegar servicios
kubectl create deployment hasher --image=dockercoins/hasher:v0.1
kubectl create deployment rng image=dockercoins/rng:v0.1
kubectl create deployment webui --image=dockercoins/webui:v0.1
kubectl create deployment worker --image=dockercoins/worker:v0.1

#Ver log de worker
kubectl logs deploy/worker
kubectl get pods -o wide

#Exponer servicios
kubectl expose deployment redis --port 6379
kubectl expose deployment rng --port 80
kubectl expose deployment hasher --port 80

#ver Servicios
kubectl get svc

#Exponer webui como servicio publico
kubectl expose deployment webui --type=NodePort --port 80

#Revisar servicios desplegados
kubectl get all
kubectl get pods

Yo en mi caso, he utilizado mv locales, y siguiendo los pasos de la clase, me ha salido todo correcto:

parr@us2104nodo1:~$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
hasher       ClusterIP   10.98.99.40     <none>        80/TCP         8m17s
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        21d
redis        ClusterIP   10.107.100.84   <none>        6379/TCP       9m11s
rng          ClusterIP   10.99.2.27      <none>        80/TCP         8m40s
webui        NodePort    10.96.227.171   <none>        80:31341/TCP   38s

Publishing Services (ServiceTypes)
For some parts of your application (for example, frontends) you may want to expose a Service onto an external IP address, that鈥檚 outside of your cluster.

Kubernetes ServiceTypes allow you to specify what kind of Service you want. The default is ClusterIP.
.
Type values and their behaviors are:
ClusterIP: Exposes the Service on a cluster-internal IP. Choosing this value makes the Service only reachable from within the cluster. This is the default ServiceType.
.
NodePort: Exposes the Service on each Node鈥檚 IP at a static port (the NodePort). A ClusterIP Service, to which the NodePort Service routes, is automatically created. You鈥檒l be able to contact the NodePort Service, from outside the cluster, by requesting <NodeIP>:<NodePort>.
.
LoadBalancer: Exposes the Service externally using a cloud provider鈥檚 load balancer. NodePort and ClusterIP Services, to which the external load balancer routes, are automatically created.
.
ExternalName: Maps the Service to the contents of the externalName field, by returning a CNAME record with its value. No proxying of any kind is set up.
Fuente: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

repasando 馃槂

馃槂

tengo el mismo error queicolas.

Tengo el mismo problema, la webui y el worker no ven al redis. Alguien lo pudo solucionar?

Buenas,

Tengo un error, a apesar de que expuse todos los puertos, no logra conectarse el worker/webui con el redis:

_NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hasher ClusterIP 10.98.132.244 <none> 80/TCP 37m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23h
redis ClusterIP 10.110.240.2 <none> 6379/TCP 23m
rng ClusterIP 10.111.109.30 <none> 80/TCP 37m
_

Me sale los sigientes errores en los logs:

Logs Worker
kubectl logs deploy/worker

**_ File 鈥/usr/local/lib/python3.6/site-packages/redis/client.py鈥, line 673, in execute_command
connection.send_command(args)
File 鈥/usr/local/lib/python3.6/site-packages/redis/connection.py鈥, line 610, in send_command
self.send_packed_command(self.pack_command(args))
File 鈥/usr/local/lib/python3.6/site-packages/redis/connection.py鈥, line 585, in send_packed_command
self.connect()
File 鈥/usr/local/lib/python3.6/site-packages/redis/connection.py鈥, line 489, in connect
raise ConnectionError(self.error_message(e))
redis.exceptions.ConnectionError: Error -3 connecting to redis:6379. Try again.
ERROR:main:Waiting 10s and restarting.

Logs webui
kubectl logs deploy/webui
**
Redis error { [Error: Redis connection to redis:6379 failed - getaddrinfo EAI_AGAIN redis:6379]
code: 鈥楨AI_AGAIN鈥,
errno: 鈥楨AI_AGAIN鈥,
syscall: 鈥榞etaddrinfo鈥,
hostname: 鈥榬edis鈥,
host: 鈥榬edis鈥,
port: 6379 }**

Logs redis
_
1:C 30 Jul 2019 14:35:45.214 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 30 Jul 2019 14:35:45.214 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 30 Jul 2019 14:35:45.214 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 30 Jul 2019 14:35:45.218 * Running mode=standalone, port=6379.
1:M 30 Jul 2019 14:35:45.218 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 30 Jul 2019 14:35:45.218 # Server initialized
1:M 30 Jul 2019 14:35:45.218 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 鈥榚cho never > /sys/kernel/mm/transparent_hugepage/enabled鈥 as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
1:M 30 Jul 2019 14:35:45.218 * Ready to accept connections_

Me dan una mano??, as铆 continuar

graxx!!

En el momento que creaste el cluster con minikube, capaz hiciste un clear de la terminal y no sabes como se llama, podes listar los profiles con esto minikube profile list

Para saber la ip del profile, hacemos minikube ip -p nombre_profile y te dara una direccion del tipo 192. xxx .xxx .xxx

Ahi vas al browser y tipeas ip:puerto y te va a abrir el minero.

Excelente, la parte en que siempre choque y no sab铆a el 驴por que?, esta justo en este capitulo, desplegar y exponer.

Muchas gracias.

Listo todo funcionando, para ver la webui me funciono usando la IP que da minikube con el commando minikube profile list mas el puerto del servicio de webui