Implemente Pod, controlador de replicación y servicio en Kubernetes en CentOS 7

Hola Techies: En nuestro tutorial anterior, ya analizamos los pasos de instalación de Kubernetes en CentOS 7/RHEL 7. En este tutorial, analizaremos cómo podemos implementar pods, el controlador de replicación y el servicio.

Supongo que la configuración de Kubernetes ya está en funcionamiento. En caso de que no sea así, consulte la siguiente guía:

Ahora pasemos a la implementación de Pod. Pod es un grupo o varios niveles de contenedores que se lanzan en cualquiera de los nodos Worker o Minion. Para implementar un pod, primero debemos crear un archivo yml o json en el nodo maestro o en un sistema donde esté instalada la herramienta kubectl. Kubectl utilizará el archivo yml y se conectará a kube-apiserver en el puerto 6443 y luego kube-apiserver se conectará a kube-controller-manager y Kube-controller-manager se conectará aún más a Programador de Kube y el programa planificador se conecta a los nodos trabajadores usando kubelet y luego el agente kubelet se conecta al demonio docker en el nodo y lanza un contenedor basado en la definición de Pod.

Antes de comenzar a crear el archivo pod yml, primero asegúrese de tener una imagen de la ventana acoplable de prueba en el concentrador de la ventana acoplable. En mi caso, ya presioné una imagen acoplable (linuxtechi/web-server-php) en el concentrador acoplable.

Ahora vamos a crear un archivo pod.yml en el servidor maestro.

[[email protected] ~]# mkdir /techcode
[[email protected] ~]# cd /techcode/
[[email protected] techcode]# vi pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: web-server-pod
  labels:
   app: webserver-app1
   region: IN
   rack: r1
   version: "1.1"
spec:
  containers:
    - name: web-server-test-container
      image: linuxtechi/web-server-php:testversion
      ports:
      - containerPort: 80

Guardar y salir del archivo.

En el archivo que especificamos apiversion como v1, puede verificar de forma cruzada la apiversion desde el archivo «/root/.kube/config», especifique Kind como ‘Vaina‘ ya que estamos implementando pod usando este archivo yml. Especifique los metadatos y la etiqueta para el pod.

Aparte de esto, hemos mencionado la especificación del contenedor como «Nombre de la imagen» y el puerto expuesto desde el contenedor, etc.

Usar debajo ‘kubectl‘comando para implementar pod.

[[email protected] techcode]# kubectl create -f pod.yml
pod "web-server-pod" created
[[email protected] techcode]#

Verifique el estado del pod desde el nodo maestro usando el siguiente comando

[[email protected] ~]# kubectl get pods
NAME             READY     STATUS    RESTARTS   AGE
web-server-pod   1/1       Running   0          4m
[[email protected] ~]#
[[email protected] ~]# kubectl get pods -o wide
NAME             READY     STATUS    RESTARTS   AGE       IP          NODE
web-server-pod   1/1       Running   0          4m        10.32.0.2   worker-node2
[[email protected] ~]#

Según el resultado anterior, el pod se implementó en el nodo de trabajo 2. No podemos acceder a la aplicación que se ejecuta dentro del pod porque hasta ahora no hemos establecido ninguna regla de palmaditas o natting para el pod.

Vamos a crear una regla de tal manera que si alguna solicitud llega a la dirección IP del nodo de trabajo 2 en un puerto específico, debe redirigirse al pod (web-server-pod) en el puerto 80. Esto se puede lograr con el servicio. Un servicio se puede definir desde el comando o mediante un archivo yml.

Creación de un servicio desde la línea de comandos usando «kubectl exponga»

[[email protected] ~]# kubectl expose pods web-server-pod  --name=webpod-service --target-port=80  --type=NodePort
service "webpod-service" exposed
[[email protected] ~]#

El comando anterior expondrá la cápsula o el contenedor al mundo exterior. Generará el puerto aleatorio en el nodo en el que se crean los pods y podemos decir que el comando anterior hará la tarea de palmaditas por nosotros. Los usuarios externos pueden acceder a mi servidor web que se ejecuta dentro del pod con la IP del nodo junto con el puerto aleatorio.

Verifique el estado del servicio usando los siguientes comandos

[[email protected] ~]# kubectl get svc
NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes       10.96.0.1       <none>        443/TCP        2h
webpod-service   10.101.51.190   <nodes>       80:30108/TCP   2m
[[email protected] ~]#
[[email protected] ~]# kubectl get svc -o wide
NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE       SELECTOR
kubernetes       10.96.0.1       <none>        443/TCP        2h        <none>
webpod-service   10.101.51.190   <nodes>       80:30108/TCP   3m        app=webserver-app1,rack=r1,region=IN,version=1.1
[[email protected] ~]#

Ahora intente acceder al servidor web

~]# curl 192.168.1.50:30108

Podemos eliminar el servicio creado anteriormente usando el siguiente comando

[[email protected] ~]# kubectl delete svc webpod-service
service "webpod-service" deleted
[[email protected] ~]#

Creando un servicio usando un archivo yml

Cree un nuevo archivo yml con el nombre ‘servicio.yml‘ con el siguiente contenido. Esta vez, el valor del parámetro Tipo será ‘Servicio’. En el campo Especificación se menciona el puerto en el que se ejecuta el servidor web o la aplicación dentro del contenedor y NodePort es un puerto aleatorio en el nodo de trabajo. Selector indica que este servicio será aplicable para el pod cuyo parámetro de versión sea ‘1.1’, por lo que en nuestro caso este servicio será aplicable para el pod «web-server-pod»

