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

Date de la dernière mise à jour : 21/04/2021

Je souhaite 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.    Créez le déploiement :

kubectl apply -f nginx-deployment.yaml

3.    Vérifiez que vos pods sont en cours d'exécution et disposent de leurs propres adresses IP internes :

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

Sortie :

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-cluster-ip
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-cluster-ip 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-cluster-ip

File d'attente:

service "nginx-service-cluster-ip" 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.    Accédez à l'application et obtenez le numéro ClusterIP :

kubectl get service nginx-service-cluster-ip

Sortie :

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

4.    Supprimez le service ClusterIP :

kubectl delete service nginx-service-cluster-ip

Sortie :

service "nginx-service-cluster-ip" 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-nodeport
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-service-nodeport

File d'attente:

service/nginx-service-nodeport exposed

3.    Obtenez les informations du nginx service :

kubectl get service/nginx-service-nodeport

Sortie :

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

Important : le ServiceType est un NodePort et un ClusterIP qui sont créés automatiquement pour le service. La sortie de la commande précédente indique que le service NodePort est exposé en externe sur le port (30994) de l'instance EC2 du nœud de travail disponible. Avant d'accéder à NodeIP:NodePort à partir d'un cluster externe, vous devez définir le groupe de sécurité des nœuds pour autoriser le trafic entrant. Vous pouvez autoriser le trafic entrant via le port (30994) répertorié dans la sortie de la commande kubectl get service précédente.

4.    Si le nœud se trouve dans un sous-réseau public et est accessible à partir d'Internet, vérifiez l'adresse IP publique du nœud :

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

Sortie :

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

-ou-

Si le nœud se trouve dans un sous-réseau privé et n'est accessible qu'à l'intérieur ou via un VPC, vérifiez l'adresse IP privée du nœud :

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

Sortie :

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.     Supprimez le service NodePort :

kubectl delete service nginx-service-nodeport

Sortie :

service "nginx-service-nodeport" 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-loadbalancer
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
EOF

2.    Appliquez le fichier loadbalancer.yaml :

kubectl create -f loadbalancer.yaml

Sortie :

service/nginx-service-loadbalancer created

-ou-

Exposez un déploiement de type LoadBalancer :

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

Sortie :

service "nginx-service-loadbalancer" exposed

3.    Obtenez les informations du nginx service :

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

Sortie :

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

4.    Vérifiez que vous pouvez accéder à l'équilibreur de charge en externe :

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.    Supprimez le service LoadBalancer :

kubectl delete service nginx-service-loadbalancer

Sortie :

service "nginx-service-loadbalancer" deleted

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

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

-ou-

Pour créer un Network Load Balancer avec des cibles IP, déployez AWS Load Balancer Controller, puis créez un équilibreur de charge qui utilise des cibles IP.


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


Avez-vous besoin d'aide pour une question technique ou de facturation ?