Saltar al contenido

¿Cómo utilizo Topology Aware Hints en Amazon EKS?

4 minutos de lectura
0

Quiero usar Topology Aware Hints (TAH) en mi clúster de Amazon Elastic Kubernetes Service (Amazon EKS).

Solución

Nota: Es posible que el TAH no sea adecuado para clústeres que tienen activadas instancias puntuales de Amazon Elastic Compute Cloud (Amazon EC2), el escalamiento automático de pods horizontales o el escalamiento automático. Cuando usa estas configuraciones de clúster, no puede obtener una asignación que sea proporcional a los núcleos de CPU asignados a los nodos. Supera el umbral de sobrecarga permitido. Además, si hay restricciones de asignación de pods que prohíben la redistribución de puntos de enlace, kube-proxy no usa TAH.

Requisitos previos

Para usar TAH en Amazon EKS, siga estos pasos:

  1. Cree un nuevo espacio de nombres:

    Nota: Sustituya example-namespace por el nombre del espacio de nombres.

    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. Use la imagen de BusyBox para crear un despliegue de muestra:

    Nota: Sustituya example-deployment-name por el nombre de su implementación y example-namespace por el nombre de su espacio de nombres.

    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. Exponga el despliegue como un tipo de servicio ClusterIP y, a continuación, agregue service.kubernetes.io/topology-mode: auto como anotación:

    Nota: Sustituya example-service-name por el nombre de su servicio y example-namespace por el nombre de su espacio de nombres. En la versión 1.27 o posterior, la anotación service.kubernetes.io/topology-aware-hints: auto se cambia a 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. Compruebe si los TAH se han completado en el punto de enlace:

    Nota: Sustituya example-namespace por el nombre de su espacio de nombres y example-service-name por el nombre de su servicio.

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

    Resultado de ejemplo:

    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. Implemente un pod de prueba para comprobar si el tráfico se dirige a un pod en la misma zona de disponibilidad.

    Nota: Sustituya example-node-name por el nombre de su nodo.

    kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot --overrides='{"spec": { "nodeSelector": {"kubernetes.io/hostname":"example-node-name"}}}'
  6. Busque el pod y el nodo a los que se conecta su pod de prueba:

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

    Resultado de ejemplo:

    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. Utilice PodName y NodeName del resultado anterior para comprobar si el tráfico se alinea con la misma zona de disponibilidad en la que está implementado el pod de prueba.

  8. Escale el despliegue a cuatro réplicas y, a continuación, inspeccione los valores EndpointSlices:

    Nota: Sustituya example-namespace por el nombre de su espacio de nombres y example-deployment-name por el nombre de su despliegue.

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

    Nota: Un despliegue que se escala a cuatro réplicas da como resultado al menos una zona de disponibilidad con una proporción del 50 % de puntos de enlace. Además, se supera el umbral de sobrecarga del 20 % y los TAH no se utilizan para kube-proxy.

Información relacionada

Topology Aware Routing en el sitio web de Kubernetes

Exploring the effect of Topology Aware Hints on network traffic in Amazon Elastic Kubernetes Service (Análisis del efecto de Topology Aware Hints en el tráfico de red en Amazon Elastic Kubernetes Service)

OFICIAL DE AWSActualizada hace un año