¿Cómo expongo los servicios de Kubernetes que se ejecutan en mi clúster de Amazon EKS?
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.
Vídeos relacionados
Contenido relevante
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace un año
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 2 años