https://birthday.play-with-docker.com/kubernetes-docker-desktop/
https://kubernetes.io/es/docs/tasks/tools/install-minikube/
https://kubernetes.io/es/docs/tasks/tools/install-kubectl/
https://github.com/kubernetes/kompose → Para transformar docker-compose en definiciones de kubernetes
https://github.com/ahmetb/kubectx → Para cambiar facilmente el cluster o entorno al que apuntamos con kubectl
Repositorio: https://github.com/santiestra/kubernetes-example
Tenemos dos servicios: HelloService y ApiGateway
HelloService expone un endpoint /
y ApiGatweay redirige la ruta /hello
a ese endpoint.
Pasos:
-
Probemos lo que tenemos hecho con docker-compose, si corremos
docker-compose up
tenemos Api Gateway que es accesible desde el puerto 4444, mientras que Hello Service no es accesible desde fuera de la red privada de docker-compose. -
Ahora queremos replicar eso en kubernetes
-
En este caso vamos a subir nuestras imagenes a DockerHub, pero podria ser cualquier otro repositorio de imagenes, como AWS ECR. Hacemos
docker login
con nuestro user y pass. -
Entramos a la carpeta
api-gateway
y corremosdocker build -t nombreUsuario/kube-api-gateway .
y luegodocker push nombreUsuario/kube-api-gateway
-
Hacemos lo mismo con
hello-service
,docker build -t nombreUsuario/kube-hello-service .
y luegodocker push nombreUsuario/kube-hello-service
-
Creamos a modo de ejemplo el deployment de Api Gateway
kubectl create deployment api-gateway --port=3456 --image=nombreUsuario/kube-api-gateway:latest
. Podemos ver nuestros deployments corriendokubectl get deployments
-
Podemos ver que levanto un
pod
corriendokubectl get pods
-
Creamos un "service" para el deployment de Api Gateway, para exponerlo al mundo exterior, y con un Load Balancer.
kubectl expose deployment api-gateway --type=LoadBalancer --port=3456
Con el comandokubectl get service api-gateway
vemos los detalles del servicio que acabamos de crear. -
Por ahora si usamos el endpoint, falla, porque el servicio Hello no existe aun.
-
Veamos como escalar un servicio,
kubectl scale deployments/api-gateway --replicas=4
. Luego de esto, veamos el estado de nuestro cluster, conkubectl get deployments
ykubectl get pods
-
Podemos ver como hacer un rolling update:
kubectl set image deployments/api-gateway kube-api-gateway=nombreUsuario/kube-api-gateway
. Podemos agregarle otro tag, por ejemplo:v2
, si se buildeo y pusheo con ese nuevo tag. -
Hacer toda esta config con comandos es muy engorroso, lo comun es usar archivos de config.
-
Antes, eliminemos lo que hemos hecho hasta con
kubectl delete service api-gateway
ykubectl delete deployment api-gateway
-
Vamos a probar transformar nuestra config de docker-compose a kubernetes con la libreria kompose. Luego de instalarla, creemos una carpeta llamada
kompose-files
y corramoskompose convert -o kompose-files
. Veamos esos archivos en nuestro editor de codigo. -
De esos archivos, cambiemos el nombre de las imagenes a las pusheadas a docker hub.
-
Tambien, cambiemos el service para que exponga una IP publica con LoadBalancer. Cambiamos las partes de
spec
ystatus
de la siguiente manera:spec: ports: - protocol: TCP port: 4444 targetPort: 3456 selector: io.kompose.service: api-gateway type: LoadBalancer status: loadBalancer: ingress: - ip: localhost
-
Apliquemos esos archivos con
kubectl apply -f kompose-files
-
No nos genero un service para hello-service ya que no exponia ningun puerto en docker-compose.yml... creemoslo nosotros. Este no queremos que se exponga al exterior, pero si al cluster.
apiVersion: v1 kind: Service metadata: name: hello-service spec: selector: io.kompose.service: hello-service ports: - protocol: TCP port: 3333 targetPort: 3456
-
Tambien cambiemos la variable de entorno del api gateway deployment:
http://hello-service:3333
-
Apliquemos los cambios
kubectl apply -f kompose-files
-
Ahora si hacemos
curl localhost:4444/hello
, funciona! -
Probemos cambiar la cantidad de replicar, 3 de Api Gateway y 5 de Hello Service, y hagamos apply.