Passer au contenu

Comment utiliser les indicateurs de topologie dans Amazon EKS ?

Lecture de 4 minute(s)
0

Je souhaite utiliser Topology Aware Hints (TAH) dans mon cluster Amazon Elastic Kubernetes Service (Amazon EKS).

Résolution

Remarque : TAH peut ne pas convenir aux clusters sur lesquels les instances ponctuelles Amazon Elastic Compute Cloud (Amazon EC2), l’autoscaling horizontal du pod ou l’autoscaling sont activés. Lorsque vous utilisez ces configurations de cluster, vous ne pouvez pas obtenir une allocation proportionnelle aux cœurs de processeur alloués aux nœuds. Vous dépassez le seuil de frais généraux autorisé. De plus, s'il existe des contraintes d'attribution de pods qui interdisent la redistribution des points de terminaison, kube-proxy n'utilise pas TAH.

Prérequis

Pour utiliser TAH dans Amazon EKS, procédez comme suit :

  1. Créez un nouvel espace de noms :

    Remarque : Remplacez example-namespace par le nom de votre espace de noms.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: "example-namespace"
      labels:
        pod-security.kubernetes.io/audit: restricted
        pod-security.kubernetes.io/enforce: restricted
        pod-security.kubernetes.io/warn: restricted
  2. Utilisez l'image BusyBox pour créer un exemple de déploiement :

    Remarque : Remplacez example-deployment-name par le nom de votre déploiement et example-namespace par le nom de votre espace de noms.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example-deployment-name
      namespace: example-namespace
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          labels:
            app: demo
        spec:
          dnsPolicy: Default
          enableServiceLinks: false
          automountServiceAccountToken: false
          securityContext:
            seccompProfile:
              type: RuntimeDefault
            runAsNonRoot: true
            runAsUser: 1000
            runAsGroup: 1000
          containers:
            - name: busybox
              image: public.ecr.aws/docker/library/busybox:latest
              command: ["/bin/sh"]
              args:
                - "-c"
                - |
                  echo "<html><body><h1>PodName: $MY_POD_NAME  NodeName: $MY_NODE_NAME podIP:$MY_POD_IP</h1></body></html>" > /tmp/index.html;
                  while true; do
                    printf 'HTTP/1.1 200 OK\n\n%s\n' $(cat /tmp/index.html) | nc -l -p 8080
                  done
              ports:
                - containerPort: 8080
              env:
              - name: MY_NODE_NAME
                valueFrom:
                 fieldRef:
                  fieldPath: spec.nodeName
              - name: MY_POD_IP
                valueFrom:
                  fieldRef:
                    fieldPath: status.podIP
              - name: MY_POD_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              resources:
                limits:
                  memory: "128Mi"
                  cpu: "500m"
                requests:
                  memory: "64Mi"
                  cpu: "250m"
              securityContext:
                readOnlyRootFilesystem: true
                allowPrivilegeEscalation: false
                capabilities:
                  drop:
                    - ALL
              volumeMounts:
              - name: tmp
                mountPath: /tmp
          volumes:
            - name: tmp
              emptyDir: {}
  3. Exposez le déploiement en tant que type de service ClusterIP, puis ajoutez service.kubernetes.io/topology-mode: auto en tant qu'annotation :

    Remarque : Remplacez example-service-name par le nom de votre service et example-namespace par le nom de votre espace de noms. Dans la version 1.27 ou ultérieure, l'annotation service.kubernetes.io/topology-aware-hints: auto est remplacée par service.kubernetes.io/topology-mode: auto.

    apiVersion: v1
    kind: Service
    metadata:
      name: example-service-name
      namespace: example-namespace
      annotations:
       service.kubernetes.io/topology-mode: auto
    spec:
      selector:
        app: demo
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
  4. Vérifiez si les TAH sont renseignés dans le point de terminaison :

    Remarque : Remplacez example-namespace par le nom de votre espace de noms et example-service-name par le nom de votre service.

    kubectl get 'endpointslices.discovery.k8s.io' -l kubernetes.io/service-name=example-service-name -n example-namespace -o yaml

    Exemple de sortie :

    endpoints:
    - addresses:
      - 10.0.21.125
      conditions:
        ready: true
        serving: true
        terminating: false
      hints:
        forZones:
        - name: eu-west-1b
      nodeName: ip-10-0-17-215.eu-west-1.compute.internal
      targetRef:
        kind: Pod
        name: example-deployment-name-5875bbbb7c-m2j8t
        namespace: example-namespace
        uid: 4e789648-965e-4caa-91db-bd27d240ea59
      zone: eu-west-1b
  5. Déployez un module de test pour vérifier si le trafic est acheminé vers un espace situé dans la même zone de disponibilité.

    Remarque : Remplacez example-node-name par le nom de votre nœud.

    kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot --overrides='{"spec": { "nodeSelector": {"kubernetes.io/hostname":"example-node-name"}}}'
  6. Recherchez le module et le nœud auxquels votre module de test se connecte :

    curl example-service-name.example-namespace:80

    Exemple de sortie :

    PodName: 7b7b9bf455-c27z9  HTTP/1.1 200 OK
    NodeName: ip-10-0-9-45.eu-west-1.compute.internal
    HTTP/1.1 200 OK
    podIP: example-10.0.11.140
  7. Utilisez PodName et NodeName de la sortie précédente pour vérifier si le trafic s'aligne sur la même zone de disponibilité que celle dans laquelle votre module de test est déployé.

  8. Mettez à l’échelle le déploiement vers quatre réplicas, puis inspectez les EndpointSlices :

    Remarque : Remplacez example-namespace par le nom de votre espace de noms et example-deployment-name par le nom de votre déploiement.

    kubectl -n example-namespace scale deployments example-deployment-name --replicas=4

    Remarque : Un déploiement mis à l’échelle vers quatre réplicas entraîne la création d'au moins une zone de disponibilité présentant un ratio de points de terminaison de 50 %. De plus, le seuil de frais généraux de 20 % est dépassé et les TAH ne sont pas utilisés pour kube-proxy.

Informations connexes

Routage tenant compte de la topologie sur le site Web de Kubernetes

Exploration de l'effet des conseils tenant compte de la topologie sur le trafic réseau dans Amazon Elastic Kubernetes Service

AWS OFFICIELA mis à jour il y a un an