Ir para o conteúdo

Como faço para usar Topology Aware Hints no Amazon EKS?

4 minuto de leitura
0

Quero usar Topology Aware Hints (TAH) no meu cluster do Amazon Elastic Kubernetes Service (Amazon EKS).

Resolução

Observação: O TAH pode não ser adequado para clusters que têm instâncias spot, escalamento automático de pods horizontais ou ajuste de escala automático do Amazon Elastic Compute Cloud (Amazon EC2) ativados. Ao usar essas configurações de cluster, não é possível obter uma alocação proporcional aos núcleos de CPU alocados aos nós. Você excede o limite de sobrecarga permitido. Além disso, se houver restrições de atribuição de pod que proíbam a redistribuição de endpoints, o kube-proxy não usará o TAH.

Pré-requisitos

Para usar o TAH no Amazon EKS, conclua as seguintes etapas:

  1. Crie um novo namespace:

    Observação: Substitua example-namespace pelo seu nome do 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. Use a imagem do BusyBox para criar uma implantação de amostra:

    Observação: Substitua example-deployment-name pelo seu nome de implantação e example-namespace pelo seu nome do 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. Exponha a implantação como um tipo de serviço ClusterIP e, em seguida, adicione service.kubernetes.io/topology-mode: auto como uma anotação:

    Observação: Substitua example-service-name pelo nome do seu serviço e example-namespace pelo seu nome do namespace. Na versão 1.27 ou posterior, a anotação service.kubernetes.io/topology-aware-hints: auto é alterada para 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. Verifique se os TAHs estão preenchidos no endpoint:

    Observação: Substitua example-namespace pelo seu nome do namespace e example-service-name pelo seu nome do serviço.

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

    Exemplo de saída:

    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. Implante um pod de teste para verificar se o tráfego é roteado para um pod na mesma Zona de disponibilidade.

    Observação: Substitua example-node-name pelo nome do seu nó.

    kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot --overrides='{"spec": { "nodeSelector": {"kubernetes.io/hostname":"example-node-name"}}}'
  6. Encontre o pod e o nó aos quais seu pod de teste se conecta:

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

    Exemplo de saída:

    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. Use PodName e NodeName da saída anterior para verificar se o tráfego está alinhado com a mesma Zona de disponibilidade em que seu pod de teste está implantado.

  8. Escale a implantação para quatro réplicas e, em seguida, inspecione os EndpointSlices:

    Observação: Substitua example-namespace pelo seu nome do namespace e example-deployment-name pelo seu nome de implantação.

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

    Observação: Uma implantação escalada para quatro réplicas resulta em pelo menos uma Zona de disponibilidade com uma proporção de 50% de endpoints. Além disso, o limite de sobrecarga de 20% é excedido e os TAHs não são usados para kube-proxy.

Informações relacionadas

Topology Aware Routing no site do Kubernetes

Exploring the effect of Topology Aware Hints on network traffic in Amazon Elastic Kubernetes Service (Explorando o efeito do Topology Aware Hints no tráfego de rede no Amazon Elastic Kubernetes Service)

AWS OFICIALAtualizada há um ano