- Un servicio es quien permite a un deployment ser accedido de diferentes formas
- Actualmente accedemos al servicio con rsh o la terminal, pero esto no es el proceso normal sino que debemos crear un servicio

- Existen 3 tipos de servicios
- ClusterIp: como por ejemplo para un servicio mysql donde la bd no se debe exporner si no que otros cluster acceden a él
- NodePort: para servicios como apache puerto 80 que habilita una ip y un puerto
- LoadBalancer: para servicios basados en nube donde se conectan a Loadbalancer de servicios como aws, google cloud,etc

- Entonces el servicio apunta a los pod’s através de un SELECTOR ( es decir una etiqueta)

Crear Servicio
1. Comando:
- Para crear el servicio vamos a trabar con el deploy de apache1 creado en la clase anterior

- Este un servicio web debe ser accedido desde afuera del cluster por tanto tiene que ser tipo NodePort

- Verificamos que el deploy este corriendo
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519_openshift
export KUBECONFIG=/home/cgi/okd-install/auth/kubeconfig
oc get deploy apache1

- Creamos el servicio
oc expose --name=apache1-svc deploy apache1 --type=NodePort
- –name=apache1-svc: nombre del servicio, si no se pone se crea con el mismo nombre del deploy svc = servicio
- deploy apache1: nombre del deploy asociado
- –type=NodePort: tipo de servicio
- Resultado

- Y podemos consultar los servicios
oc get svc

- Aquí vemos que mapea el puerto 80 del servicio al puerto 30706
- Ahora para acceder y probar el servicio normalmente se hace con router pero todavia no vamos a entrar en esto
- Por esto para ver si el servicio esta corriendo de manera correcta
- Primero obtenemos la información de los pods para ver en que worker se estan publicando
oc get pods --show-labels -o wide

- Con base en esto podemos ver que estan publicados en los workers compute1 y compute3
- y si ahora obtenemos la información de los nodos
oc get nodes -o wide
- podemos las ips de los nodos

- Por tanto ahora podriamos abrir el navegador con las ip’s de los nodos y el número de puerto del servicio
- vemos como funciona
- http://10.0.2.241:30706/
- http://10.0.2.243:30706/

- Esto lo podemos ver en la web en Redes -> Servicios

- Aquí podemos notar que ha heredado las etiquetas del deploy
- Y que en el SELECTOR ha establecido que va a trabajar con los pods que tengan la etiqueta app=ejemplo-apache
- Y la ip y puerto que esta escuchando

- Si ingresamos al servicio
- Podemos ver sus etiquetas (y modificarlas)
- El selector
- y el mapeo

- Y si vamos a pods podemos ver los pods que tienen la etiqueta app=ejemplo-apache

2. Desde la Web
- Para crear un servicio desde la web
- Primero vamos a crear un nuevo deplyment utilizando nginx
# Crear deplyoyment
oc create deployment nginx-dep --image=nginx
# consultar
oc get deply

- y consultamos los pods
oc get pod

- Ahora hay que recordar que el servicio necesita encontrar los pods por un SELECTOR
- Por tanto necesitamos saber las etiquetas que tienen los pods del deploy
- para esto ejecutamos
oc get pods -o wide --show-labels
- Podemos observar que a los pods que pertenecen a un deploy siempre les pone la etiqueta app=nombre_deploy para esta caso app=nginx-dep

- Ahora vamos a la web Redes -> Servicios -> Crear Servicio

- Solo se puede crear através de un yaml
- Aquí debemos modificar
- name: nginx-svc: nombre del servicio
- namespace: desa1: verificar el namespace
- app: nginx-dep: el selector de los pods
- port: 80:
- targetPort: 80: puerto a la escucha en los pods
- nodePort: 31800: puerto para ingresar al servicio
- type: NodePort: tipo de servicio
NOTA:
* Es bueno copiar el codigo y pegarlo en un bloc de notas ya que cuando se le da crear y da algún error esto se borra entonces para no perder el trabajo es bueno guardarlo
* En la parte de la selección del puerto es bueno realizar una parte de planificación del servicio para definir cual puerto utilizar y tener un inventario de estos puertos
- Pegamos el código
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: desa1
spec:
selector:
app: nginx-dep
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 31800
type: NodePort
- Le damos crear

- Se crea el servicio

- Ya podriamos comprobar el servicio

- Tambien podriamos ingresar a Cargas de trabajo -> Topologia -> deploy: nginx-dep -> Recursos
- Y observar que tenemos los pods y los servicios relacionados

- De igual forma si ejecuto
oc describe svc nginx-svc
- Podemos ver sus endpoints

3. Desde YAML
- En el provisioner
- Creamos un yaml
nano /home/cgi/okd-install/yamlPruebas/crear_deploy_y_servicio.yaml
- Y le pegamos
#Crear un Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web1
spec:
selector:
matchLabels:
app: web1
replicas: 2 # indica al controlador que ejecute 2 pods
template: # Plantilla que define los containers
metadata:
labels:
app: web1
spec:
containers:
- name: nginx-tavo
image: nginx
ports:
- containerPort: 80
---
# Crear el servicio asociado
apiVersion: v1
kind: Service
metadata:
name: web1-svc
labels:
app: web1
spec:
type: NodePort
ports:
- port: 80
nodePort: 30002
protocol: TCP
selector:
app: web1
- Debemos notar que para separar al deploy del service están estas lineas
---

- Resultado

- Podemos verificar
oc get deploy web1
oc get rs
oc get pods
oc get svc

- Y verificamos desde el navegador
- http://10.0.2.241:30002/
- http://10.0.2.242:30002/
- http://10.0.2.243:30002/