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

Dernière mise à jour : 15/03/2021

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

Brève description

Pour exposer les services Kubernetes exécutés sur votre cluster, créez un exemple d'application. Ensuite, appliquez les types de services Kubernetes ClusterIP, NodePort et LoadBalancer à votre exemple d'application.

Gardez à l'esprit les points suivants :

  • ClusterIP expose le service sur l'adresse IP interne d'un cluster.
  • NodePort expose le service sur l'adresse IP de chaque nœud à un port statique.
  • LoadBalancer expose le service à l'extérieur à 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 d'instance Amazon Elastic Compute Cloud (Amazon EC2). Amazon EKS fournit ce support en utilisant LoadBalancer. Vous pouvez équilibrer la charge du trafic réseau vers un Network Load Balancer (instance ou cibles IP) ou un Classic Load Balancer (cible d'instance uniquement).

Résolution

Créer un exemple d'application

1.    Définissez et appliquez un fichier de déploiement. L'exemple suivant crée un ReplicaSet qui fait tourner deux pods nginx puis crée un fichier appelé 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.    Pour créer le déploiement, exécutez la commande suivante:

kubectl apply -f nginx-deployment.yaml

3.    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

File d'attente:

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

Créer un service ClusterIP

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

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

File d'attente:

service/nginx-service created

-ou-

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

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

File d'attente:

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

File d'attente:

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

4.    Pour supprimer le service ClusterIP , exécutez la commande suivante :

kubectl delete service nginx-service

File d'attente:

service "nginx-service" deleted

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. Par exemple:

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.    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-deployment  --type=NodePort  --name=nginx-serviceservice "nginx-service" exposed

File d'attente:

service/nginx-service created

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

kubectl get service/nginx-service

File d'attente:

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é à l’extérieur sur les nœuds de travail disponibles sur le port 30648.

4.    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

File d'attente:

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.

5.    Pour supprimer le service NodePort , exécutez la commande suivante :

kubectl delete service nginx-service

File d'attente:

service "nginx-service" deleted

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. Par exemple:

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 appliquer le fichier loadbalancer.yaml exécutez la commande suivante :

kubectl create -f loadbalancer.yaml

File d'attente:

service/nginx-service created

-ou-

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

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

File d'attente:

service "nginx-service" exposed

3.    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

File d'attente:

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

4.    Pour vérifier que vous pouvez accéder à l'équilibreur de charge extérieurement, exécutez la commande suivante :

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

Vous devriez recevoir la sortie suivante entre les balises de titre HTML: « Bienvenue dans nginx ! »

5.    Pour supprimer le service LoadBalancer, exécutez la commande suivante :

kubectl delete service nginx-service

File d'attente:

service "nginx-service" deleted

Remarque : Par défaut, le service LoadBalancer précédent crée un Classic Load Balancer.

Pour créer un Network Load Balancer avec une cible de type d'instance, ajoutez l'annotation suivante au manifeste de service:

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

Pour créer un Network Load Balancer avec des cibles IP, voir Équilibreur de charge — cibles IP.


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


Besoin d'aide pour une question technique ou de facturation ?