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

6 minutos de lectura
0

I want to expose the Kubernetes services running on my Amazon Elastic Kubernetes Service (Amazon EKS) cluster.

Descripción breve

Para exponer los servicios de Kubernetes que se ejecutan en tu clúster, primero cree una aplicación de muestra. A continuación, aplique los ** ClusterIP**, NodePort, y LoadBalancer Kubernetes Service Types a su aplicación de ejemplo.

Tenga en cuenta los siguientes detalles:

  • ClusterIP expone el servicio en la dirección IP interna de un clúster.
  • NodePort expone el servicio en la dirección IP de cada nodo en un puerto estático.
  • LoadBalancer expone el servicio externamente mediante un equilibrador de cargas.

Nota: Amazon EKS admite el equilibrador de carga de red y el equilibrador de carga clásico para los pods que se ejecutan en nodos de trabajo de instancias de Amazon Elastic Compute Cloud (Amazon EC2). Amazon EKS proporciona este soporte mediante un LoadBalancer. Puede equilibrar la carga del tráfico de red con un equilibrador de carga de red (destinos de instancia o IP) o un equilibrador de carga clásico (solo destino de instancia).

Resolución

Crear una aplicación de muestra

1.Defina y aplique un archivo de implementación. El siguiente ejemplo crea un ReplicaSet que activa dos pods de nginx y, a continuación, cree un archivo denominado nginx-deployment.yaml.

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.Cree la implementación:

kubectl apply -f nginx-deployment.yaml

3.Compruebe que sus pods estén funcionando y tengan sus propias direcciones IP internas:

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

Salida:

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

Crear un servicio ClusterIP

1.Cree un archivo llamado clusterip.yaml y, a continuación, establezca el tipo en ClusterIP. Por 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

2.Cree el objeto ClusterIP en Kubernetes mediante un comando declarativo o imperativo.

Para crear el objeto y aplicar el archivo clusterip.yaml, ejecute el siguiente comando declarativo:

kubectl create -f clusterip.yaml

Salida:

service/nginx-service-cluster-ip created

-o-

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

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

Salida:

service "nginx-service-cluster-ip" exposed

**Nota:**El comando expose crea un servicio sin crear un archivo YAML. Sin embargo, kubectl traduce su comando imperativo en un objeto declarativo de implementación de Kubernetes.

3.Acceda a la aplicación y obtenga el número ClusterIP:

kubectl get service nginx-service-cluster-ip

Salida:

NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx-service-cluster-ip   ClusterIP   10.100.12.153   <none>        80/TCP    23s

4.Elimine el servicio ClusterIP:

kubectl delete service nginx-service-cluster-ip

Salida:

service "nginx-service-cluster-ip" deleted

Crear un servicio NodePort

1.Para crear un servicio NodePort, cree un archivo llamado nodeport.yaml y, a continuación, defina el tipo en NodePort. Por 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

2.Cree el objeto NodePort en Kubernetes mediante un comando declarativo o imperativo.

Para crear el objeto y aplicar el archivo nodeport.yaml, ejecute el siguiente comando declarativo:

kubectl create -f nodeport.yaml

-o-

Para exponer una implementación del tipo NodePort, ejecute el siguiente comando imperativo:

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

Salida:

service/nginx-service-nodeport exposed

3.Obtenga información sobre nginx-service:

kubectl get service/nginx-service-nodeport

Salida:

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

Importante: El ServiceType es un NodePort y un ClusterIP que se crean automáticamente para el servicio. El resultado del comando anterior muestra que el servicio NodePort está expuesto externamente en el puerto (30994) de la instancia EC2 del nodo de trabajo disponible. Antes de acceder a nodeIP:nodePort desde fuera del clúster, debe configurar el grupo de seguridad de los nodos para permitir el tráfico entrante. Puede permitir que el tráfico entrante pase por el puerto (30994) que aparece en el resultado del comando kubectl get service anterior.

4.Si el nodo está en una subred pública y se puede acceder a él desde Internet, compruebe la dirección IP pública del nodo:

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

Salida:

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-

Si el nodo está en una subred privada y solo se puede acceder a él dentro o a través de una VPC, compruebe la dirección IP privada del nodo:

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

Salida:

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

5.Elimine el servicio NodePort:

kubectl delete service nginx-service-nodeport

Salida:

service "nginx-service-nodeport" deleted

Crear un servicio LoadBalancer

1.Para crear un servicio LoadBalancer, cree un archivo llamado loadbalancer.yaml y, a continuación, defina el tipo en LoadBalancer. Por 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

2.Aplique el aplicar archivo loadbalancer.yaml:

kubectl create -f loadbalancer.yaml

Salida:

service/nginx-service-loadbalancer created

-o-

Exponga una implementación del tipo LoadBalancer:

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

Salida:

service "nginx-service-loadbalancer" exposed

3.Obtenga información sobre nginx-service:

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

Salida:

NAME                        TYPE          EXTERNAL-IP                        PORT(S)
nginx-service-loadbalancer  LoadBalancer  *****.eu-west-1.elb.amazonaws.com  80:30039/TCP

4.Compruebe que puede acceder al equilibrador de cargas de forma externa:

curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title

Debería recibir el siguiente resultado entre las etiquetas de título HTML: «¡Bienvenido a nginx!»

5.Elimine el servicio LoadBalancer:

kubectl delete service nginx-service-loadbalancer

Salida:

service "nginx-service-loadbalancer" deleted

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

6.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, implemente el AWS Load Balancer Controller y, a continuación, cree un equilibrador de carga que utilice destinos IP.


OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años