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
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
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
[[email protected] ~]# rizo http://192.168.1.50:30002
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.