Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何在 Amazon EKS 中使用拓扑感知提示?
我想在我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中使用拓扑感知提示 (TAH)。
解决方案
**注意:**TAH 可能不适合开启了 Amazon Elastic Compute Cloud (Amazon EC2) 竞价型实例、Horizontal Pod Autoscaling 或自动扩缩的集群。当您使用这些集群配置时,将无法实现与分配给节点的 CPU 内核成比例的分配。您超过了允许的开销阈值。此外,如果存在禁止端点再分发的容器组分配限制,则 kube-proxy 不使用 TAH。
先决条件
- 确保您的 Amazon EKS 集群版本为 1.24 或更高版本。
- 设置 Amazon EKS 集群和包含三个节点的托管节点组。每个节点必须具有相同的 CPU 容量,并且必须分布在三个可用区中。
要在 Amazon EKS 中使用 TAH,请完成以下步骤:
-
创建新的命名空间:
**注意:**将 example-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
-
使用 BusyBox 映像创建示例部署:
**注意:**将 example-deployment-name 替换为您的部署名称,将 example-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: {}
-
将部署公开为 ClusterIP 服务类型,然后添加 service.kubernetes.io/topology-mode: auto 作为注释:
**注意:**将 example-service-name 替换为您的服务名称,将 example-namespace 替换为您的命名空间名称。在 1.27 或更高版本中,service.kubernetes.io/topology-aware-hints: auto 注释更改为 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
-
检查端点中是否填充了 TAH:
注意: 将 example-namespace 替换为您的命名空间名称,将 example-service-name 替换为您的服务名称。
kubectl get 'endpointslices.discovery.k8s.io' -l kubernetes.io/service-name=example-service-name -n example-namespace -o yaml
输出示例:
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
-
部署测试容器组以检查流量是否路由到同一可用区中的容器组。
**注意:**将 example-node-name 替换为您的节点名称。
kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot --overrides='{"spec": { "nodeSelector": {"kubernetes.io/hostname":"example-node-name"}}}'
-
找到您的测试容器组连接的容器组和节点:
curl example-service-name.example-namespace:80
输出示例:
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
-
使用前面输出中的 PodName 和 NodeName 检查流量是否与部署测试容器组的同一可用区一致。
-
将部署扩展到四个副本,然后检查 EndpointSlices:
**注意:**将 example-namespace 替换为您的命名空间名称,将 example-deployment-name 替换为您的部署名称。
kubectl -n example-namespace scale deployments example-deployment-name --replicas=4
**注意:**扩展到四个副本的部署会导致至少一个可用区的端点比例为 50%。此外,超过了 20% 的开销阈值,kube-proxy 不使用 TAH。
相关信息
Kubernetes 网站上的拓扑感知路由
