Salta al contenuto

Come posso utilizzare Topology Aware Hints in Amazon EKS?

4 minuti di lettura
0

Desidero utilizzare Topology Aware Hints (TAH) nel mio cluster Amazon Elastic Kubernetes Service (Amazon EKS).

Risoluzione

Nota: TAH potrebbe non essere adatto per i cluster con istanze spot Amazon Elastic Compute Cloud (Amazon EC2), il dimensionamento automatico orizzontale dei pod o il dimensionamento automatico attivati. Quando utilizzi queste configurazioni del cluster, non puoi ottenere un'allocazione proporzionale ai core della CPU allocati ai nodi. Superi la soglia massima consentita. Inoltre, se sono presenti vincoli di assegnazione dei pod che vietano la ridistribuzione degli endpoint, kube-proxy non utilizza TAH.

Prerequisiti

Per utilizzare TAH in Amazon EKS, completa i seguenti passaggi:

  1. Crea un nuovo namespace:

    Nota: sostituisci example-namespace con il nome del tuo namespace.

    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. Utilizza l'immagine BusyBox per creare un esempio di distribuzione:

    Nota: sostituisci example-deployment-name con il nome della tua distribuzione e example-namespace xon il nome del tuo namespace.

    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. Esponi la distribuzione come tipo di servizio ClusterIP, quindi aggiungi service.kubernetes.io/topology-mode: auto come annotazione:

    Nota: sostituisci example-service-name con il nome del tuo servizio e example-namespace con il nome del tuo namespace. Nella versione 1.27 o successiva, l'annotazione service.kubernetes.io/topology-aware-hints: auto viene sostituita da 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. Controlla se i TAH compaiono nell'endpoint:

    Nota: sostituisci example-namespace con il nome del tuo namespace e example-service-name con il nome del tuo servizio.

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

    Esempio di output:

    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. Distribuisci un pod di prova per verificare se il traffico viene indirizzato a un pod nella stessa zona di disponibilità.

    Nota: sostituisci example-node-name con il nome del tuo nodo.

    kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot --overrides='{"spec": { "nodeSelector": {"kubernetes.io/hostname":"example-node-name"}}}'
  6. Individua il pod e il nodo a cui si connette il pod di prova:

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

    Esempio di output:

    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. Utilizza PodName e NodeName dell'output precedente per verificare se il traffico è allineato con la stessa zona di disponibilità in cui è distribuito il pod di prova.

  8. Scala la distribuzione a quattro repliche, quindi ispeziona gli EndpointSlice:

    Nota: sostituisci example-namespace con il nome del tuo namespace e example-deployment-name con il nome della tua distribuzione.

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

    Nota: una distribuzione scalata a quattro repliche produce almeno una zona di disponibilità con un rapporto di endpoint del 50%. Inoltre, viene superata la soglia massima del 20% e i TAH non vengono utilizzati per kube-proxy.

Informazioni correlate

Topology Aware Routing sul sito web Kubernetes

Exploring the effect of Topology Aware Hints on network traffic in Amazon Elastic Kubernetes Service (Esplorazione dell'effetto dei Topology Aware Hints sul traffico di rete in Amazon Elastic Kubernetes Service)

AWS UFFICIALEAggiornata un anno fa