[[email protected] techcode]# vi service.yml
apiVersion: v1
kind: Service
metadata:
 name: webpod-service
 labels:
   app: webpod-service-label
spec:
 type: NodePort
 ports:
 - port: 80
   nodePort: 30001
   protocol: TCP
 selector:
   version: "1.1"

Ahora cree el servicio ejecutando el siguiente comando

[[email protected] techcode]# kubectl create -f service.yml
service "webpod-service" created
[[email protected] techcode]#

Verifiquemos el estado del servicio usando el siguiente comando

[[email protected] techcode]# kubectl get svc
NAME             CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes       10.96.0.1      <none>        443/TCP        2h
webpod-service   10.102.18.35   <nodes>       80:30001/TCP   1m
[[email protected] techcode]#
[[email protected] techcode]# kubectl get svc -o wide
NAME             CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE       SELECTOR
kubernetes       10.96.0.1      <none>        443/TCP        2h        <none>
webpod-service   10.102.18.35   <nodes>       80:30001/TCP   2m        version=1.1
[[email protected] techcode]#

Ahora acceda a su aplicación usando el comando curl:

[[email protected] ~]# curl http://192.168.1.50:30001

La salida sería algo como a continuación

curl-access-servidor-web-kubernetes

A partir de ahora, hemos implementado un pod y su servicio. Supongamos que quiero implementar 5 pods del mismo tipo, luego se pueden implementar mediante el controlador de replicación. En resumen se llama como ‘rc‘. Cada vez que aprovisionamos pods usando rc, los pods estarán en alta disponibilidad y tolerancia a fallas, lo que significa que si algo sale mal con el pod, el clúster implementará automáticamente un pod del mismo tipo.

Implementación del controlador de replicación

El controlador de replicación también se implementa con un archivo yml mediante el comando kubectl. Vamos a crear un archivo yml para rc.

[[email protected] techcode]# vi replication-controller.yml
apiVersion: v1
kind: ReplicationController
metadata:
 name: webserver-rc
spec:
 replicas: 5
 selector:
   app:  lamp-app1
 template:
    metadata:
     labels:
       app: lamp-app1
       region: IN
       rack: r1
       version: "1.1"
    spec:
       containers:
       - name: webserver-php-con1
         image: linuxtechi/web-server-php:testversion
         ports:
         - containerPort: 80

El valor de este parámetro de tipo de tiempo es “Controlador de replicación” y bajo especificación tenemos ‘réplicas=5‘, significa que se implementarán 5 pods en los nodos de trabajo utilizando la imagen de la ventana acoplable «linuxtechi/web-server-php:testversion»

Ejecute el siguiente comando para implementar el controlador de replicación

[[email protected] techcode]# kubectl create -f replication-controller.yml
replicationcontroller "webserver-rc" created
[[email protected] techcode]#

Verifique el estado del pod y vea dónde se han aprovisionado

[[email protected] techcode]# kubectl get pods
[[email protected] techcode]# kubectl get pods -o wide

kubectl-get-pods-kubernetes

Verifique el estado del controlador de replicación usando el comando debajo de kubectl

[[email protected] techcode]# kubectl get rc
NAME           DESIRED   CURRENT   READY     AGE
webserver-rc   5         5         5         5m
[[email protected] techcode]# kubectl get rc -o wide
NAME           DESIRED   CURRENT   READY     AGE       CONTAINER(S)         IMAGE(S)                                SELECTOR
webserver-rc   5         5         5         5m        webserver-php-con1   linuxtechi/web-server-php:testversion   app=lamp-app1
[[email protected] techcode]#

Definamos el servicio para el controlador de replicación creado anteriormente.

[[email protected] techcode]# vi rc-service.yml
apiVersion: v1
kind: Service
metadata:
 name: webserver-service
 labels:
   app: webserver-service-label
spec:
 type: NodePort
 ports:
 - port: 80
   nodePort: 30002
   protocol: TCP
 selector:
   version: "1.1"

Cree el servicio usando el comando kubectl

[[email protected] techcode]# kubectl create -f rc-service.yml
service "webserver-service" created
[[email protected] techcode]#

Obtenga el estado del servicio usando el siguiente comando kubectl

[[email protected] techcode]# kubectl get svc -o wide
NAME                CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE       SELECTOR
kubernetes          10.96.0.1      <none>        443/TCP        3h        <none>
webserver-service   10.111.34.34   <nodes>       80:30002/TCP   1m        version=1.1
[[email protected] techcode]#

Ahora intente acceder al servidor web desde ambos nodos.

[[email protected] ~]# curl http://192.168.1.40:30002

Access-replication-Controller-Node1

[[email protected] ~]# rizo http://192.168.1.50:30002

Access-replication-Controller-Node2

Según el resultado anterior, podemos acceder a nuestro servidor web utilizando la dirección IP de ambos nodos de trabajo. Cada vez que accedemos al servidor web utilizando la IP de los nodos de trabajo, la solicitud se equilibra automáticamente entre los pods en los nodos.

Esto concluye el artículo. Comparta sus opiniones y comentarios en caso de que este artículo ayude a implementar y comprender los pods, el servicio y el controlador de replicación.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *