Comment puis-je exposer les services Kubernetes qui s'exécutent sur mon cluster Amazon EKS ?

Lecture de 7 minute(s)
0

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

Résolution

Pour exposer les services Kubernetes qui s'exécutent sur votre cluster, créez d'abord un exemple d'application. Puis, appliquez le type de service Kubernetes ClusterIP, NodePort ou LoadBalancer à votre exemple d'application. Pour plus d'informations, consultez la page Type de service sur le site Web de Kubernetes.

Créer un exemple d'application

Procédez comme suit :

  1. Définissez et appliquez un fichier de déploiement dans Kubernetes. L'exemple de commande suivant crée un fichier appelé nginx-deployment.yaml, puis crée un ReplicaSet qui fait tourner deux pods nginx :

    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 fonctionnent et possèdent 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

    Exemple de résultat :

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

Appliquer le type de service

Déterminez la manière dont vous souhaitez exposer votre application, puis appliquez le type de service approprié. Pour plus d'informations sur chaque type de service, consultez la page type : ClusterIP, type : NodePort et saisissez : LoadBalancer sur le site Web de Kubernetes.

Type de service ClusterIP

Procédez comme suit :

  1. Créez un fichier appelé clusterip.yaml.

  2. Définissez type sur ClusterIP comme indiqué dans l'exemple suivant :

    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
  3. Utilisez une commande déclarative ou impérative pour créer l'objet ClusterIP dans Kubernetes.
    Pour créer l'objet et appliquer le fichier clusterip.yaml, exécutez la commande déclarative suivante :

    kubectl create -f clusterip.yaml

    Exemple de résultat :

    service/nginx-service-cluster-ip created>/code>

    -ou-

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

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

    Remarque : La commande expose crée un service mais ne crée pas de fichier YAML. Cependant, kubectl traduit votre commande impérative en un objet de déploiement Kubernetes déclaratif.
    Exemple de résultat :

    service "nginx-service-cluster-ip" exposed
  4. Pour obtenir l'adresse CLUSTER-IP, exécutez la commande suivante :

    kubectl get service nginx-service-cluster-ip

    Exemple de résultat :

    NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    nginx-service-cluster-ip   ClusterIP   10.100.12.153   <none>        80/TCP    23s
  5. Pour utiliser l'adresse CLUSTER-IP afin d'accéder à l'application, exécutez la commande suivante :

    curl -silent 10.100.12.153:80 | grep title

    Remarque : Pour accéder au service, vous devez être connecté à un nœud de travail ou vous trouver dans le conteneur d'un pod.

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

    kubectl delete service nginx-service-cluster-ip

    Exemple de résultat :

    service "nginx-service-cluster-ip" deleted

Type de service NodePort

Procédez comme suit :

  1. Créez un fichier appelé nodeport.yaml.

  2. Définissez type sur NodePort comme indiqué dans l'exemple suivant :

    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
  3. Utilisez une commande déclarative ou impérative pour créer l'objet NodePort dans Kubernetes.
    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 du type NodePort, exécutez la commande impérative suivante :

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

    Exemple de résultat :

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

    kubectl get service/nginx-service-nodeport

    Exemple de résultat :

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

    **Important :**NodePort crée une adresse IP de service accessible dans le cluster et utilise le port spécifié pour exposer le service sur chaque nœud. La sortie de la commande précédente indique que le type de service NodePort est exposé en externe sur le port de l'instance Amazon Elastic Compute Cloud (Amazon EC2) du nœud de travail disponible. Avant d'accéder à NodeIP:NodePort depuis l'extérieur du cluster, définissez les groupes de sécurité des nœuds pour autoriser le trafic entrant via le port répertorié dans la sortie.

  5. Pour les nœuds situés dans un sous-réseau public et accessibles depuis Internet, vérifiez l'adresse IP publique du nœud :

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

    Exemple de résultat :

    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-

    Pour les nœuds qui se trouvent dans un sous-réseau privé et ne sont accessibles que via un cloud privé virtuel (VPC), vérifiez l'adresse IP privée du nœud :

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

    Exemple de résultat :

    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
  6. Pour utiliser l’Adresse du nœud et le NodePort afin d’accéder à l'application, exécutez la commande suivante :

    curl -silent <Public/PrivateNodeIP>:30994 | grep title
  7. Pour supprimer le service NodePort, exécutez la commande suivante :

    kubectl delete service nginx-service-nodeport

    Exemple de résultat :

    service "nginx-service-nodeport" deleted

Type de service LoadBalancer

Procédez comme suit :

  1. Créez un fichier appelé loadbalancer.yaml.

  2. Définissez type sur LoadBalancer comme indiqué dans l'exemple suivant :

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

    kubectl create -f loadbalancer.yaml

    Exemple de résultat :

    service/nginx-service-loadbalancer created

    -ou-

    Pour exposer un déploiement du type LoadBalancer, exécutez la commande suivante :

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

    Exemple de résultat :

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

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

    Exemple de résultat :

    NAME                        TYPE          EXTERNAL-IP                        PORT(S)
    nginx-service-loadbalancer  LoadBalancer  *****.eu-west-1.elb.amazonaws.com  80:30039/TCP
  5. Pour vérifier que vous pouvez accéder à l'équilibreur de charge de l'extérieur, exécutez la commande suivante :

    curl -silent *****.eu-west-1.elb.amazonaws.com:80 | grep title
  6. Pour supprimer le service LoadBalancer, exécutez la commande suivante :

    kubectl delete service nginx-service-loadbalancer

    Exemple de résultat :

    service "nginx-service-loadbalancer" deleted

Remarque : Par défaut, le type de service LoadBalancer crée un Classic Load Balancer.

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

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

-ou-

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