¿Cómo expongo los servicios de Kubernetes que se ejecutan en mi clúster de Amazon EKS?

7 minutos de lectura
0

Quiero exponer los servicios de Kubernetes que se ejecutan en mi clúster de Amazon Elastic Kubernetes Service (Amazon EKS).

Resolución

Para exponer los servicios de Kubernetes que se ejecutan en tu clúster, primero crea una aplicación de muestra. A continuación, aplica el tipo de servicio de Kubernetes ClusterIP, NodePort o LoadBalancer a tu aplicación de muestra. Para obtener más información, consulta Tipo de servicio en el sitio web de Kubernetes.

Crear una aplicación de muestra

Sigue estos pasos:

  1. Define y aplica un archivo de despliegue en Kubernetes. El siguiente comando de ejemplo crea un archivo denominado nginx-deployment.yaml y, a continuación, crea un ReplicaSet que activa dos pods de nginx:

    cat <<EOF > nginx-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    EOF
  2. Para crear el despliegue, ejecuta el siguiente comando:

    kubectl apply -f nginx-deployment.yaml
  3. Para comprobar que los pods se están ejecutando y tienen sus propias direcciones IP internas, ejecuta el siguiente comando:

    kubectl get pods -l 'app=nginx' -o wide | awk {'print $1" " $3 " " $6'} | column -t

    Resultado de ejemplo:

    NAME                               STATUS   IP
    nginx-deployment-574b87c764-hcxdg  Running  192.168.20.8
    nginx-deployment-574b87c764-xsn9s  Running  192.168.53.240

Aplicar el tipo de servicio

Decide cómo quieres exponer tu aplicación y, a continuación, aplica el tipo de servicio adecuado. Para obtener información sobre cada tipo de servicio, consulta tipo: ClusterIP, tipo: NodePort y tipo: LoadBalancer en el sitio web de Kubernetes.

Tipo de servicio ClusterIP

Sigue estos pasos:

  1. Crea un archivo que se llame clusterip.yaml.

  2. Establece el tipo en ClusterIP como se muestra en el siguiente ejemplo:

    cat <<EOF > clusterip.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service-cluster-ip
    spec:
      type: ClusterIP
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    EOF
  3. Crea el objeto ClusterIP en Kubernetes mediante un comando declarativo o imperativo.
    Para crear el objeto y aplicar el archivo clusterip.yaml, ejecuta el siguiente comando declarativo:

    kubectl create -f clusterip.yaml

    Resultado de ejemplo:

    service/nginx-service-cluster-ip created>/code>

    -o-

    Para exponer una implementación del tipo ClusterIP, ejecuta el siguiente comando imperativo:

    kubectl expose deployment nginx-deployment  --type=ClusterIP  --name=nginx-service-cluster-ip

    Nota: El comando expose crea un servicio pero no crea un archivo YAML. Sin embargo, kubectl traduce tu comando imperativo en un objeto declarativo de implementación de Kubernetes.
    Resultado de ejemplo:

    service "nginx-service-cluster-ip" exposed
  4. Para obtener la dirección CLUSTER-IP, ejecuta el siguiente comando:

    kubectl get service nginx-service-cluster-ip

    Resultado de ejemplo:

    NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    nginx-service-cluster-ip   ClusterIP   10.100.12.153   <none>        80/TCP    23s
  5. Para usar la dirección CLUSTER-IP para acceder a la aplicación, ejecuta el siguiente comando:

    curl -silent 10.100.12.153:80 | grep title

    Nota: Para acceder al servicio, debes iniciar sesión en un nodo de trabajo o estar dentro del contenedor de un pod.

  6. Para eliminar el servicio ClusterIP, ejecuta el siguiente comando:

    kubectl delete service nginx-service-cluster-ip

    Resultado de ejemplo:

    service "nginx-service-cluster-ip" deleted

Tipo de servicio NodePort

Sigue estos pasos:

  1. Crea un archivo que se llame nodeport.yaml.

  2. Establece el tipo en NodePort como se muestra en el siguiente ejemplo:

    cat <<EOF > nodeport.yaml
    apiVersion: v1
    kind: Service
    metadata:  name: nginx-service-nodeport
    spec:
      type: NodePort
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    EOF
  3. Crea el objeto NodePort en Kubernetes mediante un comando declarativo o imperativo.
    Para crear el objeto y aplicar el archivo nodeport.yaml, ejecuta el siguiente comando declarativo:

    kubectl create -f nodeport.yaml

    -o-

    Para exponer un despliegue del tipo NodePort, ejecuta el siguiente comando imperativo:

    kubectl expose deployment nginx-deployment  --type=NodePort  --name=nginx-service-nodeport

    Resultado de ejemplo:

    service/nginx-service-nodeport exposed
  4. Para obtener información sobre nginx-service, ejecuta el siguiente comando:

    kubectl get service/nginx-service-nodeport

    Resultado de ejemplo:

    NAME                     TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    nginx-service-nodeport   NodePort   10.100.106.151   <none>        80:30994/TCP   27s

    Importante: NodePort crea una dirección IP de servicio a la que se puede acceder desde el clúster y usa el puerto especificado para exponer el servicio en cada nodo. El resultado del comando anterior muestra que el tipo de servicio NodePort está expuesto externamente en el puerto de la instancia de Amazon Elastic Compute Cloud (Amazon EC2) del nodo de trabajo disponible. Antes de acceder a NodeIP:NodePort desde fuera del clúster, configura los grupos de seguridad de los nodos para permitir el tráfico entrante a través del puerto que aparece en el resultado.

  5. Para los nodos que están en una subred pública y son accesibles desde Internet, comprueba la dirección IP pública del nodo:

    kubectl get nodes -o wide |  awk {'print $1" " $2 " " $7'} | column -t

    Resultado de ejemplo:

    NAME                                      STATUS  EXTERNAL-IP
    ip-10-0-3-226.eu-west-1.compute.internal  Ready   1.1.1.1
    ip-10-1-3-107.eu-west-1.compute.internal  Ready   2.2.2.2

    -o-

    Para los nodos que están en una subred privada y solo son accesibles a través de una nube privada virtual (VPC), comprueba la dirección IP privada del nodo:

    kubectl get nodes -o wide |  awk {'print $1" " $2 " " $6'} | column -t

    Resultado de ejemplo:

    NAME                                      STATUS  INTERNAL-IP
    ip-10-0-3-226.eu-west-1.compute.internal  Ready   10.0.3.226
    ip-10-1-3-107.eu-west-1.compute.internal  Ready   10.1.3.107
  6. Para usar la IP del nodo y NodePort para acceder a la aplicación, ejecuta el siguiente comando:

    curl -silent <Public/PrivateNodeIP>:30994 | grep title
  7. Para eliminar el servicio NodePort, ejecuta el siguiente comando:

    kubectl delete service nginx-service-nodeport

    Resultado de ejemplo:

    service "nginx-service-nodeport" deleted

Tipo de servicio LoadBalancer

Sigue estos pasos:

  1. Crea un archivo que se llame loadbalancer.yaml.

  2. Establece el tipo en LoadBalancer como se muestra en el siguiente ejemplo:

    cat <<EOF > loadbalancer.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service-loadbalancer
    spec:
      type: LoadBalancer
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    EOF
  3. Para aplicar el archivo loadbalancer.yaml, ejecuta el siguiente comando:

    kubectl create -f loadbalancer.yaml

    Resultado de ejemplo:

    service/nginx-service-loadbalancer created

    -o-

    Para exponer una implementación del tipo LoadBalancer, ejecuta el siguiente comando:

    kubectl expose deployment nginx-deployment  --type=LoadBalancer  --name=nginx-service-loadbalancer

    Resultado de ejemplo:

    service "nginx-service-loadbalancer" exposed
  4. Para obtener información sobre nginx-service, ejecuta el siguiente comando:

    kubectl get service/nginx-service-loadbalancer |  awk {'print $1" " $2 " " $4 " " $5'} | column -t

    Resultado de ejemplo:

    NAME                        TYPE          EXTERNAL-IP                        PORT(S)
    nginx-service-loadbalancer  LoadBalancer  *****.eu-west-1.elb.amazonaws.com  80:30039/TCP
  5. Para comprobar que puedes acceder externamente al equilibrador de carga, ejecuta el siguiente comando:

    curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title
  6. Para eliminar el servicio LoadBalancer, ejecuta el siguiente comando:

    kubectl delete service nginx-service-loadbalancer

    Resultado de ejemplo:

    service "nginx-service-loadbalancer" deleted

Nota: De forma predeterminada, el tipo de servicio LoadBalancer crea un equilibrador de carga clásico.

Para crear un equilibrador de carga de red con un objetivo de tipo de instancia, agrega la siguiente anotación al manifiesto de servicio:

service.beta.kubernetes.io/aws-load-balancer-type: nlb

-o-

Para crear un equilibrador de carga de red con destinos IP, despliega AWS Load Balancer Controller y, a continuación, crea un equilibrador de carga que utilice destinos IP.