Comment exposer les services Kubernetes exécutés sur mon cluster Amazon EKS ?

Date de la dernière mise à jour : 15/05/2020

Je souhaite exposer les services Kubernetes exécutés sur mon cluster Amazon Elastic Kubernetes Service (Amazon EKS).

Brève description

Les étapes de résolution suivantes vous montrent comment créer un exemple d'application et appliquent ensuite les types de services Kubernetes suivants à votre exemple d'application : ClusterIP, NodePort, et LoadBalancer.

Gardez à l'esprit les points suivants :

  • ClusterIP expose le service sur une adresse IP interne au cluster.
  • NodePort expose le service sur l'adresse IP de chaque nœud à un port statique.
  • LoadBalancer expose le service en externe à l'aide d'un équilibreur de charge.

Remarque : Amazon EKS prend en charge Network Load Balancer et Classic Load Balancer pour les pods s'exécutant sur les nœuds de travail de l'instance Amazon Elastic Compute Cloud (Amazon EC2) via LoadBalancer. Amazon EKS ne prend pas en charge Network Load Balancer et Classic Load Balancer pour les pods s'exécutant sur AWS Fargate. Pour l'entrée Fargate, une bonne pratique consiste à utiliser le contrôleur d'entrée de l'équilibreur de charge d'application AWS Application Load Balancer (ALB) pour Kubernetes sur Amazon EKS (version minimale 1.1.4).

Solution

Créer un exemple d'application

1.    Pour créer un exemple de déploiement NGINX, exécutez la commande suivante :

kubectl run nginx  --replicas=2 --labels='app=nginx' --image=nginx --port=80

2.    Pour vérifier que vos pods sont en cours d'exécution et ont leurs propres adresses IP internes, exécutez la commande suivante :

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

Le résultat ressemble à ce qui suit :

NAME                   STATUS   IP
nginx-ab1cdef23-45ghi  Running  10.1.3.202
nginx-ab1cdef23-45ghi  Running  10.1.3.150

Créer un service ClusterIP

1.    Créez un fichier nommé clusterip.yaml, puis définissez le type sur ClusterIP. Consultez l'exemple suivant :

cat <<EOF > clusterip.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
EOF

2.    Créez l'objet ClusterIP dans Kubernetes à l'aide d'une commande déclarative ou impérative.

Pour créer l'objet et appliquer le fichier clusterip.yaml, exécutez la commande déclarative suivante :

kubectl create -f clusterip.yaml

Vous recevez la sortie suivante :

service/nginx-service created

-ou-

Pour exposer un déploiement de type ClusterIP, exécutez la commande impérative suivante :

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

Vous recevez la sortie suivante :

service "nginx-service" exposed

Remarque : la commande exposée crée un service sans créer de fichier YAML. Toutefois, kubectl traduit votre commande impérative en un objet de déploiement Kubernetes déclaratif.

3.    Pour accéder à l'application et obtenir le numéro ClusterIP, exécutez la commande suivante :

kubectl get service nginx-service

Vous recevez la sortie suivante :

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx-service   ClusterIP   172.20.65.130   <none>        80/TCP    15s

Créer un service NodePort

1.    Pour créer un service NodePort, créez un fichier appelé nodeport.yaml, puis définissez le type sur NodePort. Consultez l'exemple suivant :

cat <<EOF > nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
EOF

2.    Pour supprimer le service ClusterIP et créer un service NodePort avec le même nom de service (nginx-service), exécutez la commande suivante :

kubectl delete service nginx-service

Vous recevez la sortie suivante :

service "nginx-service" deleted

3.    Créez l'objet NodePort dans Kubernetes à l'aide d'une commande déclarative ou impérative.

Pour créer l'objet et appliquer le fichier nodeport.yaml, exécutez la commande déclarative suivante :

kubectl create -f nodeport.yaml

-ou-

Pour exposer un déploiement de type NodePort exécutez la commande impérative suivante :

kubectl expose deployment nginx  --type=NodePort  --name=nginx-serviceservice "nginx-service" exposed

Vous recevez la sortie suivante :

service/nginx-service created

4.    Pour obtenir des informations sur nginx-service, exécutez la commande suivante :

kubectl get service/nginx-service

Vous recevez la sortie suivante :

NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   172.20.36.247   <none>        80:30648/TCP   11s

Remarque : le ServiceType est NodePort. ClusterIP est créé automatiquement et prend la voie du NodePort. Le service NodePort est exposé en externe sur les nœuds de travail disponibles sur le port 30648.

5.    Pour vérifier l'adresse IP publique du nœud, exécutez la commande suivante :

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

Vous recevez la sortie suivante :

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

Important : avant d'accéder à NodeIP:NodePort à partir d'un cluster externe, vous devez activer le groupe de sécurité des nœuds pour autoriser le trafic entrant via le port 30648.

Créer un service LoadBalancer

1.    Pour créer un service LoadBalancer, créez un fichier appelé loadbalancer.yaml, puis définissez le type de LoadBalancer. Consultez l'exemple suivant :

cat <<EOF > loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
EOF

2.    Pour supprimer le service ClusterIP et créer un service LoadBalancer avec le même nom de service (nginx-service), exécutez la commande suivante :

kubectl delete service nginx-service

Vous recevez la sortie suivante :

service "nginx-service" deleted

3.    Pour appliquer le fichier loadbalancer.yaml exécutez la commande suivante :

kubectl create -f loadbalancer.yaml

Vous recevez la sortie suivante :

service/nginx-service created

-ou-

Pour exposer un déploiement de type LoadBalancer, exécutez la commande impérative suivante :

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

Vous recevez la sortie suivante :

service "nginx-service" exposed

4.    Pour obtenir des informations sur nginx-service, exécutez la commande suivante :

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

Vous recevez la sortie suivante :

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

5.    Pour vérifier que vous pouvez accéder à l'équilibreur de charge en externe, exécutez la commande suivante :

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

Vous devriez recevoir le résultat suivant : <title>Welcome to nginx!</title>


Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?