3 . OKD-udemy: Servicios

  • 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
  • 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
  • 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
  • 